--as-needed change wrt undefined weak symbols
H.J. Lu
hjl.tools@gmail.com
Thu Apr 4 23:11:00 GMT 2013
On Thu, Apr 4, 2013 at 3:39 PM, Alan Modra <amodra@gmail.com> wrote:
> On Thu, Apr 04, 2013 at 10:15:58AM -0700, H.J. Lu wrote:
>> On Sun, Mar 17, 2013 at 7:41 PM, Alan Modra <amodra@gmail.com> wrote:
>> > PR ld/12549
>> > elflink.c (elf_link_add_object_symbols): Exclude weak refs when
>> > considering whether an --as-needed library is needed.
>>
>> Just for the record, this patch may change the behavior of
>> the resulting executables for
>>
>> extern void bar () __attribute__((weak));
>>
>> if (bar)
>> bar ();
>>
>> if bar is defined in the DT_NEEDED library. Binutils 2.22
>> will resolve bar and add a DT_NEEDED entry. The new
>> linker will resolve bar to 0. We will see if it causes any
>> problems.
>
> Your testcase in http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56431
> shows that gold resolves bar to zero, but on powerpc and powerpc64 ld
> keeps bar dynamic.
>
> Hmm, I see x86_64 ld resolves bar to 0. Isn't this just an x86_64
> backend ld bug?
For executable:
0000000000000000 <main>:
0: b8 00 00 00 00 mov $0x0,%eax 1: R_X86_64_32 bar
5: 48 85 c0 test %rax,%rax
8: 74 18 je 22 <main+0x22>
a: 48 83 ec 08 sub $0x8,%rsp
e: b8 00 00 00 00 mov $0x0,%eax
13: e8 00 00 00 00 callq 18 <main+0x18> 14: R_X86_64_PC32 bar-0x4
18: b8 00 00 00 00 mov $0x0,%eax
1d: 48 83 c4 08 add $0x8,%rsp
21: c3 retq
22: b8 00 00 00 00 mov $0x0,%eax
27: c3 retq
It is resolved to either 0, if it is undefined, or its PLT entry, if
it is defined. Once it is resolved to 0 at link-time, change to
defined at run-time won't affect executable. If it is resolved
to defined at link-time, change it to undefined at run-time
will lead to seg-fault.
If the executable is compiled with PIC/PIE, it works
fine.
--
H.J.
More information about the Binutils
mailing list