Message ID | 20170808221841.GA16793@gmail.com |
---|---|
State | New |
Headers | show |
On August 9, 2017 12:18:41 AM GMT+02:00, "H.J. Lu" <hongjiu.lu@intel.com> wrote: >This patch adds -static-pie to GCC driver to create static PIE. A >static >position independent executable (PIE) is similar to static executable, >but can be loaded at any address without a dynamic linker. All linker >input files must be compiled with -fpie or -fPIE and linker must >support >--no-dynamic-linker to avoid linking with dynamic linker. "-z text" is >also needed to prevent dynamic relocations in read-only segments. > >OK for trunk? What's wrong with -static -pie? >H.J. >--- > PR driver/81498 > * common.opt (-static-pie): New alias. > (shared): Negate static-pie. > (static-pie): New option. > * config/gnu-user.h (GNU_USER_TARGET_STARTFILE_SPEC): Add > -static-pie support. > (GNU_USER_TARGET_ENDFILE_SPEC): Likewise. > (LINK_EH_SPEC): Likewise. > (LINK_GCC_C_SEQUENCE_SPEC): Likewise. > * config/i386/gnu-user.h (GNU_USER_TARGET_LINK_SPEC): Likewise. > * config/i386/gnu-user64.h (GNU_USER_TARGET_LINK_SPEC): Likewise. > * gcc.c (LINK_COMMAND_SPEC): Likewise. > (init_gcc_specs): Likewise. > (init_spec): Likewise. > * doc/invoke.texi: Document -static-pie. >--- > gcc/common.opt | 9 ++++++++- > gcc/config/gnu-user.h | 15 ++++++++------- > gcc/config/i386/gnu-user.h | 7 ++++--- > gcc/config/i386/gnu-user64.h | 11 ++++++----- > gcc/doc/invoke.texi | 11 ++++++++++- > gcc/gcc.c | 17 ++++++++++------- > 6 files changed, 46 insertions(+), 24 deletions(-) > >diff --git a/gcc/common.opt b/gcc/common.opt >index 1cb1c83d306..246566168cc 100644 >--- a/gcc/common.opt >+++ b/gcc/common.opt >@@ -353,6 +353,9 @@ Common Alias(pedantic-errors) > -pie > Driver Alias(pie) > >+-static-pie >+Driver Alias(static-pie) >+ > -pipe > Driver Alias(pipe) > >@@ -3062,7 +3065,7 @@ x > Driver Joined Separate > > shared >-Driver RejectNegative Negative(pie) >+Driver RejectNegative Negative(static-pie) > Create a shared library. > > shared-libgcc >@@ -3114,6 +3117,10 @@ pie > Driver RejectNegative Negative(no-pie) > Create a position independent executable. > >+static-pie >+Driver RejectNegative Negative(pie) >+Create a static position independent executable. >+ > z > Driver Joined Separate > >diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h >index de605b0c466..a967b69a350 100644 >--- a/gcc/config/gnu-user.h >+++ b/gcc/config/gnu-user.h >@@ -53,11 +53,11 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > "%{shared:; \ > pg|p|profile:gcrt1.o%s; \ > static:crt1.o%s; \ >- " PIE_SPEC ":Scrt1.o%s; \ >+ static-pie|" PIE_SPEC ":Scrt1.o%s; \ > :crt1.o%s} \ > crti.o%s \ > %{static:crtbeginT.o%s; \ >- shared|" PIE_SPEC ":crtbeginS.o%s; \ >+ shared|static-pie|" PIE_SPEC ":crtbeginS.o%s; \ > :crtbegin.o%s} \ > %{fvtable-verify=none:%s; \ > fvtable-verify=preinit:vtv_start_preinit.o%s; \ >@@ -70,7 +70,7 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > :crt1.o%s} \ > crti.o%s \ > %{static:crtbeginT.o%s; \ >- shared|pie:crtbeginS.o%s; \ >+ shared|pie|static-pie:crtbeginS.o%s; \ > :crtbegin.o%s} \ > %{fvtable-verify=none:%s; \ > fvtable-verify=preinit:vtv_start_preinit.o%s; \ >@@ -92,7 +92,7 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > fvtable-verify=preinit:vtv_end_preinit.o%s; \ > fvtable-verify=std:vtv_end.o%s} \ > %{static:crtend.o%s; \ >- shared|" PIE_SPEC ":crtendS.o%s; \ >+ shared|static-pie|" PIE_SPEC ":crtendS.o%s; \ > :crtend.o%s} \ > crtn.o%s \ > " CRTOFFLOADEND >@@ -102,7 +102,7 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > fvtable-verify=preinit:vtv_end_preinit.o%s; \ > fvtable-verify=std:vtv_end.o%s} \ > %{static:crtend.o%s; \ >- shared|pie:crtendS.o%s; \ >+ shared|pie|static-pie:crtendS.o%s; \ > :crtend.o%s} \ > crtn.o%s \ > " CRTOFFLOADEND >@@ -132,12 +132,13 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC > > #if defined(HAVE_LD_EH_FRAME_HDR) >-#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " >+#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " > #endif > > #undef LINK_GCC_C_SEQUENCE_SPEC > #define LINK_GCC_C_SEQUENCE_SPEC \ >- "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" >+ "%{static|static-pie:--start-group} %G %L \ >+ %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}" > > /* Use --as-needed -lgcc_s for eh support. */ > #ifdef HAVE_LD_AS_NEEDED >diff --git a/gcc/config/i386/gnu-user.h b/gcc/config/i386/gnu-user.h >index a4c88f1a848..8983dc9ecd7 100644 >--- a/gcc/config/i386/gnu-user.h >+++ b/gcc/config/i386/gnu-user.h >@@ -77,9 +77,10 @@ along with GCC; see the file COPYING3. If not see >#define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) >%{shared:-shared} \ > %{!shared: \ > %{!static: \ >- %{rdynamic:-export-dynamic} \ >- -dynamic-linker %(dynamic_linker)} \ >- %{static:-static}}" >+ %{!static-pie: \ >+ %{rdynamic:-export-dynamic} \ >+ -dynamic-linker %(dynamic_linker)}} \ >+ %{static:-static} %{static-pie:-static -pie --no-dynamic-linker >-z text}}" > > #undef LINK_SPEC > #define LINK_SPEC GNU_USER_TARGET_LINK_SPEC >diff --git a/gcc/config/i386/gnu-user64.h >b/gcc/config/i386/gnu-user64.h >index 39f5ef6a68b..6fc9eae6f6b 100644 >--- a/gcc/config/i386/gnu-user64.h >+++ b/gcc/config/i386/gnu-user64.h >@@ -59,11 +59,12 @@ see the files COPYING3 and COPYING.RUNTIME >respectively. If not, see > %{shared:-shared} \ > %{!shared: \ > %{!static: \ >- %{rdynamic:-export-dynamic} \ >- %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \ >- %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ >- %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}} >\ >- %{static:-static}}" >+ %{!static-static: \ >+ %{rdynamic:-export-dynamic} \ >+ %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \ >+ %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ >+ %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}}} \ >+ %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z >text}}" > > #undef LINK_SPEC > #define LINK_SPEC GNU_USER_TARGET_LINK_SPEC >diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi >index cc0f5a00a4f..322bde9178f 100644 >--- a/gcc/doc/invoke.texi >+++ b/gcc/doc/invoke.texi >@@ -496,7 +496,7 @@ Objective-C and Objective-C++ Dialects}. > @xref{Link Options,,Options for Linking}. >@gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} >-l@var{library} @gol >-nostartfiles -nodefaultlibs -nostdlib -pie -pthread -rdynamic >@gol >--s -static -static-libgcc -static-libstdc++ @gol >+-s -static -static-pie -static-libgcc -static-libstdc++ @gol >-static-libasan -static-libtsan -static-liblsan -static-libubsan >@gol > -static-libmpx -static-libmpxwrappers @gol > -shared -shared-libgcc -symbolic @gol >@@ -11780,6 +11780,15 @@ or model suboptions) when you specify this >linker option. > @opindex no-pie > Don't produce a position independent executable. > >+@item -static-pie >+@opindex static-pie >+Produce a static position independent executable on targets that >support >+it. A static position independent executable is similar to static >+executable, but can be loaded at any address without a dynamic linker. >+For predictable results, you must also specify the same set of options >+used for compilation (@option{-fpie}, @option{-fPIE}, or model >+suboptions) when you specify this linker option. >+ > @item -pthread > @opindex pthread > Link with the POSIX threads library. This option is supported on >diff --git a/gcc/gcc.c b/gcc/gcc.c >index 987eff55aa6..1b60d59726e 100644 >--- a/gcc/gcc.c >+++ b/gcc/gcc.c >@@ -1015,9 +1015,10 @@ proper position among the other output files. >*/ > #endif > > /* -u* was put back because both BSD and SysV seem to support it. */ >-/* %{static|no-pie:} simply prevents an error message: >+/* %{static|no-pie|static-pie:} simply prevents an error message: > 1. If the target machine doesn't handle -static. > 2. If PIE isn't enabled by default. >+ 3. If the target machine doesn't handle -static-pie. > */ >/* We want %{T*} after %{L*} and %D so that it can be used to specify >linker > scripts which exist in user specified directories, or in standard >@@ -1035,7 +1036,7 @@ proper position among the other output files. */ > "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \ > "%X %{o*} %{e*} %{N} %{n} %{r}\ > %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \ >- %{static|no-pie:} %{L*} %(mfwrap) %(link_libgcc) " \ >+ %{static|no-pie|static-pie:} %{L*} %(mfwrap) %(link_libgcc) " \ > VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o " CHKP_SPEC " \ > %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\ > %:include(libgomp.spec)%(link_gomp)}\ >@@ -1670,17 +1671,19 @@ init_gcc_specs (struct obstack *obstack, const >char *shared_name, > { > char *buf; > >- buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, >"}" >- "%{!static:%{!static-libgcc:" > #if USE_LD_AS_NEEDED >+ buf = concat ("%{static|static-libgcc|static-pie:", static_name, " >", eh_name, "}" >+ "%{!static:%{!static-libgcc:%{!static-pie:" > "%{!shared-libgcc:", > static_name, " " LD_AS_NEEDED_OPTION " ", > shared_name, " " LD_NO_AS_NEEDED_OPTION > "}" > "%{shared-libgcc:", > shared_name, "%{!shared: ", static_name, "}" >- "}" >+ "}}" > #else >+ buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, >"}" >+ "%{!static:%{!static-libgcc:" > "%{!shared:" > "%{!shared-libgcc:", static_name, " ", eh_name, "}" > "%{shared-libgcc:", shared_name, " ", static_name, "}" >@@ -1788,8 +1791,8 @@ init_spec (void) > "-lgcc_eh" > #ifdef USE_LIBUNWIND_EXCEPTIONS > # ifdef HAVE_LD_STATIC_DYNAMIC >- " %{!static:" LD_STATIC_OPTION "} -lunwind" >- " %{!static:" LD_DYNAMIC_OPTION "}" >+ " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind" >+ " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}" > # else > " -lunwind" > # endif
On Tue, Aug 8, 2017 at 10:36 PM, Richard Biener <richard.guenther@gmail.com> wrote: > On August 9, 2017 12:18:41 AM GMT+02:00, "H.J. Lu" <hongjiu.lu@intel.com> wrote: >>This patch adds -static-pie to GCC driver to create static PIE. A >>static >>position independent executable (PIE) is similar to static executable, >>but can be loaded at any address without a dynamic linker. All linker >>input files must be compiled with -fpie or -fPIE and linker must >>support >>--no-dynamic-linker to avoid linking with dynamic linker. "-z text" is >>also needed to prevent dynamic relocations in read-only segments. >> >>OK for trunk? > > What's wrong with -static -pie? > -static -pie behaved differently depending on if --enable-default-pie was used: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81523 I just checked in a patch to make -static always override -pie.
On Tue, 8 Aug 2017, H.J. Lu wrote: > This patch adds -static-pie to GCC driver to create static PIE. A static > position independent executable (PIE) is similar to static executable, > but can be loaded at any address without a dynamic linker. All linker > input files must be compiled with -fpie or -fPIE and linker must support > --no-dynamic-linker to avoid linking with dynamic linker. "-z text" is > also needed to prevent dynamic relocations in read-only segments. > > OK for trunk? I think the documentation for various options needs updating to clarify exactly what they mean. (And potentially help text, which for driver options is in gcc.c:display_help with the common.opt text being ignored in that case.) -static is no longer just "prevents linking with the shared libraries" as the documentation says, given it's also overriding (explicit or configure-time default) -pie. -pie is no longer just "Produce a position independent executable", it's producing a *dynamically linked* PIE. > +@item -static-pie > +@opindex static-pie > +Produce a static position independent executable on targets that support > +it. A static position independent executable is similar to static > +executable, but can be loaded at any address without a dynamic linker. "to a static executable".
On Mon, Aug 28, 2017 at 9:10 AM, Joseph Myers <joseph@codesourcery.com> wrote: > On Tue, 8 Aug 2017, H.J. Lu wrote: > >> This patch adds -static-pie to GCC driver to create static PIE. A static >> position independent executable (PIE) is similar to static executable, >> but can be loaded at any address without a dynamic linker. All linker >> input files must be compiled with -fpie or -fPIE and linker must support >> --no-dynamic-linker to avoid linking with dynamic linker. "-z text" is >> also needed to prevent dynamic relocations in read-only segments. >> >> OK for trunk? > > I think the documentation for various options needs updating to clarify > exactly what they mean. (And potentially help text, which for driver > options is in gcc.c:display_help with the common.opt text being ignored in > that case.) Done. > -static is no longer just "prevents linking with the shared libraries" as > the documentation says, given it's also overriding (explicit or > configure-time default) -pie. -pie is no longer just "Produce a position > independent executable", it's producing a *dynamically linked* PIE. Done. >> +@item -static-pie >> +@opindex static-pie >> +Produce a static position independent executable on targets that support >> +it. A static position independent executable is similar to static >> +executable, but can be loaded at any address without a dynamic linker. > > "to a static executable". > Done. Here is the updated patch. OK for trunk? Thanks.
On Mon, 28 Aug 2017, H.J. Lu wrote:
> Here is the updated patch. OK for trunk?
OK.
On Tue, 2017-09-12 at 16:20 +0000, Joseph Myers wrote: > On Mon, 28 Aug 2017, H.J. Lu wrote: > > > Here is the updated patch. OK for trunk? > > OK. This seems to be causing an issue for me on powerpc: /home/sawdey/src/gcc/trunk/build/./prev-gcc/xg++ -B/home/sawdey/src/gcc/trunk/build/./prev-gcc/ -B/home/sawdey/install/gcc/trunk_str/powerpc64le-unknown-linux-gnu/bin/ -nostdinc++ -B/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs -B/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -I/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/include/powerpc64le-unknown-linux-gnu -I/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/include -I/home/sawdey/src/gcc/trunk/trunk/libstdc++-v3/libsupc++ -L/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs -L/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -c -g -O2 -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror -fno-common -DHAVE_CONFIG_H -DGENERATOR_FILE -fno-PIE -I. -Ibuild -I../../trunk/gcc -I../../trunk/gcc/build -I../../trunk/gcc/../include -I../../trunk/gcc/../libcpp/include \ -o build/gencheck.o ../../trunk/gcc/gencheck.c In file included from ./tm.h:30:0, from ../../trunk/gcc/gencheck.c:23: ../../trunk/gcc/config/rs6000/sysv4.h:819:0: error: "LINK_EH_SPEC" redefined [-Werror] # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " In file included from ./tm.h:28:0, from ../../trunk/gcc/gencheck.c:23: ../../trunk/gcc/config/gnu-user.h:135:0: note: this is the location of the previous definition #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " I don't see the problem on 252033. Thanks, Aaron
On Tue, Sep 12, 2017 at 11:48 AM, Aaron Sawdey <acsawdey@linux.vnet.ibm.com> wrote: > On Tue, 2017-09-12 at 16:20 +0000, Joseph Myers wrote: >> On Mon, 28 Aug 2017, H.J. Lu wrote: >> >> > Here is the updated patch. OK for trunk? >> >> OK. > > This seems to be causing an issue for me on powerpc: > > /home/sawdey/src/gcc/trunk/build/./prev-gcc/xg++ -B/home/sawdey/src/gcc/trunk/build/./prev-gcc/ -B/home/sawdey/install/gcc/trunk_str/powerpc64le-unknown-linux-gnu/bin/ -nostdinc++ -B/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs -B/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -I/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/include/powerpc64le-unknown-linux-gnu -I/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/include -I/home/sawdey/src/gcc/trunk/trunk/libstdc++-v3/libsupc++ -L/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/src/.libs -L/home/sawdey/src/gcc/trunk/build/prev-powerpc64le-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -c -g -O2 -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror -fno-common -DHAVE_CONFIG_H -DGENERATOR_FILE -fno-PIE -I. -Ibuild -I../../trunk/gcc -I../../trunk/gcc/build -I../../trunk/gcc/../include -I../../trunk/gcc/../libcpp/include \ > -o build/gencheck.o ../../trunk/gcc/gencheck.c > In file included from ./tm.h:30:0, > from ../../trunk/gcc/gencheck.c:23: > ../../trunk/gcc/config/rs6000/sysv4.h:819:0: error: "LINK_EH_SPEC" redefined [-Werror] > # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > > In file included from ./tm.h:28:0, > from ../../trunk/gcc/gencheck.c:23: > ../../trunk/gcc/config/gnu-user.h:135:0: note: this is the location of the previous definition > #define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " > > I don't see the problem on 252033. > There are several problems in rs6000/sysv4.h: 1. It doesn't undef LINK_EH_SPEC before define it. 2. It shouldn't define it for Linux since it has been defined in gnu-user.h. You didn't see the problem since there were the same before my patch. Can you not define LINK_EH_SPEC for Linux targets?
On 2017.09.12 at 13:48 -0500, Aaron Sawdey wrote: > On Tue, 2017-09-12 at 16:20 +0000, Joseph Myers wrote: > > On Mon, 28 Aug 2017, H.J. Lu wrote: > > > > > Here is the updated patch. OK for trunk? > > > > OK. > > This seems to be causing an issue for me on powerpc: > > ../../trunk/gcc/config/rs6000/sysv4.h:819:0: error: "LINK_EH_SPEC" redefined [-Werror] > # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " It will cause problems on other platforms as well: gcc/config/alpha/elf.h:171:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/alpha/vms.h:209:#define LINK_EH_SPEC "vms-dwarf2eh.o%s " gcc/config/dragonfly.h:64:#define LINK_EH_SPEC "--eh-frame-hdr" gcc/config/freebsd.h:48:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/gnu-user.h:135:#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " gcc/config/netbsd.h:128:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/openbsd.h:139:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/powerpcspe/sysv4.h:808:# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/rs6000/sysv4.h:819:# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " gcc/config/sol2.h:375:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
On Wed, Sep 13, 2017 at 08:57:39AM +0200, Markus Trippelsdorf wrote: > On 2017.09.12 at 13:48 -0500, Aaron Sawdey wrote: > > On Tue, 2017-09-12 at 16:20 +0000, Joseph Myers wrote: > > > On Mon, 28 Aug 2017, H.J. Lu wrote: > > > > > > > Here is the updated patch. OK for trunk? > > > > > > OK. > > > > This seems to be causing an issue for me on powerpc: > > > > ../../trunk/gcc/config/rs6000/sysv4.h:819:0: error: "LINK_EH_SPEC" redefined [-Werror] > > # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > > It will cause problems on other platforms as well: > > gcc/config/alpha/elf.h:171:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/alpha/vms.h:209:#define LINK_EH_SPEC "vms-dwarf2eh.o%s " > gcc/config/dragonfly.h:64:#define LINK_EH_SPEC "--eh-frame-hdr" > gcc/config/freebsd.h:48:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/gnu-user.h:135:#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " > gcc/config/netbsd.h:128:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/openbsd.h:139:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/powerpcspe/sysv4.h:808:# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/rs6000/sysv4.h:819:# define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " > gcc/config/sol2.h:375:#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " Most of these aren't including gnu-user.h and then the other header. It is only rs6000/sysv4.h and powerpcspe/sysv4.h where gnu-user.h is (sometimes, which is why you can't remove it from there altogether) included first, and alpha/elf.h where gnu-user.h is not included, yet it is a linux target where you probably want to handle it similarly. Although, perhaps -static-pie should be supported by other ELF targets like Solaris, NetBSD, OpenBSD, FreeBSD and therefore the other LINK_EH_SPEC that have !static:--eh-frame-hdr should be tweaked too. I'd say the urgent thing is to patch rs6000/sysv4.h to match the new gnu-user.h definition. Reorganizing headers so that for linux and hurd it is solely gnu-user.h that defines this kind of macros is lots of work. Jakub
diff --git a/gcc/common.opt b/gcc/common.opt index 1cb1c83d306..246566168cc 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -353,6 +353,9 @@ Common Alias(pedantic-errors) -pie Driver Alias(pie) +-static-pie +Driver Alias(static-pie) + -pipe Driver Alias(pipe) @@ -3062,7 +3065,7 @@ x Driver Joined Separate shared -Driver RejectNegative Negative(pie) +Driver RejectNegative Negative(static-pie) Create a shared library. shared-libgcc @@ -3114,6 +3117,10 @@ pie Driver RejectNegative Negative(no-pie) Create a position independent executable. +static-pie +Driver RejectNegative Negative(pie) +Create a static position independent executable. + z Driver Joined Separate diff --git a/gcc/config/gnu-user.h b/gcc/config/gnu-user.h index de605b0c466..a967b69a350 100644 --- a/gcc/config/gnu-user.h +++ b/gcc/config/gnu-user.h @@ -53,11 +53,11 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see "%{shared:; \ pg|p|profile:gcrt1.o%s; \ static:crt1.o%s; \ - " PIE_SPEC ":Scrt1.o%s; \ + static-pie|" PIE_SPEC ":Scrt1.o%s; \ :crt1.o%s} \ crti.o%s \ %{static:crtbeginT.o%s; \ - shared|" PIE_SPEC ":crtbeginS.o%s; \ + shared|static-pie|" PIE_SPEC ":crtbeginS.o%s; \ :crtbegin.o%s} \ %{fvtable-verify=none:%s; \ fvtable-verify=preinit:vtv_start_preinit.o%s; \ @@ -70,7 +70,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see :crt1.o%s} \ crti.o%s \ %{static:crtbeginT.o%s; \ - shared|pie:crtbeginS.o%s; \ + shared|pie|static-pie:crtbeginS.o%s; \ :crtbegin.o%s} \ %{fvtable-verify=none:%s; \ fvtable-verify=preinit:vtv_start_preinit.o%s; \ @@ -92,7 +92,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see fvtable-verify=preinit:vtv_end_preinit.o%s; \ fvtable-verify=std:vtv_end.o%s} \ %{static:crtend.o%s; \ - shared|" PIE_SPEC ":crtendS.o%s; \ + shared|static-pie|" PIE_SPEC ":crtendS.o%s; \ :crtend.o%s} \ crtn.o%s \ " CRTOFFLOADEND @@ -102,7 +102,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see fvtable-verify=preinit:vtv_end_preinit.o%s; \ fvtable-verify=std:vtv_end.o%s} \ %{static:crtend.o%s; \ - shared|pie:crtendS.o%s; \ + shared|pie|static-pie:crtendS.o%s; \ :crtend.o%s} \ crtn.o%s \ " CRTOFFLOADEND @@ -132,12 +132,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define LIB_SPEC GNU_USER_TARGET_LIB_SPEC #if defined(HAVE_LD_EH_FRAME_HDR) -#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " +#define LINK_EH_SPEC "%{!static|static-pie:--eh-frame-hdr} " #endif #undef LINK_GCC_C_SEQUENCE_SPEC #define LINK_GCC_C_SEQUENCE_SPEC \ - "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" + "%{static|static-pie:--start-group} %G %L \ + %{static|static-pie:--end-group}%{!static:%{!static-pie:%G}}" /* Use --as-needed -lgcc_s for eh support. */ #ifdef HAVE_LD_AS_NEEDED diff --git a/gcc/config/i386/gnu-user.h b/gcc/config/i386/gnu-user.h index a4c88f1a848..8983dc9ecd7 100644 --- a/gcc/config/i386/gnu-user.h +++ b/gcc/config/i386/gnu-user.h @@ -77,9 +77,10 @@ along with GCC; see the file COPYING3. If not see #define GNU_USER_TARGET_LINK_SPEC "-m %(link_emulation) %{shared:-shared} \ %{!shared: \ %{!static: \ - %{rdynamic:-export-dynamic} \ - -dynamic-linker %(dynamic_linker)} \ - %{static:-static}}" + %{!static-pie: \ + %{rdynamic:-export-dynamic} \ + -dynamic-linker %(dynamic_linker)}} \ + %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}" #undef LINK_SPEC #define LINK_SPEC GNU_USER_TARGET_LINK_SPEC diff --git a/gcc/config/i386/gnu-user64.h b/gcc/config/i386/gnu-user64.h index 39f5ef6a68b..6fc9eae6f6b 100644 --- a/gcc/config/i386/gnu-user64.h +++ b/gcc/config/i386/gnu-user64.h @@ -59,11 +59,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see %{shared:-shared} \ %{!shared: \ %{!static: \ - %{rdynamic:-export-dynamic} \ - %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \ - %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ - %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}} \ - %{static:-static}}" + %{!static-static: \ + %{rdynamic:-export-dynamic} \ + %{" SPEC_32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER32 "} \ + %{" SPEC_64 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKER64 "} \ + %{" SPEC_X32 ":-dynamic-linker " GNU_USER_DYNAMIC_LINKERX32 "}}} \ + %{static:-static} %{static-pie:-static -pie --no-dynamic-linker -z text}}" #undef LINK_SPEC #define LINK_SPEC GNU_USER_TARGET_LINK_SPEC diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index cc0f5a00a4f..322bde9178f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -496,7 +496,7 @@ Objective-C and Objective-C++ Dialects}. @xref{Link Options,,Options for Linking}. @gccoptlist{@var{object-file-name} -fuse-ld=@var{linker} -l@var{library} @gol -nostartfiles -nodefaultlibs -nostdlib -pie -pthread -rdynamic @gol --s -static -static-libgcc -static-libstdc++ @gol +-s -static -static-pie -static-libgcc -static-libstdc++ @gol -static-libasan -static-libtsan -static-liblsan -static-libubsan @gol -static-libmpx -static-libmpxwrappers @gol -shared -shared-libgcc -symbolic @gol @@ -11780,6 +11780,15 @@ or model suboptions) when you specify this linker option. @opindex no-pie Don't produce a position independent executable. +@item -static-pie +@opindex static-pie +Produce a static position independent executable on targets that support +it. A static position independent executable is similar to static +executable, but can be loaded at any address without a dynamic linker. +For predictable results, you must also specify the same set of options +used for compilation (@option{-fpie}, @option{-fPIE}, or model +suboptions) when you specify this linker option. + @item -pthread @opindex pthread Link with the POSIX threads library. This option is supported on diff --git a/gcc/gcc.c b/gcc/gcc.c index 987eff55aa6..1b60d59726e 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -1015,9 +1015,10 @@ proper position among the other output files. */ #endif /* -u* was put back because both BSD and SysV seem to support it. */ -/* %{static|no-pie:} simply prevents an error message: +/* %{static|no-pie|static-pie:} simply prevents an error message: 1. If the target machine doesn't handle -static. 2. If PIE isn't enabled by default. + 3. If the target machine doesn't handle -static-pie. */ /* We want %{T*} after %{L*} and %D so that it can be used to specify linker scripts which exist in user specified directories, or in standard @@ -1035,7 +1036,7 @@ proper position among the other output files. */ "%{fuse-ld=*:-fuse-ld=%*} " LINK_COMPRESS_DEBUG_SPEC \ "%X %{o*} %{e*} %{N} %{n} %{r}\ %{s} %{t} %{u*} %{z} %{Z} %{!nostdlib:%{!nostartfiles:%S}} \ - %{static|no-pie:} %{L*} %(mfwrap) %(link_libgcc) " \ + %{static|no-pie|static-pie:} %{L*} %(mfwrap) %(link_libgcc) " \ VTABLE_VERIFICATION_SPEC " " SANITIZER_EARLY_SPEC " %o " CHKP_SPEC " \ %{fopenacc|fopenmp|%:gt(%{ftree-parallelize-loops=*:%*} 1):\ %:include(libgomp.spec)%(link_gomp)}\ @@ -1670,17 +1671,19 @@ init_gcc_specs (struct obstack *obstack, const char *shared_name, { char *buf; - buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}" - "%{!static:%{!static-libgcc:" #if USE_LD_AS_NEEDED + buf = concat ("%{static|static-libgcc|static-pie:", static_name, " ", eh_name, "}" + "%{!static:%{!static-libgcc:%{!static-pie:" "%{!shared-libgcc:", static_name, " " LD_AS_NEEDED_OPTION " ", shared_name, " " LD_NO_AS_NEEDED_OPTION "}" "%{shared-libgcc:", shared_name, "%{!shared: ", static_name, "}" - "}" + "}}" #else + buf = concat ("%{static|static-libgcc:", static_name, " ", eh_name, "}" + "%{!static:%{!static-libgcc:" "%{!shared:" "%{!shared-libgcc:", static_name, " ", eh_name, "}" "%{shared-libgcc:", shared_name, " ", static_name, "}" @@ -1788,8 +1791,8 @@ init_spec (void) "-lgcc_eh" #ifdef USE_LIBUNWIND_EXCEPTIONS # ifdef HAVE_LD_STATIC_DYNAMIC - " %{!static:" LD_STATIC_OPTION "} -lunwind" - " %{!static:" LD_DYNAMIC_OPTION "}" + " %{!static:%{!static-pie:" LD_STATIC_OPTION "}} -lunwind" + " %{!static:%{!static-pie:" LD_DYNAMIC_OPTION "}}" # else " -lunwind" # endif