Here is the objdump -dr bin/autoboot.o output we want (using the glibc weak alias technique):
20e: e8 fc ff ff ff call 20f <netboot+0xe2> 20f: R_386_PC32 printf 213: 89 f0 mov %esi,%eax 215: e8 fc ff ff ff call 216 <netboot+0xe9> 216: R_386_PC32 pxe_menu_boot Notice that pxe_menu_boot is a relocation because at this point the toolchain doesn't know whether or not to use the weak symbol yet. Here is the broken objdump -dr bin/autoboot.o output we currently have in gpxe.git: 00000000 <pxe_menu_boot>: 0: b8 fd 1f fc c3 mov $0xc3fc1ffd,%eax 5: c3 ret [...] 20d: e8 fc ff ff ff call 20e <netboot+0xe1> 20e: R_386_PC32 printf 212: bf fd 1f fc c3 mov $0xc3fc1ffd,%edi The compiler has inlined pxe_menu_boot, there is no relocation! Here is what readelf -a bin/autoboot.o says about the broken autoboot.o: Num: Value Size Type Bind Vis Ndx Name 23: 00000000 6 FUNC WEAK HIDDEN 1 pxe_menu_boot I don't see anything particularly interesting in this readelf output but I put it here for completeness. So it seems that gcc inlined the function when it shouldn't have. Here is what happens when CFLAGS += -Os is changed to CFLAGS += -O in Makefile.housekeeping: 2ad: e8 fc ff ff ff call 2ae <netboot+0xf0> 2ae: R_386_PC32 printf 2b2: 89 f0 mov %esi,%eax 2b4: e8 fc ff ff ff call 2b5 <netboot+0xf7> 2b5: R_386_PC32 pxe_menu_boot Suddenly there is a relocation for pxe_menu_boot again! Compiler bug or do we not understand __attribute__ ((weak)) properly? The plot thickens... Stefan _______________________________________________ gPXE-devel mailing list gPXE-devel@etherboot.org http://etherboot.org/mailman/listinfo/gpxe-devel