about summary refs log tree commit diff
Commit message (Collapse)AuthorAgeFilesLines
* x86-64: Update tst-glibc-hwcaps-2.c for x86-64 baselineH.J. Lu2021-01-221-1/+1
| | | | | Return EXIT_FAILURE only if the level 2 libx86-64-isa-level.so is used on x86-64 baseline machine.
* powerpc64: Select POWER9 machine for the scv instructionFlorian Weimer2021-01-223-1/+10
| | | | | | | | | It is not available with the baseline ISA. Fixes commit 68ab82f56690ada86ac1e0c46bad06ba189a10ef ("powerpc: Runtime selection between sc and scv for syscalls"). Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
* x86: Check ifunc resolver with CPU_FEATURE_USABLE [BZ #27072]H.J. Lu2021-01-216-0/+184
| | | | | | | | Check ifunc resolver with CPU_FEATURE_USABLE and tunables in dynamic and static executables to verify that CPUID features are initialized early in static PIE. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* Revert "linux: Move {f}xstat{at} to compat symbols" for static buildAdhemerval Zanella2021-01-2117-37/+40
| | | | | | | | | | | | | | This reverts commit 20b39d59467b0c1d858e89ded8b0cebe55e22f60 for static library. This avoids the need to rebuild the world for the case where libstdc++ (and potentially other libraries) are linked to a old glibc. To avoid requering to provide xstat symbols for newer ABIs (such as riscv32) a new LIB_COMPAT macro is added. It is similar to SHLIB_COMPAT but also works for static case (thus evaluating similar to SHLIB_COMPAT for both shared and static case). Checked with a check-abi on all affected ABIs. I also check if the static library does contains the xstat symbols.
* aarch64: revert memcpy optimze for kunpeng to avoid performance degradationShuo Wang2021-01-211-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In commit 863d775c481704baaa41855fc93e5a1ca2dc6bf6, kunpeng920 is added to default memcpy version, however, there is performance degradation when the copy size is some large bytes, eg: 100k. This is the result, tested in glibc-2.28: before backport after backport Performance improvement memcpy_1k 0.005 0.005 0.00% memcpy_10k 0.032 0.029 10.34% memcpy_100k 0.356 0.429 -17.02% memcpy_1m 7.470 11.153 -33.02% This is the demo #include "stdio.h" #include "string.h" #include "stdlib.h" char a[1024*1024] = {12}; char b[1024*1024] = {13}; int main(int argc, char *argv[]) { int i = atoi(argv[1]); int j; int size = atoi(argv[2]); for (j = 0; j < i; j++) memcpy(b, a, size*1024); return 0; } # gcc -g -O0 memcpy.c -o memcpy # time taskset -c 10 ./memcpy 100000 1024 Co-authored-by: liqingqing <liqingqing3@huawei.com>
* Make libc symbols hidden in static PIESzabolcs Nagy2021-01-211-2/+7
| | | | | | | | | | | | | | | | | | | | | | Hidden visibility can avoid indirections and RELATIVE relocs in static PIE libc. The check should use IS_IN_LIB instead of IS_IN(libc) since all symbols are defined locally in static PIE and the optimization is useful in all libraries not just libc. However the test system links objects from libcrypt.a into dynamic linked test binaries where hidden visibility does not work. I think mixing static and shared libc components in the same binary should not be supported usage, but to be safe only use hidden in libc.a. On some targets (i386) this optimization cannot be applied because hidden visibility PIE ifunc functions don't work, so it is gated by NO_HIDDEN_EXTERN_FUNC_IN_PIE. From -static-pie linked 'int main(){}' this shaves off 71 relative relocs on aarch64 and reduces code size by about 2k. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* csu: Move static pie self relocation later [BZ #27072]Szabolcs Nagy2021-01-211-2/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | IFUNC resolvers may depend on tunables and cpu feature setup so move static pie self relocation after those. It is hard to guarantee that the ealy startup code does not rely on relocations so this is a bit fragile. It would be more robust to handle RELATIVE relocs early and only IRELATIVE relocs later, but the current relocation processing code cannot do that. The early startup code up to relocation processing includes _dl_aux_init (auxvec); __libc_init_secure (); __tunables_init (__environ); ARCH_INIT_CPU_FEATURES (); _dl_relocate_static_pie (); These are simple enough that RELATIVE relocs can be avoided. The following steps include ARCH_SETUP_IREL (); ARCH_SETUP_TLS (); ARCH_APPLY_IREL (); On some targets IRELATIVE processing relies on TLS setup on others TLS setup relies on IRELATIVE relocs, so the right position for _dl_relocate_static_pie is target dependent. For now move self relocation as early as possible on targets that support static PIE. Fixes bug 27072. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* Use hidden visibility for early static PIE codeSzabolcs Nagy2021-01-218-0/+34
| | | | | | | | | | | | | | | | | | | | | | | | | Extern symbol access in position independent code usually involves GOT indirection which needs RELATIVE reloc in a static linked PIE. (On some targets this is avoided e.g. because the linker can relax a GOT access to a pc-relative access, but this is not generally true.) Code that runs before static PIE self relocation must avoid relying on dynamic relocations which can be ensured by using hidden visibility. However we cannot just make all symbols hidden: On i386, all calls to IFUNC functions must go through PLT and calls to hidden functions CANNOT go through PLT in PIE since EBX used in PIE PLT may not be set up for local calls to hidden IFUNC functions. This patch aims to make symbol references hidden in code that is used before and by _dl_relocate_static_pie when building a static PIE libc. Note: for an object that is used in the startup code, its references and definition may not have consistent visibility: it is only forced hidden in the startup code. This is needed for fixing bug 27072. Co-authored-by: H.J. Lu <hjl.tools@gmail.com> Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* csu: Avoid weak ref for __ehdr_start in static PIESzabolcs Nagy2021-01-211-0/+4
| | | | | | | | | | | | | All linkers support __ehdr_start that support static PIE linking, so there is no need to check for its presence via a weak reference. This avoids a RELATIVE relocation in static PIE startup code on some targets. With non-PIE static linking the weak ref check is kept in case the linker does not support __ehdr_start. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* configure: Check for static PIE supportSzabolcs Nagy2021-01-219-0/+39
| | | | | | | | | | | | | | Add SUPPORT_STATIC_PIE that targets can define if they support static PIE. This requires PI_STATIC_AND_HIDDEN support and various linker features as described in commit 9d7a3741c9e59eba87fb3ca6b9f979befce07826 Add --enable-static-pie configure option to build static PIE [BZ #19574] Currently defined on x86_64, i386 and aarch64 where static PIE is known to work. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* elf: Avoid RELATIVE relocs in __tunables_initSzabolcs Nagy2021-01-213-4/+14
| | | | | | | | | | | | | | | | | | | | | | | With static pie linking pointers in the tunables list need RELATIVE relocs since the absolute address is not known at link time. We want to avoid relocations so the static pie self relocation can be done after tunables are initialized. This is a simple fix that embeds the tunable strings into the tunable list instead of using pointers. It is possible to have a more compact representation of tunables with some additional complexity in the generator and tunable parser logic. Such optimization will be useful if the list of tunables grows. There is still an issue that tunables_strdup allocates and the failure handling code path is sufficiently complex that it can easily have RELATIVE relocations. It is possible to avoid the early allocation and only change environment variables in a setuid exe after relocations are processed. But that is a bigger change and early failure is fatal anyway so it is not as critical to fix right away. This is bug 27181. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* elf: Make the tunable struct definition internal onlySzabolcs Nagy2021-01-213-38/+43
| | | | | | | | | | | | | | | | | The representation of the tunables including type information and the tunable list structure are only used in the implementation not in the tunables api that is exposed to usage within glibc. This patch moves the representation related definitions into the existing dl-tunable-types.h and uses that only for implementation. The tunable callback and related types are moved to dl-tunables.h because they are part of the tunables api. This reduces the details exposed in the tunables api so the internals are easier to change. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* <sys/platform/x86.h>: Remove the C preprocessor magicH.J. Lu2021-01-2124-847/+1162
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In <sys/platform/x86.h>, define CPU features as enum instead of using the C preprocessor magic to make it easier to wrap this functionality in other languages. Move the C preprocessor magic to internal header for better GCC codegen when more than one features are checked in a single expression as in x86-64 dl-hwcaps-subdirs.c. 1. Rename COMMON_CPUID_INDEX_XXX to CPUID_INDEX_XXX. 2. Move CPUID_INDEX_MAX to sysdeps/x86/include/cpu-features.h. 3. Remove struct cpu_features and __x86_get_cpu_features from <sys/platform/x86.h>. 4. Add __x86_get_cpuid_feature_leaf to <sys/platform/x86.h> and put it in libc. 5. Make __get_cpu_features() private to glibc. 6. Replace __x86_get_cpu_features(N) with __get_cpu_features(). 7. Add _dl_x86_get_cpu_features to GLIBC_PRIVATE. 8. Use a single enum index for each CPU feature detection. 9. Pass the CPUID feature leaf to __x86_get_cpuid_feature_leaf. 10. Return zero struct cpuid_feature for the older glibc binary with a smaller CPUID_INDEX_MAX [BZ #27104]. 11. Inside glibc, use the C preprocessor magic so that cpu_features data can be loaded just once leading to more compact code for glibc. 256 bits are used for each CPUID leaf. Some leaves only contain a few features. We can add exceptions to such leaves. But it will increase code sizes and it is harder to provide backward/forward compatibilities when new features are added to such leaves in the future. When new leaves are added, _rtld_global_ro offsets will change which leads to race condition during in-place updates. We may avoid in-place updates by 1. Rename the old glibc. 2. Install the new glibc. 3. Remove the old glibc. NB: A function, __x86_get_cpuid_feature_leaf , is used to avoid the copy relocation issue with IFUNC resolver as shown in IFUNC resolver tests.
* posix: Fix fnmatch.c on bootstrapAdhemerval Zanella2021-01-201-1/+1
| | | | | | | | | Only define FALLTHROUGH for _LIBC and do not check __clang_major__ value. It partially syncs with gnulib 5c52f00c69f39fe. Checked with build-many-glibcs.py for aarch64-linux-gnu.
* stdlib: Add testcase for BZ #26241Adhemerval Zanella2021-01-202-1/+103
| | | | | | | | | | | | | | | | | | Old implementation of realpath allocates a PATH_MAX using alloca for each symlink in the path, leading to MAXSYMLINKS times PATH_MAX maximum stack usage. The test create a symlink with __eloop_threshold() loops and creates a thread with minimum stack size (obtained through support_small_stack_thread_attribute). The thread issues a stack allocations that fill the thread allocated stack minus some slack plus and the realpath usage (which assumes a bounded stack usage). If realpath uses more than about 2 * PATH_MAX plus some slack it triggers a stackoverflow. Checked on x86_64-linux-gnu and i686-linux-gnu. Reviewed-by: DJ Delorie <dj@redhat.com>
* posix: Fix regex_internal.h on bootstrapAdhemerval Zanella2021-01-201-2/+4
| | | | | | | | | | Only define FALLTHROUGH for _LIBC and do not check __clang_major__ value. It partially syncs with gnulib 5c52f00c69f39fe. Checked with build-many-glibcs.py for aarch64-linux-gnu, x86_64-linux-gnu, and s390x-linux-gnu.
* Use <startup.h> in __libc_init_secureH.J. Lu2021-01-193-5/+56
| | | | | | | | | Since __libc_init_secure is called before ARCH_SETUP_TLS, it must use "int $0x80" for system calls in i386 static PIE. Add startup_getuid, startup_geteuid, startup_getgid and startup_getegid to <startup.h>. Update __libc_init_secure to use them. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* elf: Avoid RELATIVE relocation for _dl_sysinfoH.J. Lu2021-01-191-2/+8
| | | | | | | | | Set the default _dl_sysinfo in _dl_aux_init to avoid RELATIVE relocation in static PIE. This is needed for fixing bug 27072 on x86. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* libmvec: Add extra-test-objs to test-extrasH.J. Lu2021-01-191-0/+8
| | | | | | | Add extra-test-objs to test-extras so that they are compiled with -DMODULE_NAME=testsuite instead of -DMODULE_NAME=libc. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* Hurd: Add rtld-strncpy-c.cH.J. Lu2021-01-191-0/+1
| | | | | All IFUNC functions which are used in ld.so must have a rtld version if the IFUNC version isn't safe to use in ld.so.
* Update MIPS libm-test-ulps.Joseph Myers2021-01-182-22/+24
|
* Update arm libm-test-ulps.Joseph Myers2021-01-181-11/+12
|
* Update powerpc-nofpu libm-test-ulps.Joseph Myers2021-01-181-16/+17
|
* Update hppa libm-test-ulpsJohn David Anglin2021-01-181-11/+12
|
* ARC: nofpu: Regenerate ulpsVineet Gupta2021-01-171-5/+6
|
* ld.so: Add --list-tunables to print tunable valuesH.J. Lu2021-01-1510-2/+172
| | | | | | Pass --list-tunables to ld.so to print tunables with min and max values. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* math/test-tgmath2: Fix fabs failure when no long doubleStafford Horne2021-01-151-2/+2
| | | | | | | | | | | | | | | | | | | | | | | I have been testing with GCC trunk and GLIBC master while working on the OpenRISC port. This test has been failing with fabs not being called, This is caused as my architecture is configure with no long double meaning the two calls are the same: TEST (fabs (Vdouble1), double, fabs); TEST (fabs (Vldouble1), ldouble, fabs); Instead of the tgmath calls resolving to fabs and fabsl both calls are fabs. Next, do to compiler optimiations the second call is eliminated. Fix this by invoking the failing TEST with Vldouble2. Note, I also updated the FAIL message to more clearly show where the failure happened, so I see: FAIL: math/test-tgmath2 original exit status 1 wrong function called, fabs (ldouble) failure on line 174 Cc: Joseph Myers <joseph@codesourcery.com>
* x86: Move x86 processor cache info to cpu_featuresH.J. Lu2021-01-145-412/+551
| | | | | | | | | | | 1. Move x86 processor cache info to _dl_x86_cpu_features in ld.so. 2. Update tunable bounds with TUNABLE_SET_WITH_BOUNDS. 3. Move x86 cache info initialization to dl-cacheinfo.h and initialize x86 cache info in init_cpu_features (). 4. Put x86 cache info for libc in cacheinfo.h, which is included in libc-start.c in libc.a and is included in cacheinfo.c in libc.so. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* Fix x86 build with --enable-tunable=noAdhemerval Zanella2021-01-142-0/+2
| | | | Checked on x86_64-linux-gnu.
* ifuncmain6pie: Remove the circular IFUNC dependency [BZ #20019]H.J. Lu2021-01-133-15/+9
| | | | | | | | | | | | | | | | On x86, ifuncmain6pie failed with: [hjl@gnu-cfl-2 build-i686-linux]$ ./elf/ifuncmain6pie --direct ./elf/ifuncmain6pie: IFUNC symbol 'foo' referenced in '/export/build/gnu/tools-build/glibc-32bit/build-i686-linux/elf/ifuncmod6.so' is defined in the executable and creates an unsatisfiable circular dependency. [hjl@gnu-cfl-2 build-i686-linux]$ readelf -rW elf/ifuncmod6.so | grep foo 00003ff4 00000706 R_386_GLOB_DAT 0000400c foo_ptr 00003ff8 00000406 R_386_GLOB_DAT 00000000 foo 0000400c 00000401 R_386_32 00000000 foo [hjl@gnu-cfl-2 build-i686-linux]$ Remove non-JUMP_SLOT relocations against foo in ifuncmod6.so, which trigger the circular IFUNC dependency, and build ifuncmain6pie with -Wl,-z,lazy.
* Use the right argument code in unnormal testsSiddhesh Poyarekar2021-01-135-33/+35
| | | | | | Use the right argument code (j) in the unnormal tests and cast inputs from the ieee_long_double_shape_type struct to Float64x to properly test it.
* ldconfig/x86: Store ISA level in cache and aux cacheH.J. Lu2021-01-1326-110/+598
| | | | | | | | | | | Store ISA level in the portion of the unused upper 32 bits of the hwcaps field in cache and the unused pad field in aux cache. ISA level is stored and checked only for shared objects in glibc-hwcaps subdirectories. The shared objects in the default directories aren't checked since there are no fallbacks for these shared objects. Tested on x86-64-v2, x86-64-v3 and x86-64-v4 machines with --disable-hardcoded-path-in-tests and --enable-hardcoded-path-in-tests.
* elf: work around a gcc bug in elf_get_dynamic_infoSzabolcs Nagy2021-01-131-23/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | Since commit 2f056e8a5dd4dc0f075413f931e82cede37d1057 "aarch64: define PI_STATIC_AND_HIDDEN", building glibc with gcc-8 on aarch64 fails with /BLD/elf/librtld.os: in function `elf_get_dynamic_info': /SRC/elf/get-dynamic-info.h:70:(.text+0xad8): relocation truncated to fit: R_AARCH64_ADR_PREL_PG_HI21 against symbol `_rtld_local' defined in .data section in /BLD/elf/librtld.os This is a gcc bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98618 The bug is fixed on gcc-10 and not yet backported. gcc-9 is affected, but the issue happens to not trigger in glibc, gcc-8 and older seems to miscompile rtld.os. Rewriting the affected code in elf_get_dynamic_info seems to make the issue go away on <= gcc-9. The change makes the logic a bit clearer too (by separating the index computation and array update) and drops an older gcc workaround (since gcc 4.6 is no longer supported). Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* x86: Set header.feature_1 in TCB for always-on CET [BZ #27177]H.J. Lu2021-01-133-1/+11
| | | | | Update dl_cet_check() to set header.feature_1 in TCB when both IBT and SHSTK are always on.
* posix: consume less entropy on tempnameAdhemerval Zanella2021-01-121-3/+14
| | | | | | | | | | The first getrandom is used only for __GT_NOCREATE, which is inherently insecure and can use the entropy as a small improvement. On the second and later attempts it might help against DoS attacks. It sync with gnulib commit 854fbb81d91f7a0f2b463e7ace2499dee2f380f2. Checked on x86_64-linux-gnu.
* Makerules: Do not require startup files for format.lds probe objectFlorian Weimer2021-01-121-3/+2
| | | | | | | | | During statically linked bootstrap, the compiler does not have the required startup files, so do a smaller dummy link to obtain the output format information. Fixes commit 87d583c6e8cd0e49f64da76636ebeec033298b4d ("install: Replace scripts/output-format.sed with objdump -f [BZ #26559]").
* install: Replace scripts/output-format.sed with objdump -f [BZ #26559]Fangrui Song2021-01-116-77/+3
| | | | | | | | | | | | | | GNU ld and gold have supported --print-output-format since 2011. glibc requires binutils>=2.25 (2015), so if LD is GNU ld or gold, we can assume the option is supported. lld is by default a cross linker supporting multiple targets. It auto detects the file format and does not need OUTPUT_FORMAT. It does not support --print-output-format. By parsing objdump -f, we can support all the three linkers. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
* math: Add BZ#18980 fix back on dbl-64 coshAdhemerval Zanella2021-01-111-1/+2
| | | | | | | It is regression from 9e97f239eae1f2b1 (Remove dbl-64/wordsize-64 (part 2)) where is missed to add the BZ#18980 fix (9e97f239eae1f2b1). Checked on i686-linux-gnu.
* posix: Sync tempname with gnulib [BZ #26648]Adhemerval Zanella2021-01-111-116/+164
| | | | | | | | It syncs with gnulib commit b1268f22f443e8e4b9e. The try_tempname_len now uses getrandom on each iteration to get entropy and only uses the clock plus ASLR as source of entropy if getrandom fails. Checked on x86_64-linux-gnu and i686-linux-gnu.
* posix: Fix return value of system if shell can not be executed [BZ #27053]Adhemerval Zanella2021-01-113-0/+22
| | | | | | | | POSIX states that system returned code for failure to execute the shell shall be as if the shell had terminated using _exit(127). This behaviour was removed with 5fb7fc96350575. Checked on x86_64-linux-gnu.
* support: Add xchmod wrapperAdhemerval Zanella2021-01-112-0/+31
| | | | Checked on x86_64-linux-gnu.
* Update STATX_ATTR_DAX value from Linux 5.10.Joseph Myers2021-01-111-1/+1
| | | | | | | | This patch updates the value of STATX_ATTR_DAX in bits/statx-generic.h for a change made in Linux 5.10. (As with previous such changes, this only does anything if glibc is being used with old kernel headers.) Tested for x86_64.
* riscv: Initialize $gp before resolving the IRELATIVE relocationVincent Chen2021-01-101-1/+21
| | | | | | | The $gp register may be used to access the global variable in the PDE program, so the $gp register should be initialized before executing the IFUNC resolver of PDE program to avoid unexpected error occurs.
* riscv: support GNU indirect functionVincent Chen2021-01-103-0/+79
| | | | Enable riscv glibc to support GNU indirect function
* posix: Correct attribute access mode on readlinkat [BZ #27024].Martin Sebor2021-01-101-1/+1
|
* Add xfchmod to libsupportAlexandra Hájková2021-01-103-0/+30
|
* Add xchdir to libsupport.Alexandra Hájková2021-01-093-0/+30
|
* POSIX locale: Fix typo in commentMarc Aurèle La France2021-01-091-1/+1
|
* ARC: Regenerate ulpsVineet Gupta2021-01-081-4/+4
| | | | | | | | | | | | | Reinstate pass for FAIL: math/test-double-cosh FAIL: math/test-double-sinh FAIL: math/test-float32x-cosh FAIL: math/test-float32x-sinh FAIL: math/test-float64-cosh FAIL: math/test-float64-sinh FAIL: math/test-ldouble-cosh FAIL: math/test-ldouble-sinh
* mntent: Use __putc_unlocked instead of fputc_unlockedSiddhesh Poyarekar2021-01-081-6/+6
| | | | | | | | __putc_unlocked is guaranteed to be inlined all the time as opposed to fputc_unlocked, which does not get inlined when glibc is built with -Os. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>