Hello, Could please someone advice is it a bug or a feature when we get both bodies of the functions with the same name in the executable once multiple symbol definitions are allowed? Here is the example showing the behavior:
$ cat main.c int f() {return 6;} int main() { return f();} $ cat a.c int f() {return 4;} $ gcc -c a.c main.c $ gcc -Wl,--allow-multiple-definition a.o main.o # From objdump we can see that the bodies of both functions "f" end up in the executable: $ objdump -d a.out 00000000004004f6 <f>: 4004f6: 55 push %rbp 4004f7: 48 89 e5 mov %rsp,%rbp 4004fa: b8 04 00 00 00 mov $0x4,%eax 4004ff: 5d pop %rbp 400500: c3 retq 400501: 55 push %rbp 400502: 48 89 e5 mov %rsp,%rbp 400505: b8 06 00 00 00 mov $0x6,%eax 40050a: 5d pop %rbp 40050b: c3 retq # The behavior is more or less as specified in the documentation with only the first definition executed: $ ./a.out $ echo $? 4 $ In my (more complex) setup I saw issues coming from this behavior since not only we get the second definition but the relocations needed by it. Just in case some more information on my setup (though the behavior is the same on one more Linux host and the issue looks to be there on more recent ld also): $ gcc --version gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) $ ld --version GNU ld version 2.25-9.fc22 Best regards, Pavel
_______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils