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

Reply via email to