[v4,00/10] fix ifunc with static pie [BZ #27072]

Message ID cover.1610986541.git.szabolcs.nagy@arm.com
Headers
Series fix ifunc with static pie [BZ #27072] |

Message

Szabolcs Nagy Jan. 18, 2021, 4:22 p.m. UTC
  v4:
- added patches from H.J.Lu:
	- x86: fix libmvec tests
	- x86: fix syscalls in libc_enable_secure
	- x86: avoid relative reloc for _dl_sysinfo
	- x86: add ifunc test
- i386 cannot mark all symbols hidden, so use fine grain
  marking in files that participate in early code before
  static pie self relocation.
- the patch that makes all libc symbols hidden is still
  included: it is now only an optimization for non-i386
  targets.

v3:
- refactor tunables: move internals out of dl-tunables.h
- use generated max string length in the tunables list
  instead of magic values.

v2:
- check PI_STATIC_AND_HIDDEN for --enable-static-pie
- change string buffer sizes in the tunables
- fix env_alias == NULL logic in __tunables_init
- move __ehdr_start processing after self relocation


force pushed into nsz/bug27072 branch.

Issues that are not addressed:
- tunables try to allocate memory even with non-suid exe.
  allocation is only needed for rewriting the GLIBC_TUNABLES
  env var. (i think a case can be made that if anything there
  is TUNABLE_SECLEVEL_SXID_ERASE then this env var would be
  simply dropped, that would simplify this significantly).
- __sbrk only needs the hidden visibility magic because of
  tunables, ideally we would not do allocations before self
  relocation.
- tunable list data structure is not optimized for compactness.
- all symbols are forced hidden in libc.a, but i think lib*.a
  should do the same. (other than lib*_nonshared.a)
- i386 introduced a fair bit of complications: may be avoiding
  relative relocs is too much to ask for and relocations should
  be done in two steps after all: relative first, then irelative
  when tunable etc are set up.

H.J. Lu (4):
  libmvec: Add extra-test-objs to test-extras
  elf: Avoid RELATIVE relocation for _dl_sysinfo
  Use <startup.h> in __libc_init_secure
  x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]

Szabolcs Nagy (6):
  configure: Require PI_STATIC_AND_HIDDEN for static pie
  elf: Make the tunable struct definition internal only
  elf: Avoid RELATIVE relocs in __tunables_init
  Use hidden visibility for early static PIE code
  csu: Move static pie self relocation later [BZ #27072]
  Make libc symbols hidden in static PIE

 configure                                    |  14 +++
 configure.ac                                 |   5 +
 csu/libc-start.c                             |  48 +++++---
 elf/dl-reloc-static-pie.c                    |   2 +
 elf/dl-support.c                             |  18 ++-
 elf/dl-tunable-types.h                       |  42 +++++--
 elf/dl-tunables.c                            |   6 +-
 elf/dl-tunables.h                            |  35 ++----
 elf/enbl-secure.c                            |  10 +-
 include/libc-symbols.h                       |   9 +-
 misc/sbrk.c                                  |   4 +
 scripts/gen-tunables.awk                     |  16 ++-
 sysdeps/generic/startup.h                    |  26 ++++
 sysdeps/unix/sysv/linux/aarch64/libc-start.c |   5 +
 sysdeps/unix/sysv/linux/i386/startup.h       |  29 ++++-
 sysdeps/x86/Makefile                         |  14 +++
 sysdeps/x86/libc-start.c                     |   5 +
 sysdeps/x86/tst-ifunc-isa-1-static.c         |   1 +
 sysdeps/x86/tst-ifunc-isa-1.c                | 115 ++++++++++++++++++
 sysdeps/x86/tst-ifunc-isa-2-static.c         |   1 +
 sysdeps/x86/tst-ifunc-isa-2.c                | 119 +++++++++++++++++++
 sysdeps/x86_64/fpu/Makefile                  |   8 ++
 22 files changed, 465 insertions(+), 67 deletions(-)
 create mode 100644 sysdeps/x86/tst-ifunc-isa-1-static.c
 create mode 100644 sysdeps/x86/tst-ifunc-isa-1.c
 create mode 100644 sysdeps/x86/tst-ifunc-isa-2-static.c
 create mode 100644 sysdeps/x86/tst-ifunc-isa-2.c
  

Comments

Adhemerval Zanella Netto Jan. 18, 2021, 9:37 p.m. UTC | #1
As a side note I tried your branch with a build for all support Linux
ABIs and it as least improves by issuing an error on architectures
where previously indicated support static-pie but it is broken in practice
(powerpc for instance [1])

So currently static-pie are support for all architectures, however it
fails to build for:

alpha-linux-gnu
arc-linux-gnuhf
hppa-linux-gnu
ia64-linux-gnu
m68k-linux-gnu
microblaze-linux-gnu
riscv32-linux-gnu-rv32imafdc-ilp32d
riscv64-linux-gnu-rv64imafdc-lp64d
s390-linux-gnu
sparc64-linux-gnu
sparcv9-linux-gnu

By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
and powerpc fail at configure.  Some architecture still fails at build:

alpha-linux-gnu
arc-linux-gnuhf
riscv32-linux-gnu-rv32imafdc-ilp32d
riscv64-linux-gnu-rv64imafdc-lp64d
s390-linux-gnu
sparc64-linux-gnu
sparcv9-linux-gnu

I haven't checked if mips is currently broken for static-pie (since
as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
expect so.

It would be good if we could avoid building the broken configuration
and warn it on configure, but I don't think this should be a blocker.
The NEWS for 2.27 states this features is only supported for x86
and aarch64, so I wonder if would be better to just enable it for
the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.

I will finish review the patchset tomorrow.

[1] https://bugs.gentoo.org/719444

On 18/01/2021 13:22, Szabolcs Nagy via Libc-alpha wrote:
> v4:
> - added patches from H.J.Lu:
> 	- x86: fix libmvec tests
> 	- x86: fix syscalls in libc_enable_secure
> 	- x86: avoid relative reloc for _dl_sysinfo
> 	- x86: add ifunc test
> - i386 cannot mark all symbols hidden, so use fine grain
>   marking in files that participate in early code before
>   static pie self relocation.
> - the patch that makes all libc symbols hidden is still
>   included: it is now only an optimization for non-i386
>   targets.
> 
> v3:
> - refactor tunables: move internals out of dl-tunables.h
> - use generated max string length in the tunables list
>   instead of magic values.
> 
> v2:
> - check PI_STATIC_AND_HIDDEN for --enable-static-pie
> - change string buffer sizes in the tunables
> - fix env_alias == NULL logic in __tunables_init
> - move __ehdr_start processing after self relocation
> 
> 
> force pushed into nsz/bug27072 branch.
> 
> Issues that are not addressed:
> - tunables try to allocate memory even with non-suid exe.
>   allocation is only needed for rewriting the GLIBC_TUNABLES
>   env var. (i think a case can be made that if anything there
>   is TUNABLE_SECLEVEL_SXID_ERASE then this env var would be
>   simply dropped, that would simplify this significantly).
> - __sbrk only needs the hidden visibility magic because of
>   tunables, ideally we would not do allocations before self
>   relocation.
> - tunable list data structure is not optimized for compactness.
> - all symbols are forced hidden in libc.a, but i think lib*.a
>   should do the same. (other than lib*_nonshared.a)
> - i386 introduced a fair bit of complications: may be avoiding
>   relative relocs is too much to ask for and relocations should
>   be done in two steps after all: relative first, then irelative
>   when tunable etc are set up.
> 
> H.J. Lu (4):
>   libmvec: Add extra-test-objs to test-extras
>   elf: Avoid RELATIVE relocation for _dl_sysinfo
>   Use <startup.h> in __libc_init_secure
>   x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]
> 
> Szabolcs Nagy (6):
>   configure: Require PI_STATIC_AND_HIDDEN for static pie
>   elf: Make the tunable struct definition internal only
>   elf: Avoid RELATIVE relocs in __tunables_init
>   Use hidden visibility for early static PIE code
>   csu: Move static pie self relocation later [BZ #27072]
>   Make libc symbols hidden in static PIE
> 
>  configure                                    |  14 +++
>  configure.ac                                 |   5 +
>  csu/libc-start.c                             |  48 +++++---
>  elf/dl-reloc-static-pie.c                    |   2 +
>  elf/dl-support.c                             |  18 ++-
>  elf/dl-tunable-types.h                       |  42 +++++--
>  elf/dl-tunables.c                            |   6 +-
>  elf/dl-tunables.h                            |  35 ++----
>  elf/enbl-secure.c                            |  10 +-
>  include/libc-symbols.h                       |   9 +-
>  misc/sbrk.c                                  |   4 +
>  scripts/gen-tunables.awk                     |  16 ++-
>  sysdeps/generic/startup.h                    |  26 ++++
>  sysdeps/unix/sysv/linux/aarch64/libc-start.c |   5 +
>  sysdeps/unix/sysv/linux/i386/startup.h       |  29 ++++-
>  sysdeps/x86/Makefile                         |  14 +++
>  sysdeps/x86/libc-start.c                     |   5 +
>  sysdeps/x86/tst-ifunc-isa-1-static.c         |   1 +
>  sysdeps/x86/tst-ifunc-isa-1.c                | 115 ++++++++++++++++++
>  sysdeps/x86/tst-ifunc-isa-2-static.c         |   1 +
>  sysdeps/x86/tst-ifunc-isa-2.c                | 119 +++++++++++++++++++
>  sysdeps/x86_64/fpu/Makefile                  |   8 ++
>  22 files changed, 465 insertions(+), 67 deletions(-)
>  create mode 100644 sysdeps/x86/tst-ifunc-isa-1-static.c
>  create mode 100644 sysdeps/x86/tst-ifunc-isa-1.c
>  create mode 100644 sysdeps/x86/tst-ifunc-isa-2-static.c
>  create mode 100644 sysdeps/x86/tst-ifunc-isa-2.c
>
  
Szabolcs Nagy Jan. 19, 2021, 6:25 p.m. UTC | #2
The 01/18/2021 18:37, Adhemerval Zanella wrote:
> As a side note I tried your branch with a build for all support Linux
> ABIs and it as least improves by issuing an error on architectures
> where previously indicated support static-pie but it is broken in practice
> (powerpc for instance [1])
> 
> So currently static-pie are support for all architectures, however it
> fails to build for:
> 
> alpha-linux-gnu
> arc-linux-gnuhf
> hppa-linux-gnu
> ia64-linux-gnu
> m68k-linux-gnu
> microblaze-linux-gnu
> riscv32-linux-gnu-rv32imafdc-ilp32d
> riscv64-linux-gnu-rv64imafdc-lp64d
> s390-linux-gnu
> sparc64-linux-gnu
> sparcv9-linux-gnu
> 
> By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
> and powerpc fail at configure.  Some architecture still fails at build:
> 
> alpha-linux-gnu
> arc-linux-gnuhf
> riscv32-linux-gnu-rv32imafdc-ilp32d
> riscv64-linux-gnu-rv64imafdc-lp64d
> s390-linux-gnu
> sparc64-linux-gnu
> sparcv9-linux-gnu
> 
> I haven't checked if mips is currently broken for static-pie (since
> as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
> expect so.
> 
> It would be good if we could avoid building the broken configuration
> and warn it on configure, but I don't think this should be a blocker.
> The NEWS for 2.27 states this features is only supported for x86
> and aarch64, so I wonder if would be better to just enable it for
> the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.

i randomly checked alpha, which fails while linking sln:

elf/dl-reloc-static-pie.c:40: undefined reference to `_DYNAMIC'

i think this should be possible to configure test in case others
targets fail in a similar way.


> 
> I will finish review the patchset tomorrow.
> 
> [1] https://bugs.gentoo.org/719444
> 
> On 18/01/2021 13:22, Szabolcs Nagy via Libc-alpha wrote:
> > v4:
> > - added patches from H.J.Lu:
> > 	- x86: fix libmvec tests
> > 	- x86: fix syscalls in libc_enable_secure
> > 	- x86: avoid relative reloc for _dl_sysinfo
> > 	- x86: add ifunc test
> > - i386 cannot mark all symbols hidden, so use fine grain
> >   marking in files that participate in early code before
> >   static pie self relocation.
> > - the patch that makes all libc symbols hidden is still
> >   included: it is now only an optimization for non-i386
> >   targets.
> > 
> > v3:
> > - refactor tunables: move internals out of dl-tunables.h
> > - use generated max string length in the tunables list
> >   instead of magic values.
> > 
> > v2:
> > - check PI_STATIC_AND_HIDDEN for --enable-static-pie
> > - change string buffer sizes in the tunables
> > - fix env_alias == NULL logic in __tunables_init
> > - move __ehdr_start processing after self relocation
> > 
> > 
> > force pushed into nsz/bug27072 branch.
> > 
> > Issues that are not addressed:
> > - tunables try to allocate memory even with non-suid exe.
> >   allocation is only needed for rewriting the GLIBC_TUNABLES
> >   env var. (i think a case can be made that if anything there
> >   is TUNABLE_SECLEVEL_SXID_ERASE then this env var would be
> >   simply dropped, that would simplify this significantly).
> > - __sbrk only needs the hidden visibility magic because of
> >   tunables, ideally we would not do allocations before self
> >   relocation.
> > - tunable list data structure is not optimized for compactness.
> > - all symbols are forced hidden in libc.a, but i think lib*.a
> >   should do the same. (other than lib*_nonshared.a)
> > - i386 introduced a fair bit of complications: may be avoiding
> >   relative relocs is too much to ask for and relocations should
> >   be done in two steps after all: relative first, then irelative
> >   when tunable etc are set up.
> > 
> > H.J. Lu (4):
> >   libmvec: Add extra-test-objs to test-extras
> >   elf: Avoid RELATIVE relocation for _dl_sysinfo
> >   Use <startup.h> in __libc_init_secure
> >   x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]
> > 
> > Szabolcs Nagy (6):
> >   configure: Require PI_STATIC_AND_HIDDEN for static pie
> >   elf: Make the tunable struct definition internal only
> >   elf: Avoid RELATIVE relocs in __tunables_init
> >   Use hidden visibility for early static PIE code
> >   csu: Move static pie self relocation later [BZ #27072]
> >   Make libc symbols hidden in static PIE
> > 
> >  configure                                    |  14 +++
> >  configure.ac                                 |   5 +
> >  csu/libc-start.c                             |  48 +++++---
> >  elf/dl-reloc-static-pie.c                    |   2 +
> >  elf/dl-support.c                             |  18 ++-
> >  elf/dl-tunable-types.h                       |  42 +++++--
> >  elf/dl-tunables.c                            |   6 +-
> >  elf/dl-tunables.h                            |  35 ++----
> >  elf/enbl-secure.c                            |  10 +-
> >  include/libc-symbols.h                       |   9 +-
> >  misc/sbrk.c                                  |   4 +
> >  scripts/gen-tunables.awk                     |  16 ++-
> >  sysdeps/generic/startup.h                    |  26 ++++
> >  sysdeps/unix/sysv/linux/aarch64/libc-start.c |   5 +
> >  sysdeps/unix/sysv/linux/i386/startup.h       |  29 ++++-
> >  sysdeps/x86/Makefile                         |  14 +++
> >  sysdeps/x86/libc-start.c                     |   5 +
> >  sysdeps/x86/tst-ifunc-isa-1-static.c         |   1 +
> >  sysdeps/x86/tst-ifunc-isa-1.c                | 115 ++++++++++++++++++
> >  sysdeps/x86/tst-ifunc-isa-2-static.c         |   1 +
> >  sysdeps/x86/tst-ifunc-isa-2.c                | 119 +++++++++++++++++++
> >  sysdeps/x86_64/fpu/Makefile                  |   8 ++
> >  22 files changed, 465 insertions(+), 67 deletions(-)
> >  create mode 100644 sysdeps/x86/tst-ifunc-isa-1-static.c
> >  create mode 100644 sysdeps/x86/tst-ifunc-isa-1.c
> >  create mode 100644 sysdeps/x86/tst-ifunc-isa-2-static.c
> >  create mode 100644 sysdeps/x86/tst-ifunc-isa-2.c
> >
  
H.J. Lu Jan. 19, 2021, 7:41 p.m. UTC | #3
On Tue, Jan 19, 2021 at 10:25 AM Szabolcs Nagy via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> The 01/18/2021 18:37, Adhemerval Zanella wrote:
> > As a side note I tried your branch with a build for all support Linux
> > ABIs and it as least improves by issuing an error on architectures
> > where previously indicated support static-pie but it is broken in practice
> > (powerpc for instance [1])
> >
> > So currently static-pie are support for all architectures, however it
> > fails to build for:
> >
> > alpha-linux-gnu
> > arc-linux-gnuhf
> > hppa-linux-gnu
> > ia64-linux-gnu
> > m68k-linux-gnu
> > microblaze-linux-gnu
> > riscv32-linux-gnu-rv32imafdc-ilp32d
> > riscv64-linux-gnu-rv64imafdc-lp64d
> > s390-linux-gnu
> > sparc64-linux-gnu
> > sparcv9-linux-gnu
> >
> > By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
> > and powerpc fail at configure.  Some architecture still fails at build:
> >
> > alpha-linux-gnu
> > arc-linux-gnuhf
> > riscv32-linux-gnu-rv32imafdc-ilp32d
> > riscv64-linux-gnu-rv64imafdc-lp64d
> > s390-linux-gnu
> > sparc64-linux-gnu
> > sparcv9-linux-gnu
> >
> > I haven't checked if mips is currently broken for static-pie (since
> > as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
> > expect so.
> >
> > It would be good if we could avoid building the broken configuration
> > and warn it on configure, but I don't think this should be a blocker.
> > The NEWS for 2.27 states this features is only supported for x86
> > and aarch64, so I wonder if would be better to just enable it for
> > the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.
>
> i randomly checked alpha, which fails while linking sln:
>
> elf/dl-reloc-static-pie.c:40: undefined reference to `_DYNAMIC'
>
> i think this should be possible to configure test in case others
> targets fail in a similar way.
>

Linker must be fixed to support static PIE:

https://sourceware.org/bugzilla/show_bug.cgi?id=22269
https://sourceware.org/bugzilla/show_bug.cgi?id=22263
https://sourceware.org/bugzilla/show_bug.cgi?id=21252
  
Adhemerval Zanella Netto Jan. 19, 2021, 8:16 p.m. UTC | #4
On 19/01/2021 16:41, H.J. Lu wrote:
> On Tue, Jan 19, 2021 at 10:25 AM Szabolcs Nagy via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
>>
>> The 01/18/2021 18:37, Adhemerval Zanella wrote:
>>> As a side note I tried your branch with a build for all support Linux
>>> ABIs and it as least improves by issuing an error on architectures
>>> where previously indicated support static-pie but it is broken in practice
>>> (powerpc for instance [1])
>>>
>>> So currently static-pie are support for all architectures, however it
>>> fails to build for:
>>>
>>> alpha-linux-gnu
>>> arc-linux-gnuhf
>>> hppa-linux-gnu
>>> ia64-linux-gnu
>>> m68k-linux-gnu
>>> microblaze-linux-gnu
>>> riscv32-linux-gnu-rv32imafdc-ilp32d
>>> riscv64-linux-gnu-rv64imafdc-lp64d
>>> s390-linux-gnu
>>> sparc64-linux-gnu
>>> sparcv9-linux-gnu
>>>
>>> By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
>>> and powerpc fail at configure.  Some architecture still fails at build:
>>>
>>> alpha-linux-gnu
>>> arc-linux-gnuhf
>>> riscv32-linux-gnu-rv32imafdc-ilp32d
>>> riscv64-linux-gnu-rv64imafdc-lp64d
>>> s390-linux-gnu
>>> sparc64-linux-gnu
>>> sparcv9-linux-gnu
>>>
>>> I haven't checked if mips is currently broken for static-pie (since
>>> as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
>>> expect so.
>>>
>>> It would be good if we could avoid building the broken configuration
>>> and warn it on configure, but I don't think this should be a blocker.
>>> The NEWS for 2.27 states this features is only supported for x86
>>> and aarch64, so I wonder if would be better to just enable it for
>>> the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.
>>
>> i randomly checked alpha, which fails while linking sln:
>>
>> elf/dl-reloc-static-pie.c:40: undefined reference to `_DYNAMIC'
>>
>> i think this should be possible to configure test in case others
>> targets fail in a similar way.
>>
> 
> Linker must be fixed to support static PIE:
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=22269
> https://sourceware.org/bugzilla/show_bug.cgi?id=22263
> https://sourceware.org/bugzilla/show_bug.cgi?id=21252

My question is which is the correct way to check at configure time
for this support? Currently this patchset added the PI_STATIC_AND_HIDDEN,
which is set by each configure snipper within glibc.
  
H.J. Lu Jan. 19, 2021, 9:38 p.m. UTC | #5
On Tue, Jan 19, 2021 at 12:16 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 19/01/2021 16:41, H.J. Lu wrote:
> > On Tue, Jan 19, 2021 at 10:25 AM Szabolcs Nagy via Libc-alpha
> > <libc-alpha@sourceware.org> wrote:
> >>
> >> The 01/18/2021 18:37, Adhemerval Zanella wrote:
> >>> As a side note I tried your branch with a build for all support Linux
> >>> ABIs and it as least improves by issuing an error on architectures
> >>> where previously indicated support static-pie but it is broken in practice
> >>> (powerpc for instance [1])
> >>>
> >>> So currently static-pie are support for all architectures, however it
> >>> fails to build for:
> >>>
> >>> alpha-linux-gnu
> >>> arc-linux-gnuhf
> >>> hppa-linux-gnu
> >>> ia64-linux-gnu
> >>> m68k-linux-gnu
> >>> microblaze-linux-gnu
> >>> riscv32-linux-gnu-rv32imafdc-ilp32d
> >>> riscv64-linux-gnu-rv64imafdc-lp64d
> >>> s390-linux-gnu
> >>> sparc64-linux-gnu
> >>> sparcv9-linux-gnu
> >>>
> >>> By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
> >>> and powerpc fail at configure.  Some architecture still fails at build:
> >>>
> >>> alpha-linux-gnu
> >>> arc-linux-gnuhf
> >>> riscv32-linux-gnu-rv32imafdc-ilp32d
> >>> riscv64-linux-gnu-rv64imafdc-lp64d
> >>> s390-linux-gnu
> >>> sparc64-linux-gnu
> >>> sparcv9-linux-gnu
> >>>
> >>> I haven't checked if mips is currently broken for static-pie (since
> >>> as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
> >>> expect so.
> >>>
> >>> It would be good if we could avoid building the broken configuration
> >>> and warn it on configure, but I don't think this should be a blocker.
> >>> The NEWS for 2.27 states this features is only supported for x86
> >>> and aarch64, so I wonder if would be better to just enable it for
> >>> the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.
> >>
> >> i randomly checked alpha, which fails while linking sln:
> >>
> >> elf/dl-reloc-static-pie.c:40: undefined reference to `_DYNAMIC'
> >>
> >> i think this should be possible to configure test in case others
> >> targets fail in a similar way.
> >>
> >
> > Linker must be fixed to support static PIE:
> >
> > https://sourceware.org/bugzilla/show_bug.cgi?id=22269
> > https://sourceware.org/bugzilla/show_bug.cgi?id=22263
> > https://sourceware.org/bugzilla/show_bug.cgi?id=21252
>
> My question is which is the correct way to check at configure time
> for this support? Currently this patchset added the PI_STATIC_AND_HIDDEN,
> which is set by each configure snipper within glibc.

Add and define SUPPORT_STATIC_PIE for x86 and aarch64.   Other
targets can opt-in.
  
Adhemerval Zanella Netto Jan. 20, 2021, 11:29 a.m. UTC | #6
On 19/01/2021 18:38, H.J. Lu wrote:
> On Tue, Jan 19, 2021 at 12:16 PM Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 19/01/2021 16:41, H.J. Lu wrote:
>>> On Tue, Jan 19, 2021 at 10:25 AM Szabolcs Nagy via Libc-alpha
>>> <libc-alpha@sourceware.org> wrote:
>>>>
>>>> The 01/18/2021 18:37, Adhemerval Zanella wrote:
>>>>> As a side note I tried your branch with a build for all support Linux
>>>>> ABIs and it as least improves by issuing an error on architectures
>>>>> where previously indicated support static-pie but it is broken in practice
>>>>> (powerpc for instance [1])
>>>>>
>>>>> So currently static-pie are support for all architectures, however it
>>>>> fails to build for:
>>>>>
>>>>> alpha-linux-gnu
>>>>> arc-linux-gnuhf
>>>>> hppa-linux-gnu
>>>>> ia64-linux-gnu
>>>>> m68k-linux-gnu
>>>>> microblaze-linux-gnu
>>>>> riscv32-linux-gnu-rv32imafdc-ilp32d
>>>>> riscv64-linux-gnu-rv64imafdc-lp64d
>>>>> s390-linux-gnu
>>>>> sparc64-linux-gnu
>>>>> sparcv9-linux-gnu
>>>>>
>>>>> By requiring PI_STATIC_AND_HIDDEN hppa, m68, microblaze, mips, nios2,
>>>>> and powerpc fail at configure.  Some architecture still fails at build:
>>>>>
>>>>> alpha-linux-gnu
>>>>> arc-linux-gnuhf
>>>>> riscv32-linux-gnu-rv32imafdc-ilp32d
>>>>> riscv64-linux-gnu-rv64imafdc-lp64d
>>>>> s390-linux-gnu
>>>>> sparc64-linux-gnu
>>>>> sparcv9-linux-gnu
>>>>>
>>>>> I haven't checked if mips is currently broken for static-pie (since
>>>>> as for powerpc, it does not define PI_STATIC_AND_HIDDEN); but I would
>>>>> expect so.
>>>>>
>>>>> It would be good if we could avoid building the broken configuration
>>>>> and warn it on configure, but I don't think this should be a blocker.
>>>>> The NEWS for 2.27 states this features is only supported for x86
>>>>> and aarch64, so I wonder if would be better to just enable it for
>>>>> the supported architectures instead of relying on PI_STATIC_AND_HIDDEN.
>>>>
>>>> i randomly checked alpha, which fails while linking sln:
>>>>
>>>> elf/dl-reloc-static-pie.c:40: undefined reference to `_DYNAMIC'
>>>>
>>>> i think this should be possible to configure test in case others
>>>> targets fail in a similar way.
>>>>
>>>
>>> Linker must be fixed to support static PIE:
>>>
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=22269
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=22263
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=21252
>>
>> My question is which is the correct way to check at configure time
>> for this support? Currently this patchset added the PI_STATIC_AND_HIDDEN,
>> which is set by each configure snipper within glibc.
> 
> Add and define SUPPORT_STATIC_PIE for x86 and aarch64.   Other
> targets can opt-in.

I was expecting a way without an extra flag, but I think for now it
should be suffice.
  
Szabolcs Nagy Jan. 20, 2021, 12:38 p.m. UTC | #7
The 01/20/2021 08:29, Adhemerval Zanella wrote:
> On 19/01/2021 18:38, H.J. Lu wrote:
> > On Tue, Jan 19, 2021 at 12:16 PM Adhemerval Zanella
> > <adhemerval.zanella@linaro.org> wrote:
> >> On 19/01/2021 16:41, H.J. Lu wrote:
> >>> Linker must be fixed to support static PIE:
> >>>
> >>> https://sourceware.org/bugzilla/show_bug.cgi?id=22269
> >>> https://sourceware.org/bugzilla/show_bug.cgi?id=22263
> >>> https://sourceware.org/bugzilla/show_bug.cgi?id=21252
> >>
> >> My question is which is the correct way to check at configure time
> >> for this support? Currently this patchset added the PI_STATIC_AND_HIDDEN,
> >> which is set by each configure snipper within glibc.
> > 
> > Add and define SUPPORT_STATIC_PIE for x86 and aarch64.   Other
> > targets can opt-in.
> 
> I was expecting a way without an extra flag, but I think for now it
> should be suffice.

i can add the flag but when a target adds support there
will be no check if the used linker is new enough.
  
H.J. Lu Jan. 20, 2021, 12:49 p.m. UTC | #8
On Wed, Jan 20, 2021 at 4:38 AM Szabolcs Nagy <szabolcs.nagy@arm.com> wrote:
>
> The 01/20/2021 08:29, Adhemerval Zanella wrote:
> > On 19/01/2021 18:38, H.J. Lu wrote:
> > > On Tue, Jan 19, 2021 at 12:16 PM Adhemerval Zanella
> > > <adhemerval.zanella@linaro.org> wrote:
> > >> On 19/01/2021 16:41, H.J. Lu wrote:
> > >>> Linker must be fixed to support static PIE:
> > >>>
> > >>> https://sourceware.org/bugzilla/show_bug.cgi?id=22269
> > >>> https://sourceware.org/bugzilla/show_bug.cgi?id=22263
> > >>> https://sourceware.org/bugzilla/show_bug.cgi?id=21252
> > >>
> > >> My question is which is the correct way to check at configure time
> > >> for this support? Currently this patchset added the PI_STATIC_AND_HIDDEN,
> > >> which is set by each configure snipper within glibc.
> > >
> > > Add and define SUPPORT_STATIC_PIE for x86 and aarch64.   Other
> > > targets can opt-in.
> >
> > I was expecting a way without an extra flag, but I think for now it
> > should be suffice.
>
> i can add the flag but when a target adds support there
> will be no check if the used linker is new enough.

The minimum link should work for x86 and aarch64.   But if linker fixes
are needed for other targets, they should add the linker check.