public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Cary Coutant <ccoutant@google.com>
To: Roland McGrath <roland@hack.frob.com>
Cc: "Ian Lance Taylor" <iant@google.com>,
	"Alan Modra" <amodra@gmail.com>,
	"GNU C. Library" <libc-alpha@sourceware.org>,
	Binutils <binutils@sourceware.org>,
	"Rafael Ávila de Espíndola" <rafael.espindola@gmail.com>
Subject: Re: gold vs libc
Date: Thu, 11 Sep 2014 16:00:00 -0000	[thread overview]
Message-ID: <CAHACq4rBr76jL+qo7Va03Ewv7PkLfrJA+_tewn7ZnMTpxBO+ug@mail.gmail.com> (raw)
In-Reply-To: <20140910225238.0B6362C39CF@topped-with-meat.com>

> In https://sourceware.org/ml/libc-alpha/2014-03/msg01012.html
> I said:
>
>     IMHO it would be acceptable to simply disable .eh_frame optimization when
>     there are any symbols in input .eh_frame sections that will survive to
>     affect the output of anything except the .eh_frame output section's
>     contents.  (That tortured wording is to distinguish __EH_FRAME_BEGIN__,
>     whose value is used by relocs in other sections like .text, from the
>     various .L* symbols used within individual input sections that are only
>     used in arithmetic producing values inside the section.)  What's not
>     acceptable is breaking the core semantics of linking that would apply if
>     nobody had ever thought of .eh_frame optimization.

As hard as that is to describe, it seems like it would be fragile.

> and also, in response to the cited suggestion from Ian:
>
>     > The current code has a simple algorithm that usually produces the
>     > result we want: we simply copy .eh_frame sections until we find one we
>     > can optimize.  Perhaps we could change to a different algorithm: put
>     > all unoptimized .eh_frame sections first, then all optimized .eh_frame
>     > sections.
>
>     In the concrete scenario, that would violate the abstract principles I
>     described but would deliver an even better practical result.  The empty
>     .eh_frame section (and its __EH_FRAME_BEGIN__ symbol) from crtbeginT.o
>     count as "unoptimized", while the .eh_frame content from crt1.o could count
>     as "optimized".  So it would place the emptiness and __EH_FRAME_BEGIN__
>     first, and everything else (including crt1.o's contributions) after, even
>     though crt1.o appears before crtbeginT.o in the link.
>
>     I think either this or disabling the optimization entirely are acceptable
>     resolutions to the bug.
>
> I think that when Ian said, "we've identified a fix," he was referring to,
> "put all unoptimized .eh_frame sections first, then all optimized .eh_frame
> sections."

That solution will end up putting the unoptimized end-bracket section
from crtend.o before the optimized contents. I've already fixed a bug
where --sort-section made that happen. Sure, that could be fixed, but
only by piling on another special case.

What we really want to do is put the optimized sections in between the
two bracketing sections. Identifying those bracketing sections is the
challenge.

>> If the .eh_frame data in crt1.o really does need to come before
>> __EH_FRAME_BEGIN__, another thing you could do is simply make it so
>> gold treats it as non-optimizable. Adding a null relocation to the
>> first word of the section should do it; inserting a zero-length entry
>> anywhere but the end would do it (if that doesn't have adverse affects
>> elsewhere).
>
> It doesn't need to and in fact it's undesireable that it do so.  That is
> one reason in favor of Ian's suggestion: though it doesn't adhere to any
> clear abstract principle I can see, as a pragmatic solution to the actual
> case in point, it magically makes something even better in practice than
> the status quo ante (ante as in before switching linkers) long before a fix
> for the underlying wrongness (in GCC's link order) will be available.
> OTOH, it certainly seems like it has more risk of unintended consequences
> we aren't now able to predict than does simply disabling optimization.

So that's an argument against just turning off the optimization.

>> Since the problem comes from an optimizations that knows what
>> .eh_frame is, maybe it could learn that __EH_FRAME_BEGIN__ and
>> __EH_FRAME_END__ are special symbols marking the start and end of the
>> section?
>
> I think that would be acceptable too.  It would have the same benefits of
> "magically fixing" the crt1/crtbegin ordering snafu, but it seems much
> simpler and thus it seems that predicting possible downsides would be
> easier (I haven't thought of any).

I don't like the idea of checking for specific symbol name to give
special treatment to a section. I wouldn't mind simply making
__EH_FRAME_BEGIN__ and __EH_FRAME_END__ linker-defined symbols that
would override any definitions found in the object files.

I could also special case by filename -- check
is_in_system_directory(), and if true, check the filename to see if it
contains "begin" or "end".

I think I'd prefer to do the first. We have precedent for providing
linker-defined bracketing symbols -- not for having them override any
definitions already present, but I don't think that's a big problem in
this case. It's also simple, and lets us preserve the simple rule of
putting the linker-generated contents in the place of the first
optimized section.

BTW, my copy of crtend.o doesn't define __EH_FRAME_END__. It does
define __FRAME_END, but it's a local symbol. Having the linker provide
__EH_FRAME_END__ would be consistent, and shouldn't break anything.
With this proposal, __FRAME_END would get the right value anyway.
(Until, that is, someone comes along with another crtend-like file and
decides it needs CFI as well!)

-cary

  parent reply	other threads:[~2014-09-11 16:00 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-30  4:25 Roland McGrath
2014-03-30  4:56 ` Alan Modra
2014-03-30  5:09   ` Roland McGrath
2014-03-31 19:03     ` Ian Lance Taylor
2014-03-31 20:04       ` Roland McGrath
2014-03-31 20:53         ` Ian Lance Taylor
2014-03-31 21:40           ` Roland McGrath
2014-04-01 18:25             ` Ian Lance Taylor
2014-09-10 20:56               ` Cary Coutant
2014-09-10 22:05                 ` Rafael Espíndola
2014-09-11  0:32                   ` Alan Modra
2014-09-10 22:52                 ` Roland McGrath
2014-09-11  0:04                   ` Ian Lance Taylor
2014-12-20 13:58                     ` PATCH: PR gold/14675: No eh_frame info registered in exception_static_test H.J. Lu
2014-12-22 17:37                       ` Cary Coutant
2014-12-22 22:40                         ` H.J. Lu
2014-12-23  0:58                           ` H.J. Lu
2015-01-07 13:17                         ` H.J. Lu
2015-01-07 14:43                           ` H.J. Lu
2015-01-07 18:50                             ` Cary Coutant
2015-01-26 17:22                               ` H.J. Lu
2015-03-02 16:03                                 ` H.J. Lu
2015-03-09 17:16                                   ` Cary Coutant
2015-03-09 17:22                                     ` H.J. Lu
2015-03-20 15:41                                     ` H.J. Lu
2014-09-11 16:00                   ` Cary Coutant [this message]
2014-09-11 16:05                     ` gold vs libc Cary Coutant
2014-09-11 16:45                       ` Rafael Espíndola
2014-09-11 16:21                     ` Ian Lance Taylor
2014-09-11 18:33                     ` Roland McGrath
2014-03-30 18:28 ` Carlos O'Donell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAHACq4rBr76jL+qo7Va03Ewv7PkLfrJA+_tewn7ZnMTpxBO+ug@mail.gmail.com \
    --to=ccoutant@google.com \
    --cc=amodra@gmail.com \
    --cc=binutils@sourceware.org \
    --cc=iant@google.com \
    --cc=libc-alpha@sourceware.org \
    --cc=rafael.espindola@gmail.com \
    --cc=roland@hack.frob.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).