This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] Always define referenced __start_SECNAME/__stop_SECNAME
On Mon, Jun 12, 2017 at 07:10:47PM -0700, H.J. Lu wrote:
> On Mon, Jun 12, 2017 at 6:54 PM, Alan Modra <amodra@gmail.com> wrote:
> > On Mon, Jun 12, 2017 at 05:18:58PM -0700, H.J. Lu wrote:
> >> On Mon, Jun 12, 2017 at 4:32 PM, Alan Modra <amodra@gmail.com> wrote:
> >> > On Sat, Jun 10, 2017 at 03:46:49PM -0700, H.J. Lu wrote:
> >> >> This patch changes linker to always define referenced __start_SECNAME and
> >> >> __stop_SECNAME if the input section name is the same output section name,
> >> >> which is always true for orphaned sections, and SECNAME is a C identifier.
> >> >
> >> > I think this change is reasonable.
> >> >
> >> >> Also __start_SECNAME and __stop_SECNAME symbols are marked as hidden by
> >> >> ELF linker.
> >> >
> >> > Why is this necessary? Also, you make another change in behaviour
> >>
> >> It is to make sure that __start_SECNAME and __stop_SECNAME
> >> symbols for section SECNAME in different modules are unique.
> >
> > I understand, and it would have been good if these symbols were
> > defined that way in the beginning, but they weren't. I'm concerned
> > that if you make this change as well we will find some code that
> > relies on the symbols being dynamic.
>
> My change fixes a real bug:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=20022
Really, your change is a workaround not a fix. You avoid exporting
__start or __stop symbols because doing so shows a problem with gc. A
real fix for the PR would make ld do the right thing even in the
presense of exported dynamic symbols.
> We can suggest workarounds if some codes depend on that.
>
> >>
> >> > that you don't mention: __start and __stop symbols were previously
> >> > defined by ld -Ur, not just at final link. You'll need to modify
> >>
> >> Is there a testcase for this behavior?
> >
> > Not that I'm aware of.
> >
>
> >From ld manual:
>
> '-Ur'
> For anything other than C++ programs, this option is equivalent to
> '-r': it generates relocatable output--i.e., an output file that
> can in turn serve as input to 'ld'. When linking C++ programs,
> '-Ur' _does_ resolve references to constructors, unlike '-r'. It
> does not work to use '-Ur' on files that were themselves linked
> with '-Ur'; once the constructor table has been built, it cannot be
> added to. Use '-Ur' only for the last partial link, and '-r' for
> the others.
>
> It isn't intended for __start_SECNAME and __stop_SECNAME. Check
> config.build_constructors for __start_SECNAME and __stop_SECNAME
> was introduced by:
>
> commit 71bfc0aef6964c54b8e29466e97fb246cdeb2049
> Author: Alan Modra <amodra@gmail.com>
> Date: Thu Sep 7 07:08:58 2000 +0000
>
> Fix list handling for orphan section output statements.
That's a long time ago. Prior to that patch, ld defined __start and
__stop symbols for ld -r, which can lead to unexpected results for the
unwary. I can't remember, but I suspect I changed ld to define the
symbols for -Ur so that people who wanted the previous ld -r behaviour
for __start and __stop could get that by using ld -Ur.
--
Alan Modra
Australia Development Lab, IBM