On 06/22/2017 09:28 AM, Alan Modra wrote:
> PR80044 notes that -static and -pie together behave differently when
> gcc is configured with --enable-default-pie as compared to configuring
> without (or --disable-default-pie).  This patch removes that
> difference.  In both cases you now will have -static completely
> overriding -pie.
> 
> Fixing this wasn't quite as simple as you'd expect, due to poor
> separation of functionality.  PIE_SPEC didn't just mean that -pie was
> on explicitly or by default, but also -r and -shared were *not* on.
> Fortunately the three files touched by this patch are the only places
> PIE_SPEC and NO_PIE_SPEC are used, so it isn't too hard to see that
> the reason PIE_SPEC and NO_PIE_SPEC are not inverses is the use of
> PIE_SPEC in LINK_PIE_SPEC.  So, move the inelegant symmetry breaking
> addition, to LINK_PIE_SPEC where it belongs.  Doing that showed
> another problem in gnu-user.h, with PIE_SPEC and NO_PIE_SPEC selection
> of crtbegin*.o not properly hooked into a chain of if .. elseif ..
> conditions, which required both PIE_SPEC and NO_PIE_SPEC to exclude
> -static and -shared.  Fixing that particular problem finally allows
> PIE_SPEC to serve just one purpose, and NO_PIE_SPEC to disappear.
> 
> Bootstrapped and regression tested powerpc64le-linux c,c++.  No
> regressions and a bunch of --enable-default-pie failures squashed.
> OK mainline and active branches?
> 
> Incidentally, there is a fairly strong case to be made for adding
> -static to the -shared, -pie, -no-pie chain of RejectNegative's in
> common.opt.  Since git 0d6378a9e (svn r48039) 2001-11-15, -static has
> done more than just the traditional "prevent linking with dynamic
> libraries", as -static selects crtbeginT.o rather than crtbegin.o
> on GNU systems.  Realizing this is what led me to close pr80044, which
> I'd opened with the aim of making -pie -static work together (with the
> traditional meaning of -static).  I don't that is worth doing, but
> mention pr80044 in the changelog due to fixing the insane output
> produced by -pie -static with --disable-default-pie.
> 
>       PR driver/80044
>       PR target/81170
>       * gcc.c (NO_PIE_SPEC): Delete.
>       (PIE_SPEC): Define as !no-pie/pie.  Move static|shared|r exclusion..
>       (LINK_PIE_SPEC): ..to here.
>       * config/gnu-user.h (GNU_USER_TARGET_STARTFILE_SPEC): Correct
>       chain of crtbegin*.o selection, update for PIE_SPEC changes and format.
>       (GNU_USER_TARGET_ENDFILE_SPEC): Similarly.
>       * config/sol2.h (STARTFILE_CRTBEGIN_SPEC): Similarly.
>       (ENDFILE_CRTEND_SPEC): Similarly.
>       * config/rs6000/sysv4.h (STARTFILE_LINUX_SPEC): Upgrade to
>       match gnu-user.h startfile.
>       (ENDFILE_LINUX_SPEC): Similarly.
So sorry for the horrible delay.  What was the final resolution here?  I
saw a lot of back and forth with HJ and yourself.  80044 is
CLOSED/WONTFIX and 81170 has a patch attached to it, but is still in the
ASSIGNED state.

jeff

Reply via email to