This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
powepc64le gold linking problem
- From: Jay Foad <jay dot foad at gmail dot com>
- To: binutils at sourceware dot org, amodra at gmail dot com
- Date: Mon, 24 Nov 2014 11:02:41 +0000
- Subject: powepc64le gold linking problem
- Authentication-results: sourceware.org; auth=none
Hi,
I'm trying to investigate a problem with gold on powerpc64le linux. I
have a large test program which I can link and run successfully with
ld.bfd, but if I link with ld.gold the test segfaults in a plt stub
because r2 is not set up correctly. I have tracked it down to a call
to _ZN7testing8internal2RED1Ev, where it looks like r2 was not set up
correctly.
The calling code looks like:
2cc: 01 00 00 48 bl 2cc
<_ZN45AddressSanitizer_InternalSimpleDeathTest_Test8TestBodyEv+0x2cc>
2cc: R_PPC64_REL24 _ZN7testing8internal2RED1Ev
The callee, in a different module, has:
0000000000000000 g F .text._ZN7testing8internal2RED2Ev
0000000000000080 _ZN7testing8internal2RED1Ev
0000000000000000 g F .text._ZN7testing8internal2RED2Ev
0000000000000080 0x60 _ZN7testing8internal2RED2Ev
Disassembly of section .text._ZN7testing8internal2RED2Ev:
0000000000000000 <_ZN7testing8internal2RED1Ev>:
0: 00 00 4c 3c addis r2,r12,0
0: R_PPC64_REL16_HA .TOC.
4: 00 00 42 38 addi r2,r2,0
4: R_PPC64_REL16_LO .TOC.+0x4
8: a6 02 08 7c mflr r0
c: f8 ff e1 fb std r31,-8(r1)
...
After linking with gold, I can see that the call is a bl directly to
the global entry point, which is wrong, isn't it?
000000001002de34 g F .text 0000000000000080
_ZN7testing8internal2RED1Ev
000000001002de34 g F .text 0000000000000080 0x60
_ZN7testing8internal2RED2Ev
...
000000001002de34 <_ZN7testing8internal2RED1Ev>:
1002de34: 13 00 4c 3c addis r2,r12,19
1002de38: 84 aa 42 38 addi r2,r2,-21884
1002de3c: a6 02 08 7c mflr r0
1002de40: f8 ff e1 fb std r31,-8(r1)
...
100425f8: 3d b8 fe 4b bl 1002de34 <_ZN7testing8internal2RED1Ev>
It seems a bit suspicious that there are two symbols
(_ZN7testing8internal2RED1Ev and _ZN7testing8internal2RED2Ev) with the
same address, but only one of them has st_other set to indicate that
the local entry point is two instructions past the global antry point.
Any ideas? I'm happy to provide a repro but it's currently 32 MB of .o
files (will that fit in bugzilla?).
Thanks!
Jay.