Created attachment 10957 [details] Archive with code to reproduce this issue. Example code // main.c ------------------- void _start() {} void DEFAULT_HANDLER() { *((int*)0x10) = 5; } // foo.c -------------------- __attribute__((weak)) void DEFAULT_HANDLER() { *((int*)0x10) = 1; } __attribute__((weak, alias("DEFAULT_HANDLER"))) void HARD_FAULT(); __attribute__((weak, alias("DEFAULT_HANDLER"))) void BUS_FAULT(); void (*VECTORS[])() = { HARD_FAULT, BUS_FAULT, }; // compile with --------------- gcc -Os -o main.o -c main.c gcc -Os -o foo.o -c foo.c ld main.o foo.o objdump -d -j .text -j .data a.out > dump.txt // ---------------- VECTORS array points to a weak function instead of a strong function defined in main.c
Hi Vadzim, > VECTORS array points to a weak function instead of a strong function defined > in main.c I think that this is a bug in your test code. You should be using the weakref attribute here, rather than the weak and alias attributes. IE: static __attribute__((weakref ("DEFAULT_HANDLER"))) void HARD_FAULT (); and similarly for BUS_FAULT. Cheers Nick
Hello Nick, Thank you for suggestion, I've tried weakref, and does help with the case I have posted above, but it still doesn't do exactly what I need. Here is updated code: // main.c ------------------- void _start() {} void DEFAULT_HANDLER() { *((int*)0x10) = 5; } void BUS_FAULT() { *((int*)0x10) = 7; } // foo.c -------------------- __attribute__((weak)) void DEFAULT_HANDLER() { *((int*)0x10) = 1; } static __attribute__((weakref ("DEFAULT_HANDLER"))) void HARD_FAULT(); static __attribute__((weakref ("DEFAULT_HANDLER"))) void BUS_FAULT(); void (*VECTORS[])() = { HARD_FAULT, BUS_FAULT, }; // ---------------------- In this new example I have created a strong symbols for both default handler and for one of specific handlers. I expect that VECTORS table would contain pointers to functions 5 and 7, but in practice it contains pointers to 5 and 5. This is not what I need, unfortunately. Regards, Vadzim
Not a linker bug, and original reporter has probably figured out what is wrong with his code by now. In an case, asking binutils developers how to use gcc features via a bug report is not appropriate.