Age | Commit message (Collapse) | Author |
|
GLRO (_rtld_global_ro) is read-only after initialization and can
therefore not be patched at run time, unlike the hook table addresses
and their contents, so this is a desirable hardening feature.
The hooks are only needed if ld.so has not been initialized, and this
happens only after static dlopen (dlmopen uses a single ld.so object
across all namespaces).
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
Starting with commit
glibc-2.18.90-470-g2a939a7e6d81f109d49306bc2e10b4ac9ceed8f9 that
introduced substitution of dynamic string tokens in fillin_rpath,
_dl_init_paths invokes _dl_dst_substitute for $LD_LIBRARY_PATH twice:
the first time it's called directly, the second time the result
is passed on to fillin_rpath which calls expand_dynamic_string_token
which in turn calls _dl_dst_substitute, leading to the following
behaviour:
$ mkdir -p /tmp/'$ORIGIN' && cd /tmp/'$ORIGIN' &&
echo 'int main(){}' |gcc -xc - &&
strace -qq -E LD_LIBRARY_PATH='$ORIGIN' -e /open ./a.out
open("/tmp//tmp/$ORIGIN/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/tmp//tmp/$ORIGIN/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
Fix this by removing the direct _dl_dst_substitute invocation.
* elf/dl-load.c (_dl_init_paths): Remove _dl_dst_substitute preparatory
code and invocation.
|
|
ldconfig supports `include' directives and use the glob function to
process them. The glob function sort entries according to the LC_COLLATE
category. When using a standard "include /etc/ld.so.conf.d/*.conf" entry
in /etc/ld.so.conf, the order therefore depends on the locale used to
run ldconfig. A few examples of locale specific order that might be
disturbing in that context compared to the C locale:
- The cs_CZ and sk_SK locales sort the digits after the letters.
- The et_EE locale sorts the 'z' between 's' and 't'.
This patch fixes that by setting LC_COLLATE to C in order to process
files in deterministic order, independently of the locale used to launch
ldconfig.
NOTE: This should NOT be backported to older release branches.
Changelog:
[BZ #22505]
* elf/ldconfig.c (main): Call setlocale to force LC_COLLATE to C.
|
|
The test tst-leaks1 exercises calling dlopen with a $ORIGIN DST.
This results in a theoretical leak e.g.
Memory not freed:
-----------------
Address Size Caller
0x0000000001d766c0 0x21 at 0x7fb1bd8bf4ab
Or as seen via valgrind:
==27582== 33 bytes in 1 blocks are still reachable in loss record 1 of 1
==27582== at 0x4C2CB6B: malloc (vg_replace_malloc.c:299)
==27582== by 0x40124AA: _dl_get_origin (dl-origin.c:50)
==27582== by 0x4007DB9: expand_dynamic_string_token (dl-load.c:382)
==27582== by 0x400899C: _dl_map_object (dl-load.c:2160)
==27582== by 0x4013020: dl_open_worker (dl-open.c:224)
==27582== by 0x5166F9B: _dl_catch_exception (dl-error-skeleton.c:198)
==27582== by 0x4012BD9: _dl_open (dl-open.c:594)
==27582== by 0x4E39EF5: dlopen_doit (dlopen.c:66)
==27582== by 0x5166F9B: _dl_catch_exception (dl-error-skeleton.c:198)
==27582== by 0x516700E: _dl_catch_error (dl-error-skeleton.c:217)
==27582== by 0x4E3A514: _dlerror_run (dlerror.c:162)
==27582== by 0x4E39F70: dlopen@@GLIBC_2.2.5 (dlopen.c:87)
There is no real leak.
The calling link map (the executable's link map) has it's l_origin
expanded for future use as part of _dl_get_origin, and that results
in the main executable link map having a N-byte allocation for
l->l_origin that is never freed since the executable's link map is
just a part of the process.
To take this into account we do one dlopen with $ORIGIN before
calling mtrace to force the initialization of the executable link
map.
Signed-off-by: Carlos O'Donell <carlos@redhat.com>
|
|
Static PIE extends address space layout randomization to static
executables. It provides additional security hardening benefits at
the cost of some memory and performance.
Dynamic linker, ld.so, is a standalone program which can be loaded at
any address. This patch adds a configure option, --enable-static-pie,
to embed the part of ld.so in static executable to create static position
independent executable (static PIE). A static PIE is similar to static
executable, but can be loaded at any address without help from a dynamic
linker. When --enable-static-pie is used to configure glibc, libc.a is
built as PIE and all static executables, including tests, are built as
static PIE. The resulting libc.a can be used together with GCC 8 or
above to build static PIE with the compiler option, -static-pie. But
GCC 8 isn't required to build glibc with --enable-static-pie. Only GCC
with PIE support is needed. When an older GCC is used to build glibc
with --enable-static-pie, proper input files are passed to linker to
create static executables as static PIE, together with "-z text" to
prevent dynamic relocations in read-only segments, which are not allowed
in static PIE.
The following changes are made for static PIE:
1. Add a new function, _dl_relocate_static_pie, to:
a. Get the run-time load address.
b. Read the dynamic section.
c. Perform dynamic relocations.
Dynamic linker also performs these steps. But static PIE doesn't load
any shared objects.
2. Call _dl_relocate_static_pie at entrance of LIBC_START_MAIN in
libc.a. crt1.o, which is used to create dynamic and non-PIE static
executables, is updated to include a dummy _dl_relocate_static_pie.
rcrt1.o is added to create static PIE, which will link in the real
_dl_relocate_static_pie. grcrt1.o is also added to create static PIE
with -pg. GCC 8 has been updated to support rcrt1.o and grcrt1.o for
static PIE.
Static PIE can work on all architectures which support PIE, provided:
1. Target must support accessing of local functions without dynamic
relocations, which is needed in start.S to call __libc_start_main with
function addresses of __libc_csu_init, __libc_csu_fini and main. All
functions in static PIE are local functions. If PIE start.S can't reach
main () defined in a shared object, the code sequence:
pass address of local_main to __libc_start_main
...
local_main:
tail call to main via PLT
can be used.
2. start.S is updated to check PIC instead SHARED for PIC code path and
avoid dynamic relocation, when PIC is defined and SHARED isn't defined,
to support static PIE.
3. All assembly codes are updated check PIC instead SHARED for PIC code
path to avoid dynamic relocations in read-only sections.
4. All assembly codes are updated check SHARED instead PIC for static
symbol name.
5. elf_machine_load_address in dl-machine.h are updated to support static
PIE.
6. __brk works without TLS nor dynamic relocations in read-only section
so that it can be used by __libc_setup_tls to initializes TLS in static
PIE.
NB: When glibc is built with GCC defaulted to PIE, libc.a is compiled
with -fPIE, regardless if --enable-static-pie is used to configure glibc.
When glibc is configured with --enable-static-pie, libc.a is compiled
with -fPIE, regardless whether GCC defaults to PIE or not. The same
libc.a can be used to build both static executable and static PIE.
There is no need for separate PIE copy of libc.a.
On x86-64, the normal static sln:
text data bss dec hex filename
625425 8284 5456 639165 9c0bd elf/sln
the static PIE sln:
text data bss dec hex filename
657626 20636 5392 683654 a6e86 elf/sln
The code size is increased by 5% and the binary size is increased by 7%.
Linker requirements to build glibc with --enable-static-pie:
1. Linker supports --no-dynamic-linker to remove PT_INTERP segment from
static PIE.
2. Linker can create working static PIE. The x86-64 linker needs the
fix for
https://sourceware.org/bugzilla/show_bug.cgi?id=21782
The i386 linker needs to be able to convert "movl main@GOT(%ebx), %eax"
to "leal main@GOTOFF(%ebx), %eax" if main is defined locally.
Binutils 2.29 or above are OK for i686 and x86-64. But linker status for
other targets need to be verified.
3. Linker should resolve undefined weak symbols to 0 in static PIE:
https://sourceware.org/bugzilla/show_bug.cgi?id=22269
4. Many ELF backend linkers incorrectly check bfd_link_pic for TLS
relocations, which should check bfd_link_executable instead:
https://sourceware.org/bugzilla/show_bug.cgi?id=22263
Tested on aarch64, i686 and x86-64.
Using GCC 7 and binutils master branch, build-many-glibcs.py with
--enable-static-pie with all patches for static PIE applied have the
following build successes:
PASS: glibcs-aarch64_be-linux-gnu build
PASS: glibcs-aarch64-linux-gnu build
PASS: glibcs-armeb-linux-gnueabi-be8 build
PASS: glibcs-armeb-linux-gnueabi build
PASS: glibcs-armeb-linux-gnueabihf-be8 build
PASS: glibcs-armeb-linux-gnueabihf build
PASS: glibcs-arm-linux-gnueabi build
PASS: glibcs-arm-linux-gnueabihf build
PASS: glibcs-arm-linux-gnueabihf-v7a build
PASS: glibcs-arm-linux-gnueabihf-v7a-disable-multi-arch build
PASS: glibcs-m68k-linux-gnu build
PASS: glibcs-microblazeel-linux-gnu build
PASS: glibcs-microblaze-linux-gnu build
PASS: glibcs-mips64el-linux-gnu-n32 build
PASS: glibcs-mips64el-linux-gnu-n32-nan2008 build
PASS: glibcs-mips64el-linux-gnu-n32-nan2008-soft build
PASS: glibcs-mips64el-linux-gnu-n32-soft build
PASS: glibcs-mips64el-linux-gnu-n64 build
PASS: glibcs-mips64el-linux-gnu-n64-nan2008 build
PASS: glibcs-mips64el-linux-gnu-n64-nan2008-soft build
PASS: glibcs-mips64el-linux-gnu-n64-soft build
PASS: glibcs-mips64-linux-gnu-n32 build
PASS: glibcs-mips64-linux-gnu-n32-nan2008 build
PASS: glibcs-mips64-linux-gnu-n32-nan2008-soft build
PASS: glibcs-mips64-linux-gnu-n32-soft build
PASS: glibcs-mips64-linux-gnu-n64 build
PASS: glibcs-mips64-linux-gnu-n64-nan2008 build
PASS: glibcs-mips64-linux-gnu-n64-nan2008-soft build
PASS: glibcs-mips64-linux-gnu-n64-soft build
PASS: glibcs-mipsel-linux-gnu build
PASS: glibcs-mipsel-linux-gnu-nan2008 build
PASS: glibcs-mipsel-linux-gnu-nan2008-soft build
PASS: glibcs-mipsel-linux-gnu-soft build
PASS: glibcs-mips-linux-gnu build
PASS: glibcs-mips-linux-gnu-nan2008 build
PASS: glibcs-mips-linux-gnu-nan2008-soft build
PASS: glibcs-mips-linux-gnu-soft build
PASS: glibcs-nios2-linux-gnu build
PASS: glibcs-powerpc64le-linux-gnu build
PASS: glibcs-powerpc64-linux-gnu build
PASS: glibcs-tilegxbe-linux-gnu-32 build
PASS: glibcs-tilegxbe-linux-gnu build
PASS: glibcs-tilegx-linux-gnu-32 build
PASS: glibcs-tilegx-linux-gnu build
PASS: glibcs-tilepro-linux-gnu build
and the following build failures:
FAIL: glibcs-alpha-linux-gnu build
elf/sln is failed to link due to:
assertion fail bfd/elf64-alpha.c:4125
This is caused by linker bug and/or non-PIC code in PIE libc.a.
FAIL: glibcs-hppa-linux-gnu build
elf/sln is failed to link due to:
collect2: fatal error: ld terminated with signal 11 [Segmentation fault]
https://sourceware.org/bugzilla/show_bug.cgi?id=22537
FAIL: glibcs-ia64-linux-gnu build
elf/sln is failed to link due to:
collect2: fatal error: ld terminated with signal 11 [Segmentation fault]
FAIL: glibcs-powerpc-linux-gnu build
FAIL: glibcs-powerpc-linux-gnu-soft build
FAIL: glibcs-powerpc-linux-gnuspe build
FAIL: glibcs-powerpc-linux-gnuspe-e500v1 build
elf/sln is failed to link due to:
ld: read-only segment has dynamic relocations.
This is caused by linker bug and/or non-PIC code in PIE libc.a. See:
https://sourceware.org/bugzilla/show_bug.cgi?id=22264
FAIL: glibcs-powerpc-linux-gnu-power4 build
elf/sln is failed to link due to:
findlocale.c:96:(.text+0x22c): @local call to ifunc memchr
This is caused by linker bug and/or non-PIC code in PIE libc.a.
FAIL: glibcs-s390-linux-gnu build
elf/sln is failed to link due to:
collect2: fatal error: ld terminated with signal 11 [Segmentation fault], core dumped
assertion fail bfd/elflink.c:14299
This is caused by linker bug and/or non-PIC code in PIE libc.a.
FAIL: glibcs-sh3eb-linux-gnu build
FAIL: glibcs-sh3-linux-gnu build
FAIL: glibcs-sh4eb-linux-gnu build
FAIL: glibcs-sh4eb-linux-gnu-soft build
FAIL: glibcs-sh4-linux-gnu build
FAIL: glibcs-sh4-linux-gnu-soft build
elf/sln is failed to link due to:
ld: read-only segment has dynamic relocations.
This is caused by linker bug and/or non-PIC code in PIE libc.a. See:
https://sourceware.org/bugzilla/show_bug.cgi?id=22263
Also TLS code sequence in SH assembly syscalls in glibc doesn't match TLS
code sequence expected by ld:
https://sourceware.org/bugzilla/show_bug.cgi?id=22270
FAIL: glibcs-sparc64-linux-gnu build
FAIL: glibcs-sparcv9-linux-gnu build
FAIL: glibcs-tilegxbe-linux-gnu build
FAIL: glibcs-tilegxbe-linux-gnu-32 build
FAIL: glibcs-tilegx-linux-gnu build
FAIL: glibcs-tilegx-linux-gnu-32 build
FAIL: glibcs-tilepro-linux-gnu build
elf/sln is failed to link due to:
ld: read-only segment has dynamic relocations.
This is caused by linker bug and/or non-PIC code in PIE libc.a. See:
https://sourceware.org/bugzilla/show_bug.cgi?id=22263
[BZ #19574]
* INSTALL: Regenerated.
* Makeconfig (real-static-start-installed-name): New.
(pic-default): Updated for --enable-static-pie.
(pie-default): New for --enable-static-pie.
(default-pie-ldflag): Likewise.
(+link-static-before-libc): Replace $(DEFAULT-LDFLAGS-$(@F))
with $(if $($(@F)-no-pie),$(no-pie-ldflag),$(default-pie-ldflag)).
Replace $(static-start-installed-name) with
$(real-static-start-installed-name).
(+prectorT): Updated for --enable-static-pie.
(+postctorT): Likewise.
(CFLAGS-.o): Add $(pie-default).
(CFLAGS-.op): Likewise.
* NEWS: Mention --enable-static-pie.
* config.h.in (ENABLE_STATIC_PIE): New.
* configure.ac (--enable-static-pie): New configure option.
(have-no-dynamic-linker): New LIBC_CONFIG_VAR.
(have-static-pie): Likewise.
Enable static PIE if linker supports --no-dynamic-linker.
(ENABLE_STATIC_PIE): New AC_DEFINE.
(enable-static-pie): New LIBC_CONFIG_VAR.
* configure: Regenerated.
* csu/Makefile (omit-deps): Add r$(start-installed-name) and
gr$(start-installed-name) for --enable-static-pie.
(extra-objs): Likewise.
(install-lib): Likewise.
(extra-objs): Add static-reloc.o and static-reloc.os
($(objpfx)$(start-installed-name)): Also depend on
$(objpfx)static-reloc.o.
($(objpfx)r$(start-installed-name)): New.
($(objpfx)g$(start-installed-name)): Also depend on
$(objpfx)static-reloc.os.
($(objpfx)gr$(start-installed-name)): New.
* csu/libc-start.c (LIBC_START_MAIN): Call _dl_relocate_static_pie
in libc.a.
* csu/libc-tls.c (__libc_setup_tls): Add main_map->l_addr to
initimage.
* csu/static-reloc.c: New file.
* elf/Makefile (routines): Add dl-reloc-static-pie.
(elide-routines.os): Likewise.
(DEFAULT-LDFLAGS-tst-tls1-static-non-pie): Removed.
(tst-tls1-static-non-pie-no-pie): New.
* elf/dl-reloc-static-pie.c: New file.
* elf/dl-support.c (_dl_get_dl_main_map): New function.
* elf/dynamic-link.h (ELF_DURING_STARTUP): Also check
STATIC_PIE_BOOTSTRAP.
* elf/get-dynamic-info.h (elf_get_dynamic_info): Likewise.
* gmon/Makefile (tests): Add tst-gmon-static-pie.
(tests-static): Likewise.
(DEFAULT-LDFLAGS-tst-gmon-static): Removed.
(tst-gmon-static-no-pie): New.
(CFLAGS-tst-gmon-static-pie.c): Likewise.
(CRT-tst-gmon-static-pie): Likewise.
(tst-gmon-static-pie-ENV): Likewise.
(tests-special): Likewise.
($(objpfx)tst-gmon-static-pie.out): Likewise.
(clean-tst-gmon-static-pie-data): Likewise.
($(objpfx)tst-gmon-static-pie-gprof.out): Likewise.
* gmon/tst-gmon-static-pie.c: New file.
* manual/install.texi: Document --enable-static-pie.
* sysdeps/generic/ldsodefs.h (_dl_relocate_static_pie): New.
(_dl_get_dl_main_map): Likewise.
* sysdeps/i386/configure.ac: Check if linker supports static PIE.
* sysdeps/x86_64/configure.ac: Likewise.
* sysdeps/i386/configure: Regenerated.
* sysdeps/x86_64/configure: Likewise.
* sysdeps/mips/Makefile (ASFLAGS-.o): Add $(pie-default).
(ASFLAGS-.op): Likewise.
|
|
SXID_ERASE is implicit for all environment variables. Avoid
mentioning it in the tunables list; that way only the ones with
SXID_IGNORE remain prominent and mentioned. TODO: we need to audit
each of those cases and drop them to SXID_ERASE wherever possible.
|
|
|
|
|
|
A glibc master build with --enable-nss-crypt using the NSS
crypto libraries fails during make check with the following error:
<command-line>:0:0: error: "USE_CRYPT" redefined [-Werror]
<command-line>:0:0: note: this is the location of the previous
definition
This is caused by commit 36975e8e7ea227f7006abdc722ecfefe2079429b
by H.J. Lu which replaces all = with +=. The fix is to undefine
USE_CRYPT before defining it to zero.
Committed as an obvious fix. Fixes the build issue on x86_64 with
no regressions.
Signed-off-by: Carlos O'Donell <carlos@redhat.com>
|
|
Replace = with += in CFLAGS-xxx.c and CPPFLAGS-xxx.c to allow Makefile
under sysdeps to define CFLAGS-xx.c and CPPFLAGS-xxx.c.
* argp/Makefile (CFLAGS-argp-help.c): Replace = with +=.
(CFLAGS-argp-parse.c): Likewise.
(CFLAGS-argp-fmtstream.c): Likewise.
* crypt/Makefile (CPPFLAGS-sha256-crypt.c): Likewise.
(CPPFLAGS-sha512-crypt.c): Likewise.
(CPPFLAGS-md5-crypt.c): Likewise.
* debug/Makefile (CFLAGS-stack_chk_fail.c): Likewise.
(CFLAGS-stack_chk_fail_local.c): Likewise.
(CFLAGS-backtrace.c): Likewise.
(CFLAGS-sprintf_chk.c): Likewise.
(CFLAGS-snprintf_chk.c): Likewise.
(CFLAGS-vsprintf_chk.c): Likewise.
(CFLAGS-vsnprintf_chk.c): Likewise.
(CFLAGS-asprintf_chk.c): Likewise.
(CFLAGS-vasprintf_chk.c): Likewise.
(CFLAGS-obprintf_chk.c): Likewise.
(CFLAGS-dprintf_chk.c): Likewise.
(CFLAGS-vdprintf_chk.c): Likewise.
(CFLAGS-printf_chk.c): Likewise.
(CFLAGS-fprintf_chk.c): Likewise.
(CFLAGS-vprintf_chk.c): Likewise.
(CFLAGS-vfprintf_chk.c): Likewise.
(CFLAGS-gets_chk.c): Likewise.
(CFLAGS-fgets_chk.c): Likewise.
(CFLAGS-fgets_u_chk.c): Likewise.
(CFLAGS-fread_chk.c): Likewise.
(CFLAGS-fread_u_chk.c): Likewise.
(CFLAGS-swprintf_chk.c): Likewise.
(CFLAGS-vswprintf_chk.c): Likewise.
(CFLAGS-wprintf_chk.c): Likewise.
(CFLAGS-fwprintf_chk.c): Likewise.
(CFLAGS-vwprintf_chk.c): Likewise.
(CFLAGS-vfwprintf_chk.c): Likewise.
(CFLAGS-fgetws_chk.c): Likewise.
(CFLAGS-fgetws_u_chk.c): Likewise.
(CFLAGS-read_chk.c): Likewise.
(CFLAGS-pread_chk.c): Likewise.
(CFLAGS-pread64_chk.c): Likewise.
(CFLAGS-recv_chk.c): Likewise.
(CFLAGS-recvfrom_chk.c): Likewise.
(CFLAGS-tst-longjmp_chk.c): Likewise.
(CPPFLAGS-tst-longjmp_chk.c): Likewise.
(CFLAGS-tst-longjmp_chk2.c): Likewise.
(CPPFLAGS-tst-longjmp_chk2.c): Likewise.
(CFLAGS-tst-longjmp_chk3.c): Likewise.
(CPPFLAGS-tst-longjmp_chk3.c): Likewise.
(CFLAGS-tst-chk1.c): Likewise.
(CFLAGS-tst-chk2.c): Likewise.
(CFLAGS-tst-chk3.c): Likewise.
(CFLAGS-tst-chk4.cc): Likewise.
(CFLAGS-tst-chk5.cc): Likewise.
(CFLAGS-tst-chk6.cc): Likewise.
(CFLAGS-tst-lfschk1.c): Likewise.
(CFLAGS-tst-lfschk2.c): Likewise.
(CFLAGS-tst-lfschk3.c): Likewise.
(CFLAGS-tst-lfschk4.cc): Likewise.
(CFLAGS-tst-lfschk5.cc): Likewise.
(CFLAGS-tst-lfschk6.cc): Likewise.
(CFLAGS-tst-ssp-1.c): Likewise.
* dirent/Makefile (CFLAGS-scandir.c): Likewise.
(CFLAGS-scandir64.c): Likewise.
(CFLAGS-scandir-tail.c): Likewise.
(CFLAGS-scandir64-tail.c): Likewise.
* elf/Makefile (CPPFLAGS-dl-tunables.c): Likewise.
(CFLAGS-dl-tunables.c): Likewise.
(CFLAGS-dl-runtime.c): Likewise.
(CFLAGS-dl-lookup.c): Likewise.
(CFLAGS-dl-iterate-phdr.c): Likewise.
(CFLAGS-vismain.c): Likewise.
(CFLAGS-tst-linkall-static.c): Likewise.
(CFLAGS-tst-linkall-static.c): Likewise.
(CPPFLAGS-dl-load.c): Likewise.
(CFLAGS-ldconfig.c): Likewise.
(CFLAGS-dl-cache.c): Likewise.
(CFLAGS-cache.c): Likewise.
(CFLAGS-rtld.c): Likewise.
(CFLAGS-multiload.c): Likewise.
(CFLAGS-filtmod1.c): Likewise.
(CFLAGS-tst-align.c): Likewise.
(CFLAGS-tst-align2.c): Likewise.
(CFLAGS-tst-alignmod.c): Likewise.
(CFLAGS-tst-alignmod2.c): Likewise.
(CPPFLAGS-tst-execstack.c): Likewise.
(CFLAGS-tst-ptrguard1-static.c): Likewise.
(CFLAGS-tst-latepthreadmod.c): Likewise.
* grp/Makefile (CFLAGS-getgrgid_r.c): Likewise.
(CFLAGS-getgrnam_r.c): Likewise.
(CFLAGS-getgrent_r.c): Likewise.
(CFLAGS-getgrent.c): Likewise.
(CFLAGS-fgetgrent.c): Likewise.
(CFLAGS-fgetgrent_r.c): Likewise.
(CFLAGS-putgrent.c): Likewise.
(CFLAGS-initgroups.c): Likewise.
(CFLAGS-getgrgid.c): Likewise.
* gshadow/Makefile (CFLAGS-getsgent_r.c): Likewise.
(CFLAGS-getsgent.c): Likewise.
(CFLAGS-fgetsgent.c): Likewise.
(CFLAGS-fgetsgent_r.c): Likewise.
(CFLAGS-putsgent.c): Likewise.
(CFLAGS-getsgnam.c): Likewise.
(CFLAGS-getsgnam_r.c): Likewise.
* iconv/Makefile (CFLAGS-iconv_prog.c): Likewise.
(CFLAGS-iconv_charmap.c): Likewise.
(CFLAGS-dummy-repertoire.c): Likewise.
(CFLAGS-charmap.c): Likewise.
(CFLAGS-linereader.c): Likewise.
(CFLAGS-simple-hash.c): Likewise.
(CFLAGS-gconv_conf.c): Likewise.
(CFLAGS-iconvconfig.c): Likewise.
* inet/Makefile (CFLAGS-gethstbyad_r.c): Likewise.
(CFLAGS-gethstbyad.c): Likewise.
(CFLAGS-gethstbynm_r.c): Likewise.
(CFLAGS-gethstbynm.c): Likewise.
(CFLAGS-gethstbynm2_r.c): Likewise.
(CFLAGS-gethstbynm2.c): Likewise.
(CFLAGS-gethstent_r.c): Likewise.
(CFLAGS-gethstent.c): Likewise.
(CFLAGS-rcmd.c): Likewise.
(CFLAGS-getnetbynm_r.c): Likewise.
(CFLAGS-getnetbynm.c): Likewise.
(CFLAGS-getnetbyad_r.c): Likewise.
(CFLAGS-getnetbyad.c): Likewise.
(CFLAGS-getnetent_r.c): Likewise.
(CFLAGS-getnetent.c): Likewise.
(CFLAGS-getaliasent_r.c): Likewise.
(CFLAGS-getaliasent.c): Likewise.
(CFLAGS-getrpcent_r.c): Likewise.
(CFLAGS-getrpcent.c): Likewise.
(CFLAGS-getservent_r.c): Likewise.
(CFLAGS-getservent.c): Likewise.
(CFLAGS-getprtent_r.c): Likewise.
(CFLAGS-getprtent.c): Likewise.
(CFLAGS-either_ntoh.c): Likewise.
(CFLAGS-either_hton.c): Likewise.
(CFLAGS-getnetgrent.c): Likewise.
(CFLAGS-getnetgrent_r.c): Likewise.
(CFLAGS-tst-checks-posix.c): Likewise.
(CFLAGS-tst-sockaddr.c): Likewise.
* intl/Makefile (CFLAGS-tst-gettext.c): Likewise.
(CFLAGS-tst-translit.c): Likewise.
(CFLAGS-tst-gettext2.c): Likewise.
(CFLAGS-tst-codeset.c): Likewise.
(CFLAGS-tst-gettext3.c): Likewise.
(CFLAGS-tst-gettext4.c): Likewise.
(CFLAGS-tst-gettext5.c): Likewise.
(CFLAGS-tst-gettext6.c): Likewise.
* io/Makefile (CFLAGS-open.c): Likewise.
(CFLAGS-open64.c): Likewise.
(CFLAGS-creat.c): Likewise.
(CFLAGS-creat64.c): Likewise.
(CFLAGS-fcntl.c): Likewise.
(CFLAGS-poll.c): Likewise.
(CFLAGS-ppoll.c): Likewise.
(CFLAGS-lockf.c): Likewise.
(CFLAGS-statfs.c): Likewise.
(CFLAGS-fstatfs.c): Likewise.
(CFLAGS-statvfs.c): Likewise.
(CFLAGS-fstatvfs.c): Likewise.
(CFLAGS-fts.c): Likewise.
(CFLAGS-fts64.c): Likewise.
(CFLAGS-ftw.c): Likewise.
(CFLAGS-ftw64.c): Likewise.
(CFLAGS-lockf.c): Likewise.
(CFLAGS-posix_fallocate.c): Likewise.
(CFLAGS-posix_fallocate64.c): Likewise.
(CFLAGS-fallocate.c): Likewise.
(CFLAGS-fallocate64.c): Likewise.
(CFLAGS-read.c): Likewise.
(CFLAGS-write.c): Likewise.
(CFLAGS-test-stat.c): Likewise.
(CFLAGS-test-lfs.c): Likewise.
* libio/Makefile (CFLAGS-fileops.c): Likewise.
(CFLAGS-fputc.c): Likewise.
(CFLAGS-fputwc.c): Likewise.
(CFLAGS-freopen64.c): Likewise.
(CFLAGS-freopen.c): Likewise.
(CFLAGS-fseek.c): Likewise.
(CFLAGS-fseeko64.c): Likewise.
(CFLAGS-fseeko.c): Likewise.
(CFLAGS-ftello64.c): Likewise.
(CFLAGS-ftello.c): Likewise.
(CFLAGS-fwide.c): Likewise.
(CFLAGS-genops.c): Likewise.
(CFLAGS-getc.c): Likewise.
(CFLAGS-getchar.c): Likewise.
(CFLAGS-getwc.c): Likewise.
(CFLAGS-getwchar.c): Likewise.
(CFLAGS-iofclose.c): Likewise.
(CFLAGS-iofflush.c): Likewise.
(CFLAGS-iofgetpos64.c): Likewise.
(CFLAGS-iofgetpos.c): Likewise.
(CFLAGS-iofgets.c): Likewise.
(CFLAGS-iofgetws.c): Likewise.
(CFLAGS-iofputs.c): Likewise.
(CFLAGS-iofputws.c): Likewise.
(CFLAGS-iofread.c): Likewise.
(CFLAGS-iofsetpos64.c): Likewise.
(CFLAGS-iofsetpos.c): Likewise.
(CFLAGS-ioftell.c): Likewise.
(CFLAGS-iofwrite.c): Likewise.
(CFLAGS-iogetdelim.c): Likewise.
(CFLAGS-iogetline.c): Likewise.
(CFLAGS-iogets.c): Likewise.
(CFLAGS-iogetwline.c): Likewise.
(CFLAGS-ioputs.c): Likewise.
(CFLAGS-ioseekoff.c): Likewise.
(CFLAGS-ioseekpos.c): Likewise.
(CFLAGS-iosetbuffer.c): Likewise.
(CFLAGS-iosetvbuf.c): Likewise.
(CFLAGS-ioungetc.c): Likewise.
(CFLAGS-ioungetwc.c): Likewise.
(CFLAGS-oldfileops.c): Likewise.
(CFLAGS-oldiofclose.c): Likewise.
(CFLAGS-oldiofgetpos64.c): Likewise.
(CFLAGS-oldiofgetpos.c): Likewise.
(CFLAGS-oldiofsetpos64.c): Likewise.
(CFLAGS-oldiofsetpos.c): Likewise.
(CFLAGS-peekc.c): Likewise.
(CFLAGS-putc.c): Likewise.
(CFLAGS-putchar.c): Likewise.
(CFLAGS-putwc.c): Likewise.
(CFLAGS-putwchar.c): Likewise.
(CFLAGS-rewind.c): Likewise.
(CFLAGS-wfileops.c): Likewise.
(CFLAGS-wgenops.c): Likewise.
(CFLAGS-oldiofopen.c): Likewise.
(CFLAGS-iofopen.c): Likewise.
(CFLAGS-iofopen64.c): Likewise.
(CFLAGS-oldtmpfile.c): Likewise.
(CFLAGS-tst_putwc.c): Likewise.
* locale/Makefile (CFLAGS-md5.c): Likewise.
(CFLAGS-charmap.c): Likewise.
(CFLAGS-locfile.c): Likewise.
(CFLAGS-charmap-dir.c): Likewise.
* login/Makefile (CFLAGS-grantpt.c): Likewise.
(CFLAGS-getpt.c): Likewise.
(CFLAGS-pt_chown.c): Likewise.
* malloc/Makefile (CFLAGS-mcheck-init.c): Likewise.
(CFLAGS-obstack.c): Likewise.
* math/Makefile (CFLAGS-test-tgmath3.c): Likewise.
(CFLAGS-test-double-vlen4-wrappers.c): Likewise.
(CFLAGS-test-double-vlen8-wrappers.c): Likewise.
(CFLAGS-test-float-vlen8-wrappers.c): Likewise.
(CFLAGS-test-float-vlen16-wrappers.c): Likewise.
(CFLAGS-test-tgmath.c): Likewise.
(CFLAGS-test-tgmath2.c): Likewise.
(CFLAGS-test-tgmath-ret.c): Likewise.
(CFLAGS-test-powl.c): Likewise.
(CFLAGS-test-snan.c): Likewise.
(CFLAGS-test-signgam-finite.c): Likewise.
(CFLAGS-test-signgam-finite-c99.c): Likewise.
(CFLAGS-test-signgam-finite-c11.c): Likewise.
(CFLAGS-test-signgam-uchar.c): Likewise.
(CFLAGS-test-signgam-uchar-init.c): Likewise.
(CFLAGS-test-signgam-uchar-static.c): Likewise.
(CFLAGS-test-signgam-uchar-init-static.c): Likewise.
(CFLAGS-test-signgam-uint.c): Likewise.
(CFLAGS-test-signgam-uint-init.c): Likewise.
(CFLAGS-test-signgam-uint-static.c): Likewise.
(CFLAGS-test-signgam-uint-init-static.c): Likewise.
(CFLAGS-test-signgam-ullong.c): Likewise.
(CFLAGS-test-signgam-ullong-init.c): Likewise.
(CFLAGS-test-signgam-ullong-static.c): Likewise.
(CFLAGS-test-signgam-ullong-init-static.c): Likewise.
(CFLAGS-test-math-cxx11.cc): Likewise.
(CFLAGS-test-math-isinff.cc): Likewise.
(CFLAGS-test-math-iszero.cc): Likewise.
(CFLAGS-test-math-issignaling.cc): Likewise.
(CFLAGS-test-math-iscanonical.cc): Likewise.
(CFLAGS-test-iszero-excess-precision.c): Likewise.
(CFLAGS-test-iseqsig-excess-precision.c): Likewise.
(CFLAGS-test-flt-eval-method.c): Likewise.
(CFLAGS-test-fe-snans-always-signal.c): Likewise.
(CFLAGS-test-finite-macros.c): Likewise.
* misc/Makefile (CFLAGS-select.c): Likewise.
(CFLAGS-tsearch.c): Likewise.
(CFLAGS-lsearch.c): Likewise.
(CFLAGS-pselect.c): Likewise.
(CFLAGS-readv.c): Likewise.
(CFLAGS-writev.c): Likewise.
(CFLAGS-preadv.c): Likewise.
(CFLAGS-preadv64.c): Likewise.
(CFLAGS-pwritev.c): Likewise.
(CFLAGS-pwritev64.c): Likewise.
(CFLAGS-preadv2.c): Likewise.
(CFLAGS-preadv64v2.c): Likewise.
(CFLAGS-pwritev2.c): Likewise.
(CFLAGS-pwritev64v2.c): Likewise.
(CFLAGS-usleep.c): Likewise.
(CFLAGS-syslog.c): Likewise.
(CFLAGS-error.c): Likewise.
(CFLAGS-getpass.c): Likewise.
(CFLAGS-mkstemp.c): Likewise.
(CFLAGS-mkstemp64.c): Likewise.
(CFLAGS-getsysstats.c): Likewise.
(CFLAGS-getusershell.c): Likewise.
(CFLAGS-err.c): Likewise.
(CFLAGS-tst-tsearch.c): Likewise.
(CFLAGS-msync.c): Likewise.
(CFLAGS-fdatasync.c): Likewise.
(CFLAGS-fsync.c): Likewise.
* nptl/Makefile (CFLAGS-nptl-init.c): Likewise.
(CFLAGS-unwind.c): Likewise.
(CFLAGS-unwind-forcedunwind.c): Likewise.
(CFLAGS-pthread_cancel.c): Likewise.
(CFLAGS-pthread_setcancelstate.c): Likewise.
(CFLAGS-pthread_setcanceltype.c): Likewise.
(CFLAGS-cancellation.c): Likewise.
(CFLAGS-libc-cancellation.c): Likewise.
(CFLAGS-pthread_exit.c): Likewise.
(CFLAGS-forward.c): Likewise.
(CFLAGS-pthread_testcancel.c): Likewise.
(CFLAGS-pthread_join.c): Likewise.
(CFLAGS-pthread_timedjoin.c): Likewise.
(CFLAGS-pthread_once.c): Likewise.
(CFLAGS-pthread_cond_wait.c): Likewise.
(CFLAGS-sem_wait.c): Likewise.
(CFLAGS-sem_timedwait.c): Likewise.
(CFLAGS-fcntl.c): Likewise.
(CFLAGS-lockf.c): Likewise.
(CFLAGS-pread.c): Likewise.
(CFLAGS-pread64.c): Likewise.
(CFLAGS-pwrite.c): Likewise.
(CFLAGS-pwrite64.c): Likewise.
(CFLAGS-wait.c): Likewise.
(CFLAGS-waitpid.c): Likewise.
(CFLAGS-sigwait.c): Likewise.
(CFLAGS-msgrcv.c): Likewise.
(CFLAGS-msgsnd.c): Likewise.
(CFLAGS-tcdrain.c): Likewise.
(CFLAGS-open.c): Likewise.
(CFLAGS-open64.c): Likewise.
(CFLAGS-pause.c): Likewise.
(CFLAGS-recv.c): Likewise.
(CFLAGS-send.c): Likewise.
(CFLAGS-accept.c): Likewise.
(CFLAGS-sendto.c): Likewise.
(CFLAGS-connect.c): Likewise.
(CFLAGS-recvfrom.c): Likewise.
(CFLAGS-recvmsg.c): Likewise.
(CFLAGS-sendmsg.c): Likewise.
(CFLAGS-close.c): Likewise.
(CFLAGS-read.c): Likewise.
(CFLAGS-write.c): Likewise.
(CFLAGS-nanosleep.c): Likewise.
(CFLAGS-sigsuspend.c): Likewise.
(CFLAGS-msync.c): Likewise.
(CFLAGS-fdatasync.c): Likewise.
(CFLAGS-fsync.c): Likewise.
(CFLAGS-pt-system.c): Likewise.
(CFLAGS-tst-cleanup2.c): Likewise.
(CFLAGS-tst-cleanupx2.c): Likewise.
(CFLAGS-flockfile.c): Likewise.
(CFLAGS-ftrylockfile.c): Likewise.
(CFLAGS-funlockfile.c): Likewise.
(CFLAGS-tst-initializers1.c): Likewise.
(CFLAGS-tst-initializers1-c89.c): Likewise.
(CFLAGS-tst-initializers1-c99.c): Likewise.
(CFLAGS-tst-initializers1-c11.c): Likewise.
(CFLAGS-tst-initializers1-gnu89.c): Likewise.
(CFLAGS-tst-initializers1-gnu99.c): Likewise.
(CFLAGS-tst-initializers1-gnu11.c): Likewise.
* nscd/Makefile (CFLAGS-nscd_getpw_r.c): Likewise.
(CFLAGS-nscd_getgr_r.c): Likewise.
(CFLAGS-nscd_gethst_r.c): Likewise.
(CFLAGS-nscd_getai.c): Likewise.
(CFLAGS-nscd_initgroups.c): Likewise.
* posix/Makefile (CFLAGS-getaddrinfo.c): Likewise.
(CFLAGS-pause.c): Likewise.
(CFLAGS-pread.c): Likewise.
(CFLAGS-pread64.c): Likewise.
(CFLAGS-pwrite.c): Likewise.
(CFLAGS-pwrite64.c): Likewise.
(CFLAGS-sleep.c): Likewise.
(CFLAGS-wait.c): Likewise.
(CFLAGS-waitid.c): Likewise.
(CFLAGS-waitpid.c): Likewise.
(CFLAGS-getopt.c): Likewise.
(CFLAGS-wordexp.c): Likewise.
(CFLAGS-sysconf.c): Likewise.
(CFLAGS-pathconf.c): Likewise.
(CFLAGS-fpathconf.c): Likewise.
(CFLAGS-spawn.c): Likewise.
(CFLAGS-spawnp.c): Likewise.
(CFLAGS-spawni.c): Likewise.
(CFLAGS-glob.c): Likewise.
(CFLAGS-glob64.c): Likewise.
(CFLAGS-getconf.c): Likewise.
(CFLAGS-nanosleep.c): Likewise.
* pwd/Makefile (CFLAGS-getpwent_r.c): Likewise.
(CFLAGS-getpwent.c): Likewise.
(CFLAGS-getpw.c): Likewise.
(CFLAGS-fgetpwent_r.c): Likewise.
* resolv/Makefile (CFLAGS-res_hconf.c): Likewise.
* rt/Makefile (CFLAGS-aio_suspend.c): Likewise.
(CFLAGS-mq_timedreceive.c): Likewise.
(CFLAGS-mq_timedsend.c): Likewise.
(CFLAGS-clock_nanosleep.c): Likewise.
(CFLAGS-librt-cancellation.c): Likewise.
* shadow/Makefile (CFLAGS-getspent_r.c): Likewise.
(CFLAGS-getspent.c): Likewise.
(CFLAGS-fgetspent.c): Likewise.
(CFLAGS-fgetspent_r.c): Likewise.
(CFLAGS-putspent.c): Likewise.
(CFLAGS-getspnam.c): Likewise.
(CFLAGS-getspnam_r.c): Likewise.
* signal/Makefile (CFLAGS-sigpause.c): Likewise.
(CFLAGS-sigsuspend.c): Likewise.
(CFLAGS-sigtimedwait.c): Likewise.
(CFLAGS-sigwait.c): Likewise.
(CFLAGS-sigwaitinfo.c): Likewise.
(CFLAGS-sigreturn.c): Likewise.
* stdio-common/Makefile (CFLAGS-vfprintf.c): Likewise.
(CFLAGS-vfwprintf.c): Likewise.
(CFLAGS-tmpfile.c): Likewise.
(CFLAGS-tmpfile64.c): Likewise.
(CFLAGS-tempname.c): Likewise.
(CFLAGS-psignal.c): Likewise.
(CFLAGS-vprintf.c): Likewise.
(CFLAGS-cuserid.c): Likewise.
(CFLAGS-errlist.c): Likewise.
(CFLAGS-siglist.c): Likewise.
(CFLAGS-scanf15.c): Likewise.
(CFLAGS-scanf17.c): Likewise.
* stdlib/Makefile (CFLAGS-bsearch.c): Likewise.
(CFLAGS-msort.c): Likewise.
(CFLAGS-qsort.c): Likewise.
(CFLAGS-system.c): Likewise.
(CFLAGS-fmtmsg.c): Likewise.
(CFLAGS-strfmon.c): Likewise.
(CFLAGS-strfmon_l.c): Likewise.
(CFLAGS-strfromd.c): Likewise.
(CFLAGS-strfromf.c): Likewise.
(CFLAGS-strfroml.c): Likewise.
(CFLAGS-tst-bsearch.c): Likewise.
(CFLAGS-tst-qsort.c): Likewise.
(CFLAGS-tst-makecontext2.c): Likewise.
* sunrpc/Makefile (CFLAGS-xbootparam_prot.c): Likewise.
(CFLAGS-xnlm_prot.c): Likewise.
(CFLAGS-xrstat.c): Likewise.
(CFLAGS-xyppasswd.c): Likewise.
(CFLAGS-xklm_prot.c): Likewise.
(CFLAGS-xrex.c): Likewise.
(CFLAGS-xsm_inter.c): Likewise.
(CFLAGS-xmount.c): Likewise.
(CFLAGS-xrusers.c): Likewise.
(CFLAGS-xspray.c): Likewise.
(CFLAGS-xnfs_prot.c): Likewise.
(CFLAGS-xrquota.c): Likewise.
(CFLAGS-xkey_prot.c): Likewise.
(CFLAGS-auth_unix.c): Likewise.
(CFLAGS-key_call.c): Likewise.
(CFLAGS-pmap_rmt.c): Likewise.
(CFLAGS-clnt_perr.c): Likewise.
(CFLAGS-openchild.c): Likewise.
* sysvipc/Makefile (CFLAGS-msgrcv.c): Likewise.
(CFLAGS-msgsnd.c): Likewise.
* termios/Makefile (CFLAGS-tcdrain.c): Likewise.
* time/Makefile (CFLAGS-tzfile.c): Likewise.
(CFLAGS-tzset.c): Likewise.
(CFLAGS-getdate.c): Likewise.
(CFLAGS-test_time.c): Likewise.
(CPPFLAGS-tst-tzname.c): Likewise.
* timezone/Makefile (CFLAGS-zdump.c): Likewise.
(CFLAGS-zic.c): Likewise.
* wcsmbs/Makefile (CFLAGS-wcwidth.c): Likewise.
(CFLAGS-wcswidth.c): Likewise.
(CFLAGS-wcstol.c): Likewise.
(CFLAGS-wcstoul.c): Likewise.
(CFLAGS-wcstoll.c): Likewise.
(CFLAGS-wcstoull.c): Likewise.
(CFLAGS-wcstod.c): Likewise.
(CFLAGS-wcstold.c): Likewise.
(CFLAGS-wcstof128.c): Likewise.
(CFLAGS-wcstof.c): Likewise.
(CFLAGS-wcstol_l.c): Likewise.
(CFLAGS-wcstoul_l.c): Likewise.
(CFLAGS-wcstoll_l.c): Likewise.
(CFLAGS-wcstoull_l.c): Likewise.
(CFLAGS-wcstod_l.c): Likewise.
(CFLAGS-wcstold_l.c): Likewise.
(CFLAGS-wcstof128_l.c): Likewise.
(CFLAGS-wcstof_l.c): Likewise.
(CPPFLAGS-tst-wchar-h.c): Likewise.
(CPPFLAGS-wcstold_l.c): Likewise.
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
|
|
#22577]
Changelog:
* elf/rtld.c (init_tls): Add missing new line to the _dl_fatal_printf
call.
|
|
This patch adds several new tunables to control the behavior of
elision on supported platforms[1]. Since elision now depends
on tunables, we should always *compile* with elision enabled,
and leave the code disabled, but available for runtime
selection. This gives us *much* better compile-time testing of
the existing code to avoid bit-rot[2].
Tested on ppc, ppc64, ppc64le, s390x and x86_64.
[1] This part of the patch was initially proposed by
Paul Murphy but was "staled" because the framework have changed
since the patch was originally proposed:
https://patchwork.sourceware.org/patch/10342/
[2] This part of the patch was inititally proposed as a RFC by
Carlos O'Donnell. Make sense to me integrate this on the patch:
https://sourceware.org/ml/libc-alpha/2017-05/msg00335.html
* elf/dl-tunables.list: Add elision parameters.
* manual/tunables.texi: Add entries about elision tunable.
* sysdeps/unix/sysv/linux/powerpc/elision-conf.c:
Add callback functions to dynamically enable/disable elision.
Add multiple callbacks functions to set elision parameters.
Deleted __libc_enable_secure check.
* sysdeps/unix/sysv/linux/s390/elision-conf.c: Likewise.
* sysdeps/unix/sysv/linux/x86/elision-conf.c: Likewise.
* configure: Regenerated.
* configure.ac: Option enable_lock_elision was deleted.
* config.h.in: ENABLE_LOCK_ELISION flag was deleted.
* config.make.in: Remove references to enable_lock_elision.
* manual/install.texi: Elision configure option was removed.
* INSTALL: Regenerated to remove enable_lock_elision.
* nptl/Makefile:
Disable elision so it can verify error case for destroying a mutex.
* sysdeps/powerpc/nptl/elide.h:
Cleanup ENABLE_LOCK_ELISION check.
Deleted macros for the case when ENABLE_LOCK_ELISION was not defined.
* sysdeps/s390/configure: Regenerated.
* sysdeps/s390/configure.ac: Remove references to enable_lock_elision..
* nptl/tst-mutex8.c:
Deleted all #ifndef ENABLE_LOCK_ELISION from the test.
* sysdeps/powerpc/powerpc32/sysdep.h:
Deleted all ENABLE_LOCK_ELISION checks.
* sysdeps/powerpc/powerpc64/sysdep.h: Likewise.
* sysdeps/powerpc/sysdep.h: Likewise.
* sysdeps/s390/nptl/bits/pthreadtypes-arch.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/force-elision.h: Likewise.
* sysdeps/unix/sysv/linux/s390/elision-conf.h: Likewise.
* sysdeps/unix/sysv/linux/s390/force-elision.h: Likewise.
* sysdeps/unix/sysv/linux/s390/lowlevellock.h: Likewise.
* sysdeps/unix/sysv/linux/s390/Makefile: Remove references to
enable-lock-elision.
Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
|
|
A note header has 3 4-bytes fields, followed by note name and note
descriptor. According to gABI, in a note entry, the note name field,
not note name size, is padded for the note descriptor. And the note
descriptor field, not note descriptor size, is padded for the next
note entry. Notes are aligned to 4 bytes in 32-bit objects and 8 bytes
in 64-bit objects.
For all GNU notes, the name is "GNU" which is 4 bytes. They have the
same format in the first 16 bytes in both 32-bit and 64-bit objects.
They differ by note descriptor size and note type. So far, .note.ABI-tag
and .note.gnu.build-id notes are always aligned to 4 bytes. The exsting
codes compute the note size by aligning the note name size and note
descriptor size to 4 bytes. It happens to produce the same value as
the actual note size by luck since the name size is 4 and offset of the
note descriptor is 16. But it will produce the wrong size when note
alignment is 8 bytes in 64-bit objects.
This patch defines ELF_NOTE_DESC_OFFSET and ELF_NOTE_NEXT_OFFSET to
properly compute offsets of note descriptor and next note. It uses
alignment of PT_NOTE segment to support both 4-byte and 8-byte note
alignments in 64-bit objects. To handle PT_NOTE segments with
incorrect alignment, which may lead to an infinite loop, if segment
alignment is less than 4, we treate alignment as 4 bytes since some
note segments have 0 or 1 byte alignment.
[BZ #22370]
* elf/dl-hwcaps.c (ROUND): Removed.
(_dl_important_hwcaps): Replace ROUND with ELF_NOTE_DESC_OFFSET
and ELF_NOTE_NEXT_OFFSET.
* elf/dl-load.c (ROUND): Removed.
(open_verify): Replace ROUND with ELF_NOTE_NEXT_OFFSET.
* elf/readelflib.c (ROUND): Removed.
(process_elf_file): Replace ROUND with ELF_NOTE_NEXT_OFFSET.
* include/elf.h [!_ISOMAC]: Include <libc-pointer-arith.h>.
[!_ISOMAC] (ELF_NOTE_DESC_OFFSET): New.
[!_ISOMAC] (ELF_NOTE_NEXT_OFFSET): Likewise.
|
|
Combine the four places where link maps are sorted into a single function.
This also moves the logic to skip the first map (representing the main
binary) to the callers.
|
|
To support Intel Control-flow Enforcement Technology (CET) run-time
control:
1. An architecture specific field in the writable ld.so namespace is
needed to indicate if CET features are enabled at run-time.
2. An architecture specific field in struct link_map is needed if
CET features are enabled in an ELF module.
This patch adds dl-procruntime.c to the writable ld.so namespace and
link_map.h to struct link_map.
Tested with build-many-glibcs.py.
* elf/dl-support.c: Include <dl-procruntime.c>.
* include/link.h: Include <link_map.h>.
* sysdeps/generic/dl-procruntime.c: New file.
* sysdeps/generic/link_map.h: Likewise.
* sysdeps/generic/ldsodefs.h: Include <dl-procruntime.c> in
the writable ld.so namespace.
|
|
These static functions are not needed if a target does not do lazy
tlsdesc initialization.
* elf/tlsdeschtab.h (_dl_tls_resolve_early_return_p): Mark unused.
(_dl_tlsdesc_wake_up_held_fixups): Likewise.
|
|
References remain in io/fts.c, io/ftw.c, posix/glob.c,
sysdeps/posix/getcwd.c. These files are (potentially) externally
shared.
|
|
Use $(LDFLAGS-$(@F)) with tst-tls1-static-non-pie may not be sufficient
when static PIE is built by default. Use $(DEFAULT-LDFLAGS-$(@F)) in
+link-static-before-libc to make sure that tst-tls1-static-non-pie is
always built as non-PIE static executable and make sure that crt1.o is
used with tst-tls1-static-non-pie.
* Makeconfig (+link-static-before-libc): Use
$(DEFAULT-LDFLAGS-$(@F)).
* elf/Makefile (CRT-tst-tls1-static-non-pie): New.
(LDFLAGS-tst-tls1-static-non-pie): Renamed to ...
(DEFAULT-LDFLAGS-tst-tls1-static-non-pie): This.
|
|
Verify that crt1.o can be used with main () in a shared object.
* elf/Makefile (tests): Add tst-main1.
(modules-names): Add tst-main1mod.
($(objpfx)tst-main1): New.
(CRT-tst-main1): Likewise.
(LDFLAGS-tst-main1): Likewise.
(LDLIBS-tst-main1): Likewise.
(tst-main1mod.so-no-z-defs): Likewise.
* elf/tst-main1.c: New file.
* elf/tst-main1mod.c: Likewise.
|
|
(&_dl_main_map) is used instead of (&bootstrap_map) to bootstrap static
PIE. Define BOOTSTRAP_MAP with (&_dl_main_map) to avoid hardcode to
(&bootstrap_map).
* elf/rtld.c (BOOTSTRAP_MAP): New.
(RESOLVE_MAP): Replace (&bootstrap_map) with BOOTSTRAP_MAP.
* sysdeps/hppa/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC):
Likewise.
* sysdeps/ia64/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC):
Likewise.
* sysdeps/mips/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC):
Likewise.
|
|
__dl_iterate_phdr is hidden and should be accessed directly within
libc.so and libc.a without using GOT nor PLT.
[BZ #18822]
* elf/dl-iteratephdr.c (hidden_proto (__dl_iterate_phdr)): Moved
to ...
* include/link.h (hidden_proto (__dl_iterate_phdr)): Here.
|
|
tst-tls1-static-non-pie is built with $(no-pie-ldflag) to make it a
non-PIE static executable, regardless if --enable-static-pie is used
to configure glibc.
* elf/Makefile (tests-static-internal): Add
tst-tls1-static-non-pie.
(LDFLAGS-tst-tls1-static-non-pie): New.
* elf/tst-tls1-static-non-pie.c: New file.
|
|
Current implementation of tunables does not set arena_max and arena_test
values. Any value provided by glibc.malloc.arena_max and
glibc.malloc.arena_test parameters is ignored.
These tunables have minval value set to 1 (see elf/dl-tunables.list file)
and undefined maxval value. In that case default value (which is 0. see
scripts/gen-tunables.awk) is being used to set maxval.
For instance, generated tunable_list[] entry for arena_max is:
(gdb) p *cur
$1 = {name = 0x7ffff7df6217 "glibc.malloc.arena_max",
type = {type_code = TUNABLE_TYPE_SIZE_T, min = 1, max = 0},
val = {numval = 0, strval = 0x0}, initialized = false,
security_level = TUNABLE_SECLEVEL_SXID_IGNORE,
env_alias = 0x7ffff7df622e "MALLOC_ARENA_MAX"}
As a result, any value of glibc.malloc.arena_max is ignored by
TUNABLE_SET_VAL_IF_VALID_RANGE macro
__type min = (__cur)->type.min; <- initialized to 1
__type max = (__cur)->type.max; <- initialized to 0!
if (min == max) <- false
{
min = __default_min;
max = __default_max;
}
if ((__type) (__val) >= min && (__type) (val) <= max) <- false
{
(__cur)->val.numval = val;
(__cur)->initialized = true;
}
Assigning correct min/max values at a build time fixes a problem.
Plus, a bit of optimization: Setting of default min/max values for the
given type at a run time might be eliminated.
* elf/dl-tunables.c (do_tunable_update_val): Range checking fix.
* scripts/gen-tunables.awk: Set unspecified minval and/or maxval
values to correct default value for given type.
|
|
ELF objects generated with "objcopy --only-keep-debug" have
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
DYNAMIC 0x0+e28 0x0+200e40 0x0+200e40 0x0+ 0x0+1a0 RW 0x8
with 0 file size. ld.so should skip such PT_DYNAMIC segments.
Without a PT_DYNAMIC segment the loading of the shared object will
fail, and therefore ldd on such objects will also fail instead of
crashing. This provides better diagnostics for tooling that is
attempting to inspect the invalid shared objects which may just
contain debug information.
[BZ #22101]
* elf/Makefile (tests): Add tst-debug1.
($(objpfx)tst-debug1): New.
($(objpfx)tst-debug1.out): Likewise.
($(objpfx)tst-debug1mod1.so): Likewise.
* elf/dl-load.c (_dl_map_object_from_fd): Skip PT_DYNAMIC segment
with p_filesz == 0.
* elf/tst-debug1.c: New file.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
|
* elf/rtld-Rules: Fix $(error) use.
|
|
|
|
|
|
Some programs have more than one source files. These non-lib modules
should not be compiled with -DMODULE_NAME=libc. This patch puts these
non-lib modules in $(others-extras) and adds $(others-extras) to
all-nonlib.
[BZ #21864]
* Makerules (all-nonlib): Add $(others-extras).
* catgets/Makefile (others-extras): New.
* elf/Makefile (others-extras): Likewise.
* nss/Makefile (others-extras): Likewise.
|
|
Since __libc_multiple_libcs is defined as hidden symbol in init-first.c,
it should be always marked with attribute_hidden.
[BZ #18822]
* csu/libc-start.c (__libc_multiple_libcs): Removed.
* elf/dl-open.c: Include <libc-internal.h>.
(__libc_multiple_libcs): Removed.
* elf/dl-sysdep.c: Include <libc-internal.h> instead of
<hp-timing.h>.
* include/libc-internal.h (__libc_multiple_libcs): New.
* misc/sbrk.c: Include <libc-internal.h>.
(__libc_multiple_libcs): Removed.
|
|
Add macros used in GNU .note.gnu.property notes (NT_GNU_PROPERTY_TYPE_0).
* elf/elf.h (NT_GNU_PROPERTY_TYPE_0): New.
(NOTE_GNU_PROPERTY_SECTION_NAME): Likewise.
(GNU_PROPERTY_STACK_SIZE): Likewie.
(GNU_PROPERTY_NO_COPY_ON_PROTECTED): Likewie.
(GNU_PROPERTY_LOPROC): Likewise.
(GNU_PROPERTY_HIPROC): Likewise.
(GNU_PROPERTY_LOUSER): Likewise.
(GNU_PROPERTY_HIUSER): Likewise.
(GNU_PROPERTY_X86_ISA_1_USED): Likwise.
(GNU_PROPERTY_X86_ISA_1_NEEDED): Likwise.
(GNU_PROPERTY_X86_FEATURE_1_AND): Likwise.
(GNU_PROPERTY_X86_ISA_1_486): Likwise.
(GNU_PROPERTY_X86_ISA_1_586): Likwise.
(GNU_PROPERTY_X86_ISA_1_686): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSE): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSE2): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSE3): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSSE3): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSE4_1): Likwise.
(GNU_PROPERTY_X86_ISA_1_SSE4_2): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX2): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512F): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512CD): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512ER): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512PF): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512VL): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512DQ): Likwise.
(GNU_PROPERTY_X86_ISA_1_AVX512BW): Likwise.
(GNU_PROPERTY_X86_FEATURE_1_IBT): Likwise.
(GNU_PROPERTY_X86_FEATURE_1_SHSTK): Likwise.
|
|
|
|
Add powerpc specific note sections available since Linux v4.8.
* elf/elf.h A (NT_PPC_TAR): New macro.
(NT_PPC_PPR): Likewise.
(NT_PPC_DSCR): Likewise.
(NT_PPC_EBB): Likewise.
(NT_PPC_PMU): Likewise.
(NT_PPC_TM_CGPR): Likewise.
(NT_PPC_TM_CFPR): Likewise.
(NT_PPC_TM_CVMX): Likewise.
(NT_PPC_TM_CVSX): Likewise.
(NT_PPC_TM_SPR): Likewise.
(NT_PPC_TM_CTAR): Likewise.
(NT_PPC_TM_CPPR): Likewise.
(NT_PPC_TM_CDSCR): Likewise.
|
|
The function is called from the i386 startup code, which needs minor
adjustments due to the changed ABI.
|
|
The i386 startup code needs adjusting because it calls the function
and the ABI has changed.
|
|
Assembler code passes the address of _dl_fini to __libc_start_main,
whose function pointer argument lacks the attribute. This means
that calls could use the wrong ABI. Fortunately, for zero-parameter
void-returning functions, internal_function does not change ABI
on i386 (the only architecture which uses internal_function), so
this inconsistency was harmless (which is why it had not been
noticed so far).
|
|
These functions are invoked from other DSOs and should therefore
use the standard calling convention.
|
|
These are called across DSO boundaries and therefore should use
the ABI calling convention.
|
|
This commit separates allocating and raising exceptions. This
simplifies catching and re-raising them because it is no longer
necessary to make a temporary, on-stack copy of the exception message.
|
|
On Linux/i386, there are 3 ways to make a system call:
1. call *%gs:SYSINFO_OFFSET. This requires TLS initialization.
2. call *_dl_sysinfo. This requires relocation of _dl_sysinfo.
3. int $0x80. This is slower than #2 and #3, but works everywhere.
When an object file is compiled with PIC, #1 is prefered since it is
faster than #3 and doesn't require relocation of _dl_sysinfo. For
dynamic executables, ld.so initializes TLS. However, for static
executables, before TLS is initialized by __libc_setup_tls, #3 should
be used for system calls.
This patch adds <startup.h> which defines _startup_fatal and defaults
it to __libc_fatal. It replaces __libc_fatal with _startup_fatal in
static executables where it is called before __libc_setup_tls is called.
This header file is included in all files containing functions which are
called before __libc_setup_tls is called. On Linux/i386, when PIE is
enabled by default, _startup_fatal is turned into ABORT_INSTRUCTION and
I386_USE_SYSENTER is defined to 0 so that "int $0x80" is used for system
calls before __libc_setup_tls is called.
Tested on i686 and x86-64. Without this patch, all statically-linked
tests will fail on i686 when the compiler defaults to -fPIE.
[BZ #21913]
* csu/libc-tls.c: Include <startup.h> first.
(__libc_setup_tls): Call _startup_fatal instead of __libc_fatal.
* elf/dl-tunables.c: Include <startup.h> first.
* include/libc-symbols.h (BUILD_PIE_DEFAULT): New.
* sysdeps/generic/startup.h: New file.
* sysdeps/unix/sysv/linux/i386/startup.h: Likewise.
* sysdeps/unix/sysv/linux/i386/brk.c [BUILD_PIE_DEFAULT != 0]
(I386_USE_SYSENTER): New. Defined to 0.
|
|
|
|
tst-prelink.c checks for conflict with GLOB_DAT relocation against stdio.
On i386, there is no GLOB_DAT relocation against stdio with PIE. We
should compile tst-prelink.c without PIE.
[BZ #21815]
* elf/Makefile (CFLAGS-tst-prelink.c): New.
(LDFLAGS-tst-prelink): Likewise.
|
|
Gold doesn't support protected data symbol:
configure:5672: checking linker support for protected data symbol
configure:5682: gcc -fuse-ld=gold -nostdlib -nostartfiles -fno-stack-protector -fPIC -shared conftest.c -o conftest.so
configure:5685: $? = 0
configure:5692: gcc -fuse-ld=gold -nostdlib -nostartfiles -fno-stack-protector conftest.c -o conftest conftest.so
/usr/local/bin/ld.gold: error: /tmp/ccXWoofs.o: cannot make copy relocation for protected symbol 'bar', defined in conftest.so
collect2: error: ld returned 1 exit status
Run vismain only if linker supports protected data symbol.
* elf/Makefile (tests): Add vismain only if
$(have-protected-data) == yes.
(tests-pie): Likewise.
|
|
The function maybe_enable_malloc_check, which is called by
__tunables_init, calls __access_noerrno. It isn't problem when
symbol is is in ld.so, which has a special version of __access_noerrno
without stack protector. But when glibc is built with stack protector,
maybe_enable_malloc_check in libc.a can't call the regular version of
__access_noerrno with stack protector.
This patch changes how Linux defines the __access_noerrno to be an
inline call instead and thus preventing defining different build
rules for ld/static and shared.
H.J. Lu <hongjiu.lu@intel.com>
Adhemerval Zanella <adhemerval.zanella@linaro.org>
[BZ #21744]
* elf/dl-tunables.c: Include not-errno.h header.
* include/unistd.h (__access_noerrno): Remove definition.
* sysdeps/unix/sysv/linux/access.c (__access_noerrno): Likewise.
* sysdeps/generic/not-errno.h: New file.
* sysdeps/unix/sysv/linux/not-errno.h: Likewise.
|
|
The patch proposed by Peter Bergner [1] to libgcc in order to fix
[BZ #21707] adds a dependency on a symbol provided by the loader,
forcing the loader to be linked to tests after libgcc was linked.
It also requires to read the thread pointer during IRELA relocations.
Tested on powerpc, powerpc64, powerpc64le, s390x and x86_64.
[1] https://sourceware.org/ml/libc-alpha/2017-06/msg01383.html
[BZ #21707]
* csu/libc-start.c (LIBC_START_MAIN): Perform IREL{,A}
relocations before or after initializing the TCB on statically
linked executables. That's a per-architecture definition.
* elf/rtld.c (dl_main): Add a comment about thread-local
variables initialization.
* sysdeps/generic/libc-start.h: New file. Define
ARCH_APPLY_IREL and ARCH_SETUP_IREL.
* sysdeps/powerpc/Makefile:
[$(subdir) = elf && $(multi-arch) != no] (tests-static-internal): Add tst-tlsifunc-static.
[$(subdir) = elf && $(multi-arch) != no && $(build-shared) == yes]
(tests-internal): Add tst-tlsifunc.
* sysdeps/powerpc/tst-tlsifunc.c: New file.
* sysdeps/powerpc/tst-tlsifunc-static.c: Likewise.
* sysdeps/powerpc/powerpc64le/Makefile (f128-loader-link): New
variable.
[$(subdir) = math] (test-float128% test-ifloat128%): Force
linking to the loader after linking to libgcc.
[$(subdir) = wcsmbs || $(subdir) = stdlib] (bug-strtod bug-strtod2)
(bug-strtod2 tst-strtod-round tst-wcstod-round tst-strtod6 tst-strrom)
(tst-strfrom-locale strfrom-skeleton): Likewise.
* sysdeps/unix/sysv/linux/powerpc/libc-start.h: New file. Define
ARCH_APPLY_IREL and ARCH_SETUP_IREL.
|
|
Since _dl_resolve_conflicts is only used in elf/rtld.c, don't include
it in libc.a.
[BZ #21742]
* elf/Makefile (dl-routines): Move dl-conflict to ...
(rtld-routines): Here.
|
|
* config.make.in: Enable experimental malloc option.
* configure.ac: Likewise.
* configure: Regenerate.
* manual/install.texi: Document it.
* INSTALL: Regenerate.
* malloc/Makefile: Likewise.
* malloc/malloc.c: Add per-thread cache (tcache).
(tcache_put): New.
(tcache_get): New.
(tcache_thread_freeres): New.
(tcache_init): New.
(__libc_malloc): Use cached chunks if available.
(__libc_free): Initialize tcache if needed.
(__libc_realloc): Likewise.
(__libc_calloc): Likewise.
(_int_malloc): Prefill tcache when appropriate.
(_int_free): Likewise.
(do_set_tcache_max): New.
(do_set_tcache_count): New.
(do_set_tcache_unsorted_limit): New.
* manual/probes.texi: Document new probes.
* malloc/arena.c: Add new tcache tunables.
* elf/dl-tunables.list: Likewise.
* manual/tunables.texi: Document them.
* NEWS: Mention the per-thread cache.
|
|
Add a new tunable (glibc.tune.cpu) to override CPU identification on
aarch64. This is useful in two cases: one where it is desirable to
pretend to be another CPU for purposes of testing or because routines
written for that CPU are beneficial for specific workloads and second
where the underlying kernel does not support emulation of MRS to get
the MIDR of the CPU.
* elf/dl-tunables.h (tunable_is_name): Move from...
* elf/dl-tunables.c (is_name): ... here.
(parse_tunables, __tunables_init): Adjust.
* manual/tunables.texi: Document glibc.tune.cpu.
* sysdeps/aarch64/dl-tunables.list: New file.
* sysdeps/unix/sysv/linux/aarch64/cpu-features.c (struct
cpu_list): New type.
(cpu_list): New list of CPU names and their MIDR.
(get_midr_from_mcpu): New function.
(init_cpu_features): Override MIDR if necessary.
|
|
Building the testsuite with current GCC mainline fails with:
loadtest.c: In function 'main':
loadtest.c:76:3: error: macro expands to multiple statements [-Werror=multistatement-macros]
for (map = MAPS; map != NULL; map = map->l_next) \
^
loadtest.c:165:2: note: in expansion of macro 'OUT'
OUT;
^~~
loadtest.c:164:7: note: some parts of macro expansion are not guarded by this 'if' clause
if (debug)
^~
This seems like a genuine bug, although fairly harmless; it means the
fflush call in the OUT macro is unconditional instead of being inside
the conditional as presumably intended. This patch makes this macro
use do { } while (0) to avoid the problem.
Tested for x86_64 (testsuite), and with build-many-glibcs.py for
aarch64-linux-gnu with GCC mainline.
* elf/loadtest.c (OUT): Define using do { } while (0).
|
|
Rename glibc.tune.ifunc to glibc.tune.hwcaps and move it to
sysdeps/x86/dl-tunables.list since it is x86 specicifc. Also
change type of data_cache_size, data_cache_size and
non_temporal_threshold to unsigned long int to match size_t.
Remove usage DEFAULT_STRLEN from cpu-tunables.c.
* elf/dl-tunables.list (glibc.tune.ifunc): Removed.
* sysdeps/x86/dl-tunables.list (glibc.tune.hwcaps): New.
Remove security_level on all fields.
* manual/tunables.texi: Replace ifunc with hwcaps.
* sysdeps/x86/cpu-features.c (TUNABLE_CALLBACK (set_ifunc)):
Renamed to ..
(TUNABLE_CALLBACK (set_hwcaps)): This.
(init_cpu_features): Updated.
* sysdeps/x86/cpu-features.h (cpu_features): Change type of
data_cache_size, data_cache_size and non_temporal_threshold to
unsigned long int.
* sysdeps/x86/cpu-tunables.c (DEFAULT_STRLEN): Removed.
(TUNABLE_CALLBACK (set_ifunc)): Renamed to ...
(TUNABLE_CALLBACK (set_hwcaps)): This. Update comments. Don't
use DEFAULT_STRLEN.
|
|
* elf/dl-tunables.list: Move x86 specific tunables to ...
* sysdeps/x86/dl-tunables.list: Here. New file.
|