Created attachment 26419 [details] gcc -v -save-temps output There seems to be an issue in respect to the _mm_setzero_si128() intrinsic in <emmintrin.h> using the following __m128i xmm0 = _mm_setzero_si128(); causes a segmentation fault. GDB reports the following Program received signal SIGSEGV, Segmentation fault. 0x0000000000400631 in _mm_setzero_si128 () at /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/include/emmintrin.h:734 734 return __extension__ (__m128i)(__v4si){ 0, 0, 0, 0 }; The bug seems to dissapear when optimization levels 1,2,3 are used. The compiler flags I'm using: -Wall -nostdlib -std=c99 -fno-builtin -ffreestanding -pedantic-errors GCC version and specs are below: gcc -v: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /build/src/gcc-4.6-20111223/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --enable-gnu-unique-object --enable-linker-build-id --with-ppl --enable-cloog-backend=isl --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --enable-multilib --disable-libssp --disable-libstdcxx-pch --enable-checking=release --with-fpmath=sse Thread model: posix gcc version 4.6.2 20111223 (prerelease) (GCC) uname -a: Linux (graphitemaster) 3.1.9-2-ARCH #1 SMP PREEMPT Sat Jan 14 09:11:37 CET 2012 x86_64 AMD Phenom(tm) AuthenticAMD GNU/Linux attached is the gcc -v -save-temps output
Created attachment 26420 [details] Test case This is a working test case which will cause the segmentation fault.
Created attachment 26421 [details] objdump -d (dissasembly) This is a dissasembly of the generated assembly from the following testcase. There seems to be nothing out of the ordinary that could be causing the segmentation fault.
This is a bug in how your _start does not realign the stack to 16 byte aligned. movdqa %xmm0, -32(%rbp) movdqa -32(%rbp), %xmm0 movdqa %xmm0, -16(%rbp) rbp 0x7fffffffe388 0x7fffffffe388 rsp 0x7fffffffe388 0x7fffffffe388
(In reply to comment #3) > This is a bug in how your _start does not realign the stack to 16 byte aligned. > movdqa %xmm0, -32(%rbp) > movdqa -32(%rbp), %xmm0 > movdqa %xmm0, -16(%rbp) > > rbp 0x7fffffffe388 0x7fffffffe388 > rsp 0x7fffffffe388 0x7fffffffe388 Interesting, even with alignment it crashes however: while ((((intptr_t)data)&15)) data++; What exactly should be aligned the const char * for kill()? I'm unsure to what you mean in regards to realigning the stack for _just _start.
void _start() { main(); } isn't properly aligning the stack for the ABI GCC assumes. Simply drop it.