Replece LDFLAGS-* = $(no-pie-ldflag) with tst-*-no-pie = yes [BZ #22630]
Commit Message
After
commit 9d7a3741c9e59eba87fb3ca6b9f979befce07826
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Fri Dec 15 16:59:33 2017 -0800
Add --enable-static-pie configure option to build static PIE [BZ #19574]
and
commit 00c714df398b63934540d95ce3792596f7a94a6c
Author: H.J. Lu <hjl.tools@gmail.com>
Date: Mon Dec 18 12:24:26 2017 -0800
Pass -no-pie to GCC only if GCC defaults to PIE [BZ #22614]
$(no-pie-ldflag) is no longer effective since no-pie-ldflag is defined
to -no-pie only if GCC defaults to PIE. When --enable-static-pie is
used to configure glibc build and GCC doesn't default to PIE. no-pie-ldflag
is undefined and these tests:
elf/Makefile:LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
elf/Makefile:LDFLAGS-tst-prelink = $(no-pie-ldflag)
elf/Makefile:LDFLAGS-tst-main1 = $(no-pie-ldflag)
gmon/Makefile:LDFLAGS-tst-gmon := $(no-pie-ldflag)
may fail to link. This patch replaces "-pie" with
$(if $($(@F)-no-pie),$(no-pie-ldflag),-pie)
and repleces
LDFLAGS-* = $(no-pie-ldflag)
with
tst-*-no-pie = yes
so that tst-dlopen-aout, tst-prelink, tst-main1 and tst-gmon are always
built as non-PIE, with and without --enable-static-pie, regardless if
GCC defaults to PIE or non-PIE.
Tested with build-many-glibcs.py without --enable-static-pie as well as
with --enable-static-pie for x86_64, x32 and i686.
OK for master?
H.J.
---
[BZ #22630]
* Makeconfig (link-pie-before-libc): Replace -pie with
$(if $($(@F)-no-pie),$(no-pie-ldflag),-pie).
* elf/Makefile (LDFLAGS-tst-dlopen-aout): Removed.
(tst-dlopen-aout-no-pie): New.
(LDFLAGS-tst-prelink): Removed.
(tst-prelink-no-pie): New.
(LDFLAGS-tst-main1): Removed.
(tst-main1-no-pie): New.
* gmon/Makefile (LDFLAGS-tst-gmon): Removed.
(tst-gmon-no-pie): New.
---
Makeconfig | 3 ++-
elf/Makefile | 6 +++---
gmon/Makefile | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
Comments
On Mon, 18 Dec 2017, H.J. Lu wrote:
> $(no-pie-ldflag) is no longer effective since no-pie-ldflag is defined
> to -no-pie only if GCC defaults to PIE. When --enable-static-pie is
> used to configure glibc build and GCC doesn't default to PIE. no-pie-ldflag
> is undefined and these tests:
>
> elf/Makefile:LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
> elf/Makefile:LDFLAGS-tst-prelink = $(no-pie-ldflag)
> elf/Makefile:LDFLAGS-tst-main1 = $(no-pie-ldflag)
> gmon/Makefile:LDFLAGS-tst-gmon := $(no-pie-ldflag)
>
> may fail to link. This patch replaces "-pie" with
Why is --enable-static-pie causing non-static test cases to be built as
PIE? I see nothing in the NEWS or INSTALL entries to indicate such an
effect. That looks like the underlying problem here.
On Tue, Dec 19, 2017 at 9:07 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Mon, 18 Dec 2017, H.J. Lu wrote:
>
>> $(no-pie-ldflag) is no longer effective since no-pie-ldflag is defined
>> to -no-pie only if GCC defaults to PIE. When --enable-static-pie is
>> used to configure glibc build and GCC doesn't default to PIE. no-pie-ldflag
>> is undefined and these tests:
>>
>> elf/Makefile:LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
>> elf/Makefile:LDFLAGS-tst-prelink = $(no-pie-ldflag)
>> elf/Makefile:LDFLAGS-tst-main1 = $(no-pie-ldflag)
>> gmon/Makefile:LDFLAGS-tst-gmon := $(no-pie-ldflag)
>>
>> may fail to link. This patch replaces "-pie" with
>
> Why is --enable-static-pie causing non-static test cases to be built as
> PIE? I see nothing in the NEWS or INSTALL entries to indicate such an
> effect. That looks like the underlying problem here.
>
To build static PIE, all .o files need to compiled with -fPIE. Given all
input .o files are compiled with -fPIE when creating an executable, should
we generate PIE or nor no-PIE?
On Tue, 19 Dec 2017, H.J. Lu wrote:
> On Tue, Dec 19, 2017 at 9:07 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> > On Mon, 18 Dec 2017, H.J. Lu wrote:
> >
> >> $(no-pie-ldflag) is no longer effective since no-pie-ldflag is defined
> >> to -no-pie only if GCC defaults to PIE. When --enable-static-pie is
> >> used to configure glibc build and GCC doesn't default to PIE. no-pie-ldflag
> >> is undefined and these tests:
> >>
> >> elf/Makefile:LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
> >> elf/Makefile:LDFLAGS-tst-prelink = $(no-pie-ldflag)
> >> elf/Makefile:LDFLAGS-tst-main1 = $(no-pie-ldflag)
> >> gmon/Makefile:LDFLAGS-tst-gmon := $(no-pie-ldflag)
> >>
> >> may fail to link. This patch replaces "-pie" with
> >
> > Why is --enable-static-pie causing non-static test cases to be built as
> > PIE? I see nothing in the NEWS or INSTALL entries to indicate such an
> > effect. That looks like the underlying problem here.
> >
>
> To build static PIE, all .o files need to compiled with -fPIE. Given all
> input .o files are compiled with -fPIE when creating an executable, should
> we generate PIE or nor no-PIE?
I'd expect a normal executable, in the case of dynamic executables, since
nothing about --enable-static-pie says it changes how non-static
executables are built.
On Tue, Dec 19, 2017 at 10:01 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Tue, 19 Dec 2017, H.J. Lu wrote:
>
>> On Tue, Dec 19, 2017 at 9:07 AM, Joseph Myers <joseph@codesourcery.com> wrote:
>> > On Mon, 18 Dec 2017, H.J. Lu wrote:
>> >
>> >> $(no-pie-ldflag) is no longer effective since no-pie-ldflag is defined
>> >> to -no-pie only if GCC defaults to PIE. When --enable-static-pie is
>> >> used to configure glibc build and GCC doesn't default to PIE. no-pie-ldflag
>> >> is undefined and these tests:
>> >>
>> >> elf/Makefile:LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
>> >> elf/Makefile:LDFLAGS-tst-prelink = $(no-pie-ldflag)
>> >> elf/Makefile:LDFLAGS-tst-main1 = $(no-pie-ldflag)
>> >> gmon/Makefile:LDFLAGS-tst-gmon := $(no-pie-ldflag)
>> >>
>> >> may fail to link. This patch replaces "-pie" with
>> >
>> > Why is --enable-static-pie causing non-static test cases to be built as
>> > PIE? I see nothing in the NEWS or INSTALL entries to indicate such an
>> > effect. That looks like the underlying problem here.
>> >
>>
>> To build static PIE, all .o files need to compiled with -fPIE. Given all
>> input .o files are compiled with -fPIE when creating an executable, should
>> we generate PIE or nor no-PIE?
>
> I'd expect a normal executable, in the case of dynamic executables, since
> nothing about --enable-static-pie says it changes how non-static
> executables are built.
I can certainly make a patch to do that. On the other hand, should
--enable-static-pie imply PIE?
On Tue, 19 Dec 2017, H.J. Lu wrote:
> >> To build static PIE, all .o files need to compiled with -fPIE. Given all
> >> input .o files are compiled with -fPIE when creating an executable, should
> >> we generate PIE or nor no-PIE?
> >
> > I'd expect a normal executable, in the case of dynamic executables, since
> > nothing about --enable-static-pie says it changes how non-static
> > executables are built.
>
> I can certainly make a patch to do that. On the other hand, should
> --enable-static-pie imply PIE?
Logically, it doesn't need to. Practically, I don't know if people will
want static PIEs without dynamic PIEs, but if it implies both static and
dynamic PIEs, the documentation needs to say so.
On Tue, Dec 19, 2017 at 10:18 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> On Tue, 19 Dec 2017, H.J. Lu wrote:
>
>> >> To build static PIE, all .o files need to compiled with -fPIE. Given all
>> >> input .o files are compiled with -fPIE when creating an executable, should
>> >> we generate PIE or nor no-PIE?
>> >
>> > I'd expect a normal executable, in the case of dynamic executables, since
>> > nothing about --enable-static-pie says it changes how non-static
>> > executables are built.
>>
>> I can certainly make a patch to do that. On the other hand, should
>> --enable-static-pie imply PIE?
>
> Logically, it doesn't need to. Practically, I don't know if people will
> want static PIEs without dynamic PIEs, but if it implies both static and
> dynamic PIEs, the documentation needs to say so.
>
I will submit a patch to update documentation.
On Tue, 19 Dec 2017, H.J. Lu wrote:
> On Tue, Dec 19, 2017 at 10:18 AM, Joseph Myers <joseph@codesourcery.com> wrote:
> > On Tue, 19 Dec 2017, H.J. Lu wrote:
> >
> >> >> To build static PIE, all .o files need to compiled with -fPIE. Given all
> >> >> input .o files are compiled with -fPIE when creating an executable, should
> >> >> we generate PIE or nor no-PIE?
> >> >
> >> > I'd expect a normal executable, in the case of dynamic executables, since
> >> > nothing about --enable-static-pie says it changes how non-static
> >> > executables are built.
> >>
> >> I can certainly make a patch to do that. On the other hand, should
> >> --enable-static-pie imply PIE?
> >
> > Logically, it doesn't need to. Practically, I don't know if people will
> > want static PIEs without dynamic PIEs, but if it implies both static and
> > dynamic PIEs, the documentation needs to say so.
> >
>
> I will submit a patch to update documentation.
If the documentation achieves consensus, then this patch is also OK, since
I think it's the correct way in that context of avoiding trying to link
these particular tests as PIE.
@@ -413,7 +413,8 @@ link-extra-libs-tests = $(libsupport)
# Command for linking PIE programs with the C library.
ifndef +link-pie
-+link-pie-before-libc = $(CC) -pie -Wl,-O1 -nostdlib -nostartfiles -o $@ \
++link-pie-before-libc = $(CC) $(if $($(@F)-no-pie),$(no-pie-ldflag),-pie) \
+ -Wl,-O1 -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
$(firstword $(CRT-$(@F)) $(csu-objpfx)S$(start-installed-name)) \
@@ -195,7 +195,7 @@ tests-internal += loadtest unload unload2 circleload1 \
tst-ptrguard1 tst-stackguard1
ifeq ($(build-hardcoded-path-in-tests),yes)
tests += tst-dlopen-aout
-LDFLAGS-tst-dlopen-aout = $(no-pie-ldflag)
+tst-dlopen-aout-no-pie = yes
endif
test-srcs = tst-pathopt
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
@@ -369,7 +369,7 @@ ifeq ($(have-glob-dat-reloc),yes)
tests += tst-prelink
# Don't compile tst-prelink.c with PIE for GLOB_DAT relocation.
CFLAGS-tst-prelink.c += -fno-pie
-LDFLAGS-tst-prelink = $(no-pie-ldflag)
+tst-prelink-no-pie = yes
ifeq ($(run-built-tests),yes)
tests-special += $(objpfx)tst-prelink-cmp.out
endif
@@ -1433,6 +1433,6 @@ $(objpfx)tst-debug1mod1.so: $(objpfx)testobj1.so
$(objpfx)tst-main1: $(objpfx)tst-main1mod.so
CRT-tst-main1 := $(csu-objpfx)crt1.o
-LDFLAGS-tst-main1 = $(no-pie-ldflag)
+tst-main1-no-pie = yes
LDLIBS-tst-main1 = $(libsupport)
tst-main1mod.so-no-z-defs = yes
@@ -49,7 +49,7 @@ endif
CFLAGS-mcount.c := -fno-omit-frame-pointer
CFLAGS-tst-gmon.c := -fno-omit-frame-pointer -pg
-LDFLAGS-tst-gmon := $(no-pie-ldflag)
+tst-gmon-no-pie = yes
CRT-tst-gmon := $(csu-objpfx)gcrt1.o
tst-gmon-ENV := GMON_OUT_PREFIX=$(objpfx)tst-gmon.data
ifeq ($(run-built-tests),yes)