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
[email protected]
https://lists.gnu.org/mailman/listinfo/bug-binutils