$ cat simpleif.c #include <stdio.h> extern unsigned int debug_enabled_abc; int main(int argc, char** argv) { if (debug_enabled_abc) printf("Hello World!\n"); return 0; } $ cat simple-debug.c unsigned int debug_enabled_abc = 1; $gcc -c simpleif.c -o simpleif.o -g -O3 -fPIC -fomit-frame-pointer -march=nocona $gcc -c simple-debug.c -o simple-debug.o -g -O3 -fPIC -fomit-frame-pointer -march=nocona $gcc simpleif.o simple-debug.o -o test -O3 -g -fPIC -fomit-frame-pointer -march=nocona $objdump -d test | grep '<main>' -A10 00000000004004e8 <main>: 4004e8: 48 83 ec 08 sub $0x8,%rsp 4004ec: 48 8b 05 8d 03 20 00 mov 0x20038d(%rip),%rax # 600880 <_DYNAMIC+0x1a8> 4004f3: 8b 00 mov (%rax),%eax 4004f5: 85 c0 test %eax,%eax 4004f7: 74 0c je 400505 <main+0x1d> 4004f9: 48 8d 3d f8 00 00 00 lea 0xf8(%rip),%rdi # 4005f8 <_IO_stdin_used+0x4> 400500: e8 0b ff ff ff callq 400410 <[EMAIL PROTECTED]> 400505: 31 c0 xor %eax,%eax 400507: 48 83 c4 08 add $0x8,%rsp 40050b: c3 retq
Notice the 4004ec loads an 8 byte value, when it is specified as int. $ gcc -c simpleif.c -o simpleif.o -g -O3 -fomit-frame-pointer -march=nocona $ gcc simpleif.o simple-debug.o -o test -O3 -g -fPIC -fomit-frame-pointer -march=nocona $ objdump -d test | grep '<main>' -A10 0000000000400498 <main>: 400498: 48 83 ec 08 sub $0x8,%rsp 40049c: 8b 05 e6 03 20 00 mov 0x2003e6(%rip),%eax # 600888 <debug_enabled_abc> 4004a2: 85 c0 test %eax,%eax 4004a4: 74 0a je 4004b0 <main+0x18> 4004a6: bf a8 05 40 00 mov $0x4005a8,%edi 4004ab: e8 10 ff ff ff callq 4003c0 <[EMAIL PROTECTED]> 4004b0: 31 c0 xor %eax,%eax 4004b2: 48 83 c4 08 add $0x8,%rsp 4004b6: c3 retq 4004b7: 90 nop -- Summary: Sub optimal code generated in -fPIC mode Product: gcc Version: 4.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: davh at davh dot dk GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34593