Compare commits

...

10 Commits

Author SHA1 Message Date
openeuler-ci-bot
41c78bad2b
!960 [sync] PR-958: change Inner-Net to Inner-Net-2.0
From: @openeuler-sync-bot 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
2024-12-11 01:06:41 +00:00
nicholastao
7fed10e6c3 Change Inner-Net to Inner-Net-2.0
(cherry picked from commit 64c7e1cd0109adba6d0a995b4a2ce28fb4fce1b6)
2024-12-10 14:51:17 +08:00
openeuler-ci-bot
4438cbc886
!956 [sync] PR-953: 修复缺少patch文件问题
From: @openeuler-sync-bot 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
2024-12-10 06:33:00 +00:00
沈仲伟
b901ecb1f9 delete useless patches in the source package.
(cherry picked from commit 9fde2c0b4b8b134c4027b107df4c661909aad0ed)
2024-12-10 14:10:20 +08:00
openeuler-ci-bot
af64c85365
!952 [sync] PR-950: nptl: initialize cpu_id_start and rseq area prio to registration
From: @openeuler-sync-bot 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
2024-12-10 03:17:25 +00:00
Qingqing Li
08ee326157 nptl: initialize cpu_id_start and rseq area prio to registration
- nptl: initialize cpu_id_start prior to rseq registration
    - nptl: initialize rseq area prior to registration

(cherry picked from commit cdd894e5de2917216ccd5335fd998209b7e37c23)
2024-12-10 09:08:07 +08:00
openeuler-ci-bot
9d682547f9
!946 [sync] PR-940: sync some patches for elf
From: @openeuler-sync-bot 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
2024-12-09 06:40:31 +00:00
shixuantong
11aef4d999 sync some patch for elf
details:
- elf: Handle static PIE with non-zero load address
- elf: Introduce _dl_relocate_object_no_relro
- elf: Switch to main malloc after final ld.so self-relocation

(cherry picked from commit d5144c30f4202cb51dd5b71db984b595cbae5ca3)
2024-12-09 14:39:47 +08:00
openeuler-ci-bot
b1ebdfb2b5
!936 [sync] PR-932: sync some patches
From: @openeuler-sync-bot 
Reviewed-by: @liqingqing_1229 
Signed-off-by: @liqingqing_1229
2024-11-29 06:17:38 +00:00
shixuantong
530bebd83f sync some patches
- elf: avoid jumping over a needed declaration
- elf: Move __rtld_malloc_init_stubs call into _dl_start_final

(cherry picked from commit 9c2adabe09ddb9b1f3e41a9bccffb045a12c3716)
2024-11-29 14:13:43 +08:00
10 changed files with 822 additions and 64 deletions

View File

@ -4,7 +4,7 @@ Date: Wed, 16 Aug 2023 15:47:44 +0800
Subject: [PATCH] skipping test case building fix glibc build error on x86
Due to the upgrade of binutils to version 2.40,
support for the -z pack-relative-relocs
support for the -z pack-relative-relocs
compilation option was added during glibc building.
This caused the linking failure of the test cases
tst-protected1a, tst-protected1b, and vismain.
@ -17,10 +17,10 @@ To ensure the successful building of glibc, these files are temporarily skipped.
1 file changed, 19 deletions(-)
diff --git a/elf/Makefile b/elf/Makefile
index c00e2ccf..8cd01845 100644
index 82e7ef18..cebc4a2a 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -986,30 +986,11 @@ tst-gnu2-tls1mod.so-no-z-defs = yes
@@ -993,20 +993,6 @@ tst-gnu2-tls1mod.so-no-z-defs = yes
CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=gnu2
endif # $(have-mtls-dialect-gnu2)
@ -41,8 +41,10 @@ index c00e2ccf..8cd01845 100644
ifeq (yesyes,$(have-fpie)$(build-shared))
modules-names += tst-piemod1
tests += tst-pie1 tst-pie2 tst-dlopen-pie tst-dlopen-tlsmodid-pie \
tst-dlopen-self-pie
tests-pie += tst-pie1 tst-pie2 tst-dlopen-tlsmodid-pie tst-dlopen-self-pie
@@ -1031,11 +1017,6 @@ LDFLAGS-tst-pie-address-static += \
$(load-address-ldflag)=$(pde-load-address)
endif
endif
-ifeq (yes,$(have-protected-data))
-tests += vismain
-tests-pie += vismain
@ -52,5 +54,5 @@ index c00e2ccf..8cd01845 100644
modules-execstack-yes = tst-execstack-mod
extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
--
2.41.0
2.27.0

View File

@ -0,0 +1,306 @@
From e7b553272196e6175b8a15f807cb59217ba2843a Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 29 Oct 2024 06:01:14 +0800
Subject: [PATCH] elf: Handle static PIE with non-zero load address [BZ #31799]
For a static PIE with non-zero load address, its PT_DYNAMIC segment
entries contain the relocated values for the load address in static PIE.
Since static PIE usually doesn't have PT_PHDR segment, use p_vaddr of
the PT_LOAD segment with offset == 0 as the load address in static PIE
and adjust the entries of PT_DYNAMIC segment in static PIE by properly
setting the l_addr field for static PIE. This fixes BZ #31799.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
Reviewed-by: Noah Goldstein <goldstein.w.n@gmail.com>
---
configure | 74 ++++++++++++++++++++++++++++++++++++
configure.ac | 36 ++++++++++++++++++
elf/Makefile | 20 ++++++++++
elf/dl-reloc-static-pie.c | 30 +++++++++++----
elf/tst-pie-address-static.c | 19 +++++++++
elf/tst-pie-address.c | 28 ++++++++++++++
6 files changed, 200 insertions(+), 7 deletions(-)
create mode 100644 elf/tst-pie-address-static.c
create mode 100644 elf/tst-pie-address.c
diff --git a/configure b/configure
index 4ef38714..75f1a5fd 100755
--- a/configure
+++ b/configure
@@ -7925,6 +7925,80 @@ printf "%s\n" "$libc_cv_cc_pie_default" >&6; }
config_vars="$config_vars
cc-pie-default = $libc_cv_cc_pie_default"
+# Get Position Dependent Executable (PDE) load address to be used to
+# load static Position Independent Executable (PIE) at a known working
+# non-zero load address. This is only used by glibc tests to verify
+# that PIE and static PIE with non-zero load address work correctly.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking PDE load address" >&5
+printf %s "checking PDE load address... " >&6; }
+if test ${libc_cv_pde_load_address+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e) cat > conftest.S <<EOF
+.globl _start
+_start:
+.globl __start
+__start:
+EOF
+if test $libc_cv_cc_pie_default = yes; then
+ pde_ld_flags="-no-pie"
+fi
+if ${CC-cc} $pde_ld_flags $CFLAGS $CPPFLAGS $LDFLAGS \
+ -nostartfiles -nostdlib $no_ssp \
+ -o conftest conftest.S 1>&5 2>&5; then
+ # Get the load address of the first PT_LOAD segment.
+ libc_cv_pde_load_address=$(LC_ALL=C $READELF -Wl conftest \
+ | $AWK '/LOAD/ { print $3; exit 0; }')
+else
+ as_fn_error $? "${CC-cc} can not create PDE" "$LINENO" 5
+fi
+rm -f conftest* ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_cv_pde_load_address" >&5
+printf "%s\n" "$libc_cv_pde_load_address" >&6; }
+config_vars="$config_vars
+pde-load-address = $libc_cv_pde_load_address"
+
+# Get the linker command-line option to load executable at a non-zero
+# load address. This is only used by glibc tests to verify that PIE and
+# static PIE with non-zero load address work correctly.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker that supports -Ttext-segment=$libc_cv_pde_load_address" >&5
+printf %s "checking for linker that supports -Ttext-segment=$libc_cv_pde_load_address... " >&6; }
+libc_linker_feature=no
+cat > conftest.c <<EOF
+int _start (void) { return 42; }
+EOF
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
+ -Wl,-Ttext-segment=$libc_cv_pde_load_address -nostdlib -nostartfiles
+ -fPIC -shared -o conftest.so conftest.c
+ 1>&5'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then
+ if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp -Wl,-Ttext-segment=$libc_cv_pde_load_address -nostdlib \
+ -nostartfiles -fPIC -shared -o conftest.so conftest.c 2>&1 \
+ | grep "warning: -Ttext-segment=$libc_cv_pde_load_address ignored" > /dev/null 2>&1; then
+ true
+ else
+ libc_linker_feature=yes
+ fi
+fi
+rm -f conftest*
+if test $libc_linker_feature = yes; then
+ libc_cv_load_address_ldflag=-Wl,-Ttext-segment
+else
+ libc_cv_load_address_ldflag=
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
+printf "%s\n" "$libc_linker_feature" >&6; }
+config_vars="$config_vars
+load-address-ldflag = $libc_cv_load_address_ldflag"
+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can build programs as PIE" >&5
printf %s "checking if we can build programs as PIE... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
diff --git a/configure.ac b/configure.ac
index 12d1f50b..14391840 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1778,6 +1778,42 @@ fi
rm -f conftest.*])
LIBC_CONFIG_VAR([cc-pie-default], [$libc_cv_cc_pie_default])
+# Get Position Dependent Executable (PDE) load address to be used to
+# load static Position Independent Executable (PIE) at a known working
+# non-zero load address. This is only used by glibc tests to verify
+# that PIE and static PIE with non-zero load address work correctly.
+AC_CACHE_CHECK([PDE load address],
+ libc_cv_pde_load_address, [dnl
+cat > conftest.S <<EOF
+.globl _start
+_start:
+.globl __start
+__start:
+EOF
+if test $libc_cv_cc_pie_default = yes; then
+ pde_ld_flags="-no-pie"
+fi
+if ${CC-cc} $pde_ld_flags $CFLAGS $CPPFLAGS $LDFLAGS \
+ -nostartfiles -nostdlib $no_ssp \
+ -o conftest conftest.S 1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD; then
+ # Get the load address of the first PT_LOAD segment.
+ libc_cv_pde_load_address=$(LC_ALL=C $READELF -Wl conftest \
+ | $AWK '/LOAD/ { print $3; exit 0; }')
+else
+ AC_MSG_ERROR([${CC-cc} can not create PDE])
+fi
+rm -f conftest*])
+LIBC_CONFIG_VAR([pde-load-address], [$libc_cv_pde_load_address])
+
+# Get the linker command-line option to load executable at a non-zero
+# load address. This is only used by glibc tests to verify that PIE and
+# static PIE with non-zero load address work correctly.
+LIBC_LINKER_FEATURE([-Ttext-segment=$libc_cv_pde_load_address],
+ [-Wl,-Ttext-segment=$libc_cv_pde_load_address],
+ [libc_cv_load_address_ldflag=-Wl,-Ttext-segment],
+ [libc_cv_load_address_ldflag=])
+LIBC_CONFIG_VAR([load-address-ldflag], [$libc_cv_load_address_ldflag])
+
AC_MSG_CHECKING(if we can build programs as PIE)
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#ifdef PIE_UNSUPPORTED
# error PIE is not supported
diff --git a/elf/Makefile b/elf/Makefile
index 383c1e23..82e7ef18 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -1012,6 +1012,25 @@ modules-names += tst-piemod1
tests += tst-pie1 tst-pie2 tst-dlopen-pie tst-dlopen-tlsmodid-pie \
tst-dlopen-self-pie
tests-pie += tst-pie1 tst-pie2 tst-dlopen-tlsmodid-pie tst-dlopen-self-pie
+ifneq (,$(load-address-ldflag))
+tests += \
+ tst-pie-address \
+ # tests
+tests-pie += \
+ tst-pie-address \
+ # tests-pie
+LDFLAGS-tst-pie-address += $(load-address-ldflag)=$(pde-load-address)
+ifeq (yes,$(enable-static-pie))
+tests += \
+ tst-pie-address-static \
+ # tests
+tests-static += \
+ tst-pie-address-static \
+ # tests-static
+LDFLAGS-tst-pie-address-static += \
+ $(load-address-ldflag)=$(pde-load-address)
+endif
+endif
ifeq (yes,$(have-protected-data))
tests += vismain
tests-pie += vismain
@@ -1875,6 +1894,7 @@ $(objpfx)tst-array5-static-cmp.out: tst-array5-static.exp \
CFLAGS-tst-pie1.c += $(pie-ccflag)
CFLAGS-tst-pie2.c += $(pie-ccflag)
+CFLAGS-tst-pie-address.c += $(pie-ccflag)
$(objpfx)tst-piemod1.so: $(libsupport)
$(objpfx)tst-pie1: $(objpfx)tst-piemod1.so
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
index a143ee5a..2de8a59f 100644
--- a/elf/dl-reloc-static-pie.c
+++ b/elf/dl-reloc-static-pie.c
@@ -37,21 +37,37 @@ _dl_relocate_static_pie (void)
{
struct link_map *main_map = _dl_get_dl_main_map ();
- /* Figure out the run-time load address of static PIE. */
- main_map->l_addr = elf_machine_load_address ();
-
- /* Read our own dynamic section and fill in the info array. */
- main_map->l_ld = ((void *) main_map->l_addr + elf_machine_dynamic ());
-
+ /* NB: elf_machine_load_address () returns the run-time load address
+ of static PIE. The l_addr field contains the difference between the
+ link-time load address in the ELF file and the run-time load address
+ in memory. We must subtract the link-time load address of static PIE,
+ which can be non-zero, when computing the l_addr field. Since static
+ PIE usually doesn't have PT_PHDR segment, use p_vaddr of the PT_LOAD
+ segment with offset == 0 as the load address of static PIE. */
+ ElfW(Addr) file_p_vaddr = 0;
const ElfW(Phdr) *ph, *phdr = GL(dl_phdr);
size_t phnum = GL(dl_phnum);
for (ph = phdr; ph < &phdr[phnum]; ++ph)
- if (ph->p_type == PT_DYNAMIC)
+ switch (ph->p_type)
{
+ case PT_LOAD:
+ if (ph->p_offset == 0)
+ file_p_vaddr = ph->p_vaddr;
+ break;
+ case PT_DYNAMIC:
main_map->l_ld_readonly = (ph->p_flags & PF_W) == 0;
break;
+ default:
+ break;
}
+ /* Figure out the run-time load address of static PIE. */
+ ElfW(Addr) l_addr = elf_machine_load_address ();
+ main_map->l_addr = l_addr - file_p_vaddr;
+
+ /* Read our own dynamic section and fill in the info array. */
+ main_map->l_ld = ((void *) l_addr + elf_machine_dynamic ());
+
elf_get_dynamic_info (main_map, false, true);
# ifdef ELF_MACHINE_BEFORE_RTLD_RELOC
diff --git a/elf/tst-pie-address-static.c b/elf/tst-pie-address-static.c
new file mode 100644
index 00000000..be2831e9
--- /dev/null
+++ b/elf/tst-pie-address-static.c
@@ -0,0 +1,19 @@
+/* Test static PIE with non-zero load address.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include "tst-pie-address.c"
diff --git a/elf/tst-pie-address.c b/elf/tst-pie-address.c
new file mode 100644
index 00000000..aa1ca0a9
--- /dev/null
+++ b/elf/tst-pie-address.c
@@ -0,0 +1,28 @@
+/* Test PIE with non-zero load address.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+ printf ("Hello\n");
+ return 0;
+}
+
+#include <support/test-driver.c>
--
2.27.0

View File

@ -0,0 +1,89 @@
From f2326c2ec0a0a8db7bc7f4db8cce3002768fc3b6 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Wed, 6 Nov 2024 10:33:44 +0100
Subject: [PATCH] elf: Introduce _dl_relocate_object_no_relro
And make _dl_protect_relro apply RELRO conditionally.
Reviewed-by: DJ Delorie <dj@redhat.com>
---
elf/dl-reloc.c | 24 ++++++++++++++----------
sysdeps/generic/ldsodefs.h | 7 +++++++
2 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index 1d558c1e..84bdddb2 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -202,8 +202,8 @@ resolve_map (lookup_t l, struct r_scope_elem *scope[], const ElfW(Sym) **ref,
#include "dynamic-link.h"
void
-_dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
- int reloc_mode, int consider_profiling)
+_dl_relocate_object_no_relro (struct link_map *l, struct r_scope_elem *scope[],
+ int reloc_mode, int consider_profiling)
{
struct textrels
{
@@ -242,9 +242,6 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
# define consider_symbind 0
#endif
- if (l->l_relocated)
- return;
-
/* If DT_BIND_NOW is set relocate all references in this object. We
do not do this if we are profiling, of course. */
// XXX Correct for auditing?
@@ -342,17 +339,24 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
textrels = textrels->next;
}
-
- /* In case we can protect the data now that the relocations are
- done, do it. */
- if (l->l_relro_size != 0)
- _dl_protect_relro (l);
}
+void
+_dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
+ int reloc_mode, int consider_profiling)
+{
+ if (l->l_relocated)
+ return;
+ _dl_relocate_object_no_relro (l, scope, reloc_mode, consider_profiling);
+ _dl_protect_relro (l);
+}
void
_dl_protect_relro (struct link_map *l)
{
+ if (l->l_relro_size == 0)
+ return;
+
ElfW(Addr) start = ALIGN_DOWN((l->l_addr
+ l->l_relro_addr),
GLRO(dl_pagesize));
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index e8b7359b..94b32151 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -1012,6 +1012,13 @@ extern void _dl_relocate_object (struct link_map *map,
int reloc_mode, int consider_profiling)
attribute_hidden;
+/* Perform relocation, but do not apply RELRO. Does not check
+ L->relocated. Otherwise the same as _dl_relocate_object. */
+void _dl_relocate_object_no_relro (struct link_map *map,
+ struct r_scope_elem *scope[],
+ int reloc_mode, int consider_profiling)
+ attribute_hidden;
+
/* Protect PT_GNU_RELRO area. */
extern void _dl_protect_relro (struct link_map *map) attribute_hidden;
--
2.27.0

View File

@ -0,0 +1,39 @@
From 2abfa1907218c5ec9d52bb81bee3f1af652f67c7 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Tue, 24 Sep 2024 13:23:10 +0200
Subject: [PATCH] elf: Move __rtld_malloc_init_stubs call into _dl_start_final
Calling an extern function in a different translation unit before
self-relocation is brittle. The compiler may load the address
at an earlier point in _dl_start, before self-relocation. In
_dl_start_final, the call is behind a compiler barrier, so this
cannot happen.
---
elf/rtld.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/elf/rtld.c b/elf/rtld.c
index 9355b30214..cb6b61d570 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -452,6 +452,8 @@ _dl_start_final (void *arg, struct dl_start_final_info *info)
{
ElfW(Addr) start_addr;
+ __rtld_malloc_init_stubs ();
+
/* Do not use an initializer for these members because it would
interfere with __rtld_static_init. */
GLRO (dl_find_object) = &_dl_find_object;
@@ -574,8 +576,6 @@ _dl_start (void *arg)
function, that way the compiler cannot put accesses to the GOT
before ELF_DYNAMIC_RELOCATE. */
- __rtld_malloc_init_stubs ();
-
#ifdef DONT_USE_BOOTSTRAP_MAP
return _dl_start_final (arg);
#else
--
2.27.0

View File

@ -0,0 +1,217 @@
From c1560f3f75c0e892b5522c16f91b4e303f677094 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
Date: Wed, 6 Nov 2024 10:33:44 +0100
Subject: [PATCH] elf: Switch to main malloc after final ld.so self-relocation
Before commit ee1ada1bdb8074de6e1bdc956ab19aef7b6a7872
("elf: Rework exception handling in the dynamic loader
[BZ #25486]"), the previous order called the main calloc
to allocate a shadow GOT/PLT array for auditing support.
This happened before libc.so.6 ELF constructors were run, so
a user malloc could run without libc.so.6 having been
initialized fully. One observable effect was that
environ was NULL at this point.
It does not seem to be possible at present to trigger such
an allocation, but it seems more robust to delay switching
to main malloc after ld.so self-relocation is complete.
The elf/tst-rtld-no-malloc-audit test case fails with a
2.34-era glibc that does not have this fix.
Reviewed-by: DJ Delorie <dj@redhat.com>
---
elf/Makefile | 9 ++++
elf/dl-support.c | 3 +-
elf/rtld.c | 26 +++++------
elf/tst-rtld-no-malloc-audit.c | 1 +
elf/tst-rtld-no-malloc-preload.c | 1 +
elf/tst-rtld-no-malloc.c | 76 ++++++++++++++++++++++++++++++++
6 files changed, 100 insertions(+), 16 deletions(-)
create mode 100644 elf/tst-rtld-no-malloc-audit.c
create mode 100644 elf/tst-rtld-no-malloc-preload.c
create mode 100644 elf/tst-rtld-no-malloc.c
diff --git a/elf/Makefile b/elf/Makefile
index cebc4a2a..ea98cba8 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -435,6 +435,9 @@ tests += \
tst-p_align3 \
tst-relsort1 \
tst-ro-dynamic \
+ tst-rtld-no-malloc \
+ tst-rtld-no-malloc-audit \
+ tst-rtld-no-malloc-preload \
tst-rtld-run-static \
tst-single_threaded \
tst-single_threaded-pthread \
@@ -3038,3 +3041,9 @@ CFLAGS-tst-tlsgap-mod0.c += -mtls-dialect=gnu2
CFLAGS-tst-tlsgap-mod1.c += -mtls-dialect=gnu2
CFLAGS-tst-tlsgap-mod2.c += -mtls-dialect=gnu2
endif
+
+# Reuse an audit module which provides ample debug logging.
+tst-rtld-no-malloc-audit-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so
+
+# Any shared object should do.
+tst-rtld-no-malloc-preload-ENV = LD_PRELOAD=$(objpfx)tst-auditmod1.so
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 44a54dea..5b7f4af2 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -345,8 +345,7 @@ _dl_non_dynamic_init (void)
call_function_static_weak (_dl_find_object_init);
/* Setup relro on the binary itself. */
- if (_dl_main_map.l_relro_size != 0)
- _dl_protect_relro (&_dl_main_map);
+ _dl_protect_relro (&_dl_main_map);
}
#ifdef DL_SYSINFO_IMPLEMENTATION
diff --git a/elf/rtld.c b/elf/rtld.c
index 87459ca7..558733b8 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -2346,30 +2346,28 @@ dl_main (const ElfW(Phdr) *phdr,
if (rtld_multiple_ref)
{
- /* There was an explicit ref to the dynamic linker as a shared lib.
- Re-relocate ourselves with user-controlled symbol definitions.
-
- We must do this after TLS initialization in case after this
- re-relocation, we might call a user-supplied function
- (e.g. calloc from _dl_relocate_object) that uses TLS data. */
/* Set up the object lookup structures. */
_dl_find_object_init ();
- /* The malloc implementation has been relocated, so resolving
- its symbols (and potentially calling IFUNC resolvers) is safe
- at this point. */
- __rtld_malloc_init_real (main_map);
-
/* Likewise for the locking implementation. */
__rtld_mutex_init ();
+ /* Re-relocate ourselves with user-controlled symbol definitions. */
+
RTLD_TIMING_VAR (start);
rtld_timer_start (&start);
- /* Mark the link map as not yet relocated again. */
- GL(dl_rtld_map).l_relocated = 0;
- _dl_relocate_object (&GL(dl_rtld_map), main_map->l_scope, 0, 0);
+ _dl_relocate_object_no_relro (&GL(dl_rtld_map), main_map->l_scope, 0, 0);
+
+
+ /* The malloc implementation has been relocated, so resolving
+ * its symbols (and potentially calling IFUNC resolvers) is safe
+ * at this point. */
+ __rtld_malloc_init_real (main_map);
+
+ if (GL(dl_rtld_map).l_relro_size != 0)
+ _dl_protect_relro (&GL(dl_rtld_map));
rtld_timer_accum (&relocate_time, start);
}
diff --git a/elf/tst-rtld-no-malloc-audit.c b/elf/tst-rtld-no-malloc-audit.c
new file mode 100644
index 00000000..a028377a
--- /dev/null
+++ b/elf/tst-rtld-no-malloc-audit.c
@@ -0,0 +1 @@
+#include "tst-rtld-no-malloc.c"
diff --git a/elf/tst-rtld-no-malloc-preload.c b/elf/tst-rtld-no-malloc-preload.c
new file mode 100644
index 00000000..a028377a
--- /dev/null
+++ b/elf/tst-rtld-no-malloc-preload.c
@@ -0,0 +1 @@
+#include "tst-rtld-no-malloc.c"
diff --git a/elf/tst-rtld-no-malloc.c b/elf/tst-rtld-no-malloc.c
new file mode 100644
index 00000000..5f24d4bd
--- /dev/null
+++ b/elf/tst-rtld-no-malloc.c
@@ -0,0 +1,76 @@
+/* Test that program loading does not call malloc.
+ Copyright (C) 2024 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+
+#include <string.h>
+#include <unistd.h>
+
+static void
+print (const char *s)
+{
+ const char *end = s + strlen (s);
+ while (s < end)
+ {
+ ssize_t ret = write (STDOUT_FILENO, s, end - s);
+ if (ret <= 0)
+ _exit (2);
+ s += ret;
+ }
+}
+
+static void __attribute__ ((noreturn))
+unexpected_call (const char *function)
+{
+ print ("error: unexpected call to ");
+ print (function);
+ print ("\n");
+ _exit (1);
+}
+
+/* These are the malloc functions implement in elf/dl-minimal.c. */
+
+void
+free (void *ignored)
+{
+ unexpected_call ("free");
+}
+
+void *
+calloc (size_t ignored1, size_t ignored2)
+{
+ unexpected_call ("calloc");
+}
+
+void *
+malloc (size_t ignored)
+{
+ unexpected_call ("malloc");
+}
+
+void *
+realloc (void *ignored1, size_t ignored2)
+{
+ unexpected_call ("realloc");
+}
+
+int
+main (void)
+{
+ /* Do not use the test wrapper, to avoid spurious malloc calls from it. */
+ return 0;
+}
--
2.27.0

View File

@ -0,0 +1,40 @@
From 8e572067976ea700e5ef750458c42c47328fe459 Mon Sep 17 00:00:00 2001
From: DJ Delorie <dj@redhat.com>
Date: Wed, 6 Nov 2024 21:40:35 -0500
Subject: [PATCH] elf: avoid jumping over a needed declaration
The declaration of found_other_class could be jumped
over via the goto just above it, but the code jumped
to uses found_other_class. Move the declaration
up a bit to ensure it's properly declared and initialized.
---
elf/dl-load.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/elf/dl-load.c b/elf/dl-load.c
index ac8e217a7f..335b34c56d 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1931,6 +1931,9 @@ _dl_map_object (struct link_map *loader, const char *name,
: "\nfile=%s [%lu]; dynamically loaded by %s [%lu]\n",
name, nsid, DSO_FILENAME (loader->l_name), loader->l_ns);
+ /* Will be true if we found a DSO which is of the other ELF class. */
+ bool found_other_class = false;
+
#ifdef SHARED
/* Give the auditing libraries a chance to change the name before we
try anything. */
@@ -1948,9 +1951,6 @@ _dl_map_object (struct link_map *loader, const char *name,
}
#endif
- /* Will be true if we found a DSO which is of the other ELF class. */
- bool found_other_class = false;
-
if (strchr (name, '/') == NULL)
{
/* Search for NAME in several places. */
--
2.27.0

View File

@ -59,7 +59,7 @@
%define target %{_target_cpu}-%{_vendor}-linuxeabi
%endif
%define x86_arches %{ix86} x86_64
%define all_license LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with exceptions and BSD and Inner-Net and ISC and Public Domain and GFDL-1.3-only
%define all_license LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ and GPLv2+ with exceptions and BSD and Inner-Net-2.0 and ISC and Public Domain and GFDL-1.3-only
%define GCC gcc
%define GXX g++
##############################################################################
@ -67,7 +67,7 @@
##############################################################################
Name: glibc
Version: 2.38
Release: 42
Release: 47
Summary: The GNU libc libraries
License: %{all_license}
URL: http://www.gnu.org/software/glibc/
@ -243,6 +243,13 @@ Patch153: 0015-LoongArch-Change-tunable-for-2.38.patch
Patch154: 0001-LoongArch-Simplify-the-autoconf-check-for-static-PIE.patch
Patch155: 0002-nptl-Add-thread_pointer.h-for-LoongArch.patch
Patch156: 0003-nptl-fix-__builtin_thread_pointer-detection-on-Loong.patch
Patch157: backport-elf-avoid-jumping-over-a-needed-declaration.patch
Patch158: backport-elf-Move-__rtld_malloc_init_stubs-call-into-_dl_star.patch
Patch159: backport-elf-Handle-static-PIE-with-non-zero-load-address-BZ-.patch
Patch160: backport-elf-Introduce-_dl_relocate_object_no_relro.patch
Patch161: backport-elf-Switch-to-main-malloc-after-final-ld.so-self-rel.patch
Patch162: nptl-initialize-rseq-area-prior-to-registration.patch
Patch163: nptl-initialize-cpu_id_start-prior-to-rseq-registrat.patch
#openEuler patch list
Patch9000: turn-default-value-of-x86_rep_stosb_threshold_form_2K_to_1M.patch
@ -255,9 +262,6 @@ Patch9006: fix-Segmentation-fault-in-nss-module.patch
Patch9007: fix_nss_database_check_reload_and_get_memleak.patch
Patch9008: 0001-fix-glibc-build-error-on-x86.patch
%if %{ENABLE_RELOC}
Patch9009: reserve-relocation-information-for-sysboost.patch
%endif
Patch9010: add-Wl-z-noseparate-code-for-so.patch
Provides: ldconfig rtld(GNU_HASH) bundled(gnulib)
@ -530,19 +534,6 @@ Currently, provide pthread_condition function.
To keep older applications compatible, glibc-compat-2.17 provides libpthread_nonshared.a
%endif
%if %{ENABLE_RELOC}
##############################################################################
# glibc reloc sub-package
##############################################################################
%package relocation
Summary: Relocations for %{name}
Requires: %{name} = %{version}-%{release}
BuildRequires: native-turbo-tools
%description relocation
This package contains relocations for %{name}.
%endif
##############################################################################
# Prepare for the build.
##############################################################################
@ -644,9 +635,6 @@ pushd $builddir
{ cat config.log; false; }
make %{?_smp_mflags} -O -r %{glibc_make_flags}
%if %{ENABLE_RELOC}
objreloc libc.so.6
%endif
popd
##############################################################################
@ -840,11 +828,6 @@ for i in $RPM_BUILD_ROOT%{_prefix}/bin/{xtrace,memusage}; do
-i $i
done
%if %{ENABLE_RELOC}
mkdir -p ${RPM_BUILD_ROOT}/usr/lib/relocation/%{_libdir}
install -p ${RPM_BUILD_DIR}/%{name}-%{version}/build-%{target}/libc.so.6.relocation ${RPM_BUILD_ROOT}/usr/lib/relocation/%{_libdir}
%endif
touch master.filelist
touch glibc.filelist
touch common.filelist
@ -1428,13 +1411,6 @@ fi
%attr(0600,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/db/nscd/services
%ghost %config(missingok,noreplace) /etc/sysconfig/nscd
%if %{ENABLE_RELOC}
%files relocation
%dir %attr(500, root, root) /usr/lib/relocation
%dir %attr(500, root, root) /usr/lib/relocation/%{_libdir}
%attr(400, root, root) /usr/lib/relocation/%{_libdir}/libc.so.6.relocation
%endif
%files -f nss_modules.filelist -n nss_modules
/var/db/Makefile
@ -1464,6 +1440,25 @@ fi
%endif
%changelog
* Tue Dec 10 2024 taoyuxiang <taoyuxiang2@huawei.com> - 2.38-47
- Change Inner-Net to Inner-Net-2.0
* Tue Dec 10 2024 shenzhongwei <shenzhongwei@kylinos.cn> - 2.38-46
- delete useless patches in the source package.
* Sat Dec 7 2024 Qingqing Li <liqingqing3@huawei.com> - 2.38-45
- nptl: initialize cpu_id_start prior to rseq registration
- nptl: initialize rseq area prior to registration
* Fri Dec 06 2024 shixuantong <shixuantong@huawei.com> - 2.38-44
- elf: Handle static PIE with non-zero load address
- elf: Introduce _dl_relocate_object_no_relro
- elf: Switch to main malloc after final ld.so self-relocation
* Fri Nov 29 2024 shixuantong <shixuantong@huawei.com> - 2.38-43
- elf: avoid jumping over a needed declaration
- elf: Move __rtld_malloc_init_stubs call into _dl_start_final
* Wed Nov 27 2024 lixing <lixing@loongson.cn> - 2.38-42
- LoongArch: Simplify static-pie support and change nptl support

View File

@ -0,0 +1,34 @@
From 37ded328c4240f5a84c69b8cb803f0652fa68d20 Mon Sep 17 00:00:00 2001
From: Michael Jeanson <mjeanson@efficios.com>
Date: Wed, 20 Nov 2024 14:15:42 -0500
Subject: [PATCH] nptl: initialize cpu_id_start prior to rseq registration
When adding explicit initialization of rseq fields prior to
registration, I glossed over the fact that 'cpu_id_start' is also
documented as initialized by user-space.
While current kernels don't validate the content of this field on
registration, future ones could.
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
(cherry picked from commit d9f40387d3305d97e30a8cf8724218c42a63680a)
---
sysdeps/unix/sysv/linux/rseq-internal.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h
index 8fd26f335e..0ad79174bd 100644
--- a/sysdeps/unix/sysv/linux/rseq-internal.h
+++ b/sysdeps/unix/sysv/linux/rseq-internal.h
@@ -56,6 +56,7 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq)
registration, there is no guarantee that struct pthread is
cleared on all architectures. */
THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED);
+ THREAD_SETMEM (self, rseq_area.cpu_id_start, 0);
THREAD_SETMEM (self, rseq_area.rseq_cs, 0);
THREAD_SETMEM (self, rseq_area.flags, 0);
--
2.27.0

View File

@ -0,0 +1,61 @@
From 9423cc5387d93de63be09740bfd86abd01dca7d1 Mon Sep 17 00:00:00 2001
From: Michael Jeanson <mjeanson@efficios.com>
Date: Thu, 7 Nov 2024 22:23:49 +0100
Subject: [PATCH] nptl: initialize rseq area prior to registration
Per the rseq syscall documentation, 3 fields are required to be
initialized by userspace prior to registration, they are 'cpu_id',
'rseq_cs' and 'flags'. Since we have no guarantee that 'struct pthread'
is cleared on all architectures, explicitly set those 3 fields prior to
registration.
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Reviewed-by: Florian Weimer <fweimer@redhat.com>
(cherry picked from commit 97f60abd25628425971f07e9b0e7f8eec0741235)
---
nptl/descr.h | 2 ++
sysdeps/unix/sysv/linux/rseq-internal.h | 10 ++++++++++
2 files changed, 12 insertions(+)
diff --git a/nptl/descr.h b/nptl/descr.h
index 0171576c23..4ec2df7a26 100644
--- a/nptl/descr.h
+++ b/nptl/descr.h
@@ -414,6 +414,8 @@ struct pthread
{
uint32_t cpu_id_start;
uint32_t cpu_id;
+ uint64_t rseq_cs;
+ uint32_t flags;
};
char pad[32]; /* Original rseq area size. */
} rseq_area __attribute__ ((aligned (32)));
diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h
index 226ba59a24..8fd26f335e 100644
--- a/sysdeps/unix/sysv/linux/rseq-internal.h
+++ b/sysdeps/unix/sysv/linux/rseq-internal.h
@@ -51,11 +51,21 @@ rseq_register_current_thread (struct pthread *self, bool do_rseq)
/* The initial implementation used only 20 bytes out of 32,
but still expected size 32. */
size = RSEQ_AREA_SIZE_INITIAL;
+
+ /* Initialize the rseq fields that are read by the kernel on
+ registration, there is no guarantee that struct pthread is
+ cleared on all architectures. */
+ THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_UNINITIALIZED);
+ THREAD_SETMEM (self, rseq_area.rseq_cs, 0);
+ THREAD_SETMEM (self, rseq_area.flags, 0);
+
int ret = INTERNAL_SYSCALL_CALL (rseq, &self->rseq_area,
size, 0, RSEQ_SIG);
if (!INTERNAL_SYSCALL_ERROR_P (ret))
return true;
}
+ /* When rseq is disabled by tunables or the registration fails, inform
+ userspace by setting 'cpu_id' to RSEQ_CPU_ID_REGISTRATION_FAILED. */
THREAD_SETMEM (self, rseq_area.cpu_id, RSEQ_CPU_ID_REGISTRATION_FAILED);
return false;
}
--
2.27.0

View File

@ -1,25 +0,0 @@
From b44dbe791e801b4ef40352849b83264e8ad9415b Mon Sep 17 00:00:00 2001
From: lw <longwei27@huawei.com>
Date: Mon, 21 Aug 2023 15:28:09 +0800
Subject: [PATCH] reserve relocation information for sysboost
---
Makerules | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makerules b/Makerules
index 018780c8..a4603f68 100644
--- a/Makerules
+++ b/Makerules
@@ -534,7 +534,7 @@ lib%.so: lib%_pic.a $(+preinit) $(+postinit) $(link-libc-deps)
$(call after-link,$@)
define build-shlib-helper
-$(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) \
+$(LINK.o) -shared -static-libgcc -Wl,-O1 $(sysdep-LDFLAGS) -Wl,--emit-relocs \
$(if $($(@F)-no-z-defs)$(no-z-defs),,-Wl,-z,defs) $(rtld-LDFLAGS) \
$(if $($(@F)-no-dt-relr),$(no-dt-relr-ldflag),$(dt-relr-ldflag)) \
$(extra-B-$(@F:lib%.so=%).so) -B$(csu-objpfx) \
--
2.33.0