forked from rpms/glibc
import glibc-2.28-209.el8
This commit is contained in:
parent
b038b39e86
commit
13f7afe99f
98
SOURCES/glibc-rh2047981-1.patch
Normal file
98
SOURCES/glibc-rh2047981-1.patch
Normal file
@ -0,0 +1,98 @@
|
||||
commit eb77a1fccc7e60cea32245c11288c7f1d92545fa
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed Oct 16 18:19:51 2019 +0200
|
||||
|
||||
dlfcn: Remove remnants of caller sensitivity from dlinfo
|
||||
|
||||
dlinfo operates on a specific handle, which means that there is no
|
||||
caller sensivity involved.
|
||||
|
||||
diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c
|
||||
index 964572cc670ceba4..23ef3f57ca41afdf 100644
|
||||
--- a/dlfcn/dlinfo.c
|
||||
+++ b/dlfcn/dlinfo.c
|
||||
@@ -26,7 +26,7 @@
|
||||
int
|
||||
dlinfo (void *handle, int request, void *arg)
|
||||
{
|
||||
- return __dlinfo (handle, request, arg, RETURN_ADDRESS (0));
|
||||
+ return __dlinfo (handle, request, arg);
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -35,7 +35,6 @@ dlinfo (void *handle, int request, void *arg)
|
||||
|
||||
struct dlinfo_args
|
||||
{
|
||||
- ElfW(Addr) caller;
|
||||
void *handle;
|
||||
int request;
|
||||
void *arg;
|
||||
@@ -47,24 +46,6 @@ dlinfo_doit (void *argsblock)
|
||||
struct dlinfo_args *const args = argsblock;
|
||||
struct link_map *l = args->handle;
|
||||
|
||||
-# if 0
|
||||
- if (args->handle == RTLD_SELF)
|
||||
- {
|
||||
- Lmid_t nsid;
|
||||
-
|
||||
- /* Find the highest-addressed object that CALLER is not below. */
|
||||
- for (nsid = 0; nsid < DL_NNS; ++nsid)
|
||||
- for (l = GL(dl_ns)[nsid]._ns_loaded; l != NULL; l = l->l_next)
|
||||
- if (caller >= l->l_map_start && caller < l->l_map_end
|
||||
- && (l->l_contiguous || _dl_addr_inside_object (l, caller)))
|
||||
- break;
|
||||
-
|
||||
- if (l == NULL)
|
||||
- _dl_signal_error (0, NULL, NULL, N_("\
|
||||
-RTLD_SELF used in code not dynamically loaded"));
|
||||
- }
|
||||
-# endif
|
||||
-
|
||||
switch (args->request)
|
||||
{
|
||||
case RTLD_DI_CONFIGADDR:
|
||||
@@ -108,16 +89,14 @@ RTLD_SELF used in code not dynamically loaded"));
|
||||
}
|
||||
|
||||
int
|
||||
-__dlinfo (void *handle, int request, void *arg DL_CALLER_DECL)
|
||||
+__dlinfo (void *handle, int request, void *arg)
|
||||
{
|
||||
# ifdef SHARED
|
||||
if (!rtld_active ())
|
||||
- return _dlfcn_hook->dlinfo (handle, request, arg,
|
||||
- DL_CALLER);
|
||||
+ return _dlfcn_hook->dlinfo (handle, request, arg);
|
||||
# endif
|
||||
|
||||
- struct dlinfo_args args = { (ElfW(Addr)) DL_CALLER,
|
||||
- handle, request, arg };
|
||||
+ struct dlinfo_args args = { handle, request, arg };
|
||||
return _dlerror_run (&dlinfo_doit, &args) ? -1 : 0;
|
||||
}
|
||||
# ifdef SHARED
|
||||
diff --git a/include/dlfcn.h b/include/dlfcn.h
|
||||
index 0dc57dbe2217cfe7..93dd369ab12a5745 100644
|
||||
--- a/include/dlfcn.h
|
||||
+++ b/include/dlfcn.h
|
||||
@@ -117,7 +117,7 @@ struct dlfcn_hook
|
||||
int (*dladdr) (const void *address, Dl_info *info);
|
||||
int (*dladdr1) (const void *address, Dl_info *info,
|
||||
void **extra_info, int flags);
|
||||
- int (*dlinfo) (void *handle, int request, void *arg, void *dl_caller);
|
||||
+ int (*dlinfo) (void *handle, int request, void *arg);
|
||||
void *(*dlmopen) (Lmid_t nsid, const char *file, int mode, void *dl_caller);
|
||||
void *pad[4];
|
||||
};
|
||||
@@ -143,8 +143,7 @@ extern int __dladdr (const void *address, Dl_info *info)
|
||||
extern int __dladdr1 (const void *address, Dl_info *info,
|
||||
void **extra_info, int flags)
|
||||
attribute_hidden;
|
||||
-extern int __dlinfo (void *handle, int request, void *arg DL_CALLER_DECL)
|
||||
- attribute_hidden;
|
||||
+extern int __dlinfo (void *handle, int request, void *arg) attribute_hidden;
|
||||
|
||||
#ifndef SHARED
|
||||
struct link_map;
|
31
SOURCES/glibc-rh2047981-10.patch
Normal file
31
SOURCES/glibc-rh2047981-10.patch
Normal file
@ -0,0 +1,31 @@
|
||||
commit 88361b408b9dbd313f15413cc2e6be0f1cafb01a
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Tue Aug 17 19:36:04 2021 -0700
|
||||
|
||||
elf: Copy l_addr/l_ld when adding ld.so to a new namespace
|
||||
|
||||
When add ld.so to a new namespace, we don't actually load ld.so. We
|
||||
create a new link map and refers the real one for almost everything.
|
||||
Copy l_addr and l_ld from the real ld.so link map to avoid GDB warning:
|
||||
|
||||
warning: .dynamic section for ".../elf/ld-linux-x86-64.so.2" is not at the expected address (wrong library or version mismatch?)
|
||||
|
||||
when handling shared library loaded by dlmopen.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index cdb5d4b5b67f1ca1..303e6594f9af9b7e 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -932,6 +932,10 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||
/* Refer to the real descriptor. */
|
||||
l->l_real = &GL(dl_rtld_map);
|
||||
|
||||
+ /* Copy l_addr and l_ld to avoid a GDB warning with dlmopen(). */
|
||||
+ l->l_addr = l->l_real->l_addr;
|
||||
+ l->l_ld = l->l_real->l_ld;
|
||||
+
|
||||
/* No need to bump the refcount of the real object, ld.so will
|
||||
never be unloaded. */
|
||||
__close_nocancel (fd);
|
45
SOURCES/glibc-rh2047981-11.patch
Normal file
45
SOURCES/glibc-rh2047981-11.patch
Normal file
@ -0,0 +1,45 @@
|
||||
commit 1e1ecea62e899acb58c3fdf3b320a0833ddd0dff
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Thu Sep 30 10:29:17 2021 -0700
|
||||
|
||||
elf: Replace nsid with args.nsid [BZ #27609]
|
||||
|
||||
commit ec935dea6332cb22f9881cd1162bad156173f4b0
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri Apr 24 22:31:15 2020 +0200
|
||||
|
||||
elf: Implement __libc_early_init
|
||||
|
||||
has
|
||||
|
||||
@@ -856,6 +876,11 @@ no more namespaces available for dlmopen()"));
|
||||
/* See if an error occurred during loading. */
|
||||
if (__glibc_unlikely (exception.errstring != NULL))
|
||||
{
|
||||
+ /* Avoid keeping around a dangling reference to the libc.so link
|
||||
+ map in case it has been cached in libc_map. */
|
||||
+ if (!args.libc_already_loaded)
|
||||
+ GL(dl_ns)[nsid].libc_map = NULL;
|
||||
+
|
||||
|
||||
do_dlopen calls _dl_open with nsid == __LM_ID_CALLER (-2), which calls
|
||||
dl_open_worker with args.nsid = nsid. dl_open_worker updates args.nsid
|
||||
if it is __LM_ID_CALLER. After dl_open_worker returns, it is wrong to
|
||||
use nsid.
|
||||
|
||||
Replace nsid with args.nsid after dl_open_worker returns. This fixes
|
||||
BZ #27609.
|
||||
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index 661a2172d1789b26..b5a4da04907d8d29 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -916,7 +916,7 @@ no more namespaces available for dlmopen()"));
|
||||
/* Avoid keeping around a dangling reference to the libc.so link
|
||||
map in case it has been cached in libc_map. */
|
||||
if (!args.libc_already_loaded)
|
||||
- GL(dl_ns)[nsid].libc_map = NULL;
|
||||
+ GL(dl_ns)[args.nsid].libc_map = NULL;
|
||||
|
||||
/* Remove the object from memory. It may be in an inconsistent
|
||||
state if relocation failed, for example. */
|
607
SOURCES/glibc-rh2047981-12.patch
Normal file
607
SOURCES/glibc-rh2047981-12.patch
Normal file
@ -0,0 +1,607 @@
|
||||
This is a partial backport of this commit with only the 'scope'
|
||||
refactoring required to have access to the outer scope value
|
||||
to use with RESOLVE_MAP to implement la_symbind for BIND_NOW.
|
||||
|
||||
We do not backport this entire patch because the nested function
|
||||
changes have significant impact on code generation and would
|
||||
require furhter backports to support and maintain.
|
||||
|
||||
commit 490e6c62aa31a8aa5c4a059f6e646ede121edf0a
|
||||
Author: Fangrui Song <maskray@google.com>
|
||||
Date: Thu Oct 7 11:55:02 2021 -0700
|
||||
|
||||
elf: Avoid nested functions in the loader [BZ #27220]
|
||||
|
||||
dynamic-link.h is included more than once in some elf/ files (rtld.c,
|
||||
dl-conflict.c, dl-reloc.c, dl-reloc-static-pie.c) and uses GCC nested
|
||||
functions. This harms readability and the nested functions usage
|
||||
is the biggest obstacle prevents Clang build (Clang doesn't support GCC
|
||||
nested functions).
|
||||
|
||||
The key idea for unnesting is to add extra parameters (struct link_map
|
||||
*and struct r_scope_elm *[]) to RESOLVE_MAP,
|
||||
ELF_MACHINE_BEFORE_RTLD_RELOC, ELF_DYNAMIC_RELOCATE, elf_machine_rel[a],
|
||||
elf_machine_lazy_rel, and elf_machine_runtime_setup. (This is inspired
|
||||
by Stan Shebs' ppc64/x86-64 implementation in the
|
||||
google/grte/v5-2.27/master which uses mixed extra parameters and static
|
||||
variables.)
|
||||
|
||||
Future simplification:
|
||||
* If mips elf_machine_runtime_setup no longer needs RESOLVE_GOTSYM,
|
||||
elf_machine_runtime_setup can drop the `scope` parameter.
|
||||
* If TLSDESC no longer need to be in elf_machine_lazy_rel,
|
||||
elf_machine_lazy_rel can drop the `scope` parameter.
|
||||
|
||||
Tested on aarch64, i386, x86-64, powerpc64le, powerpc64, powerpc32,
|
||||
sparc64, sparcv9, s390x, s390, hppa, ia64, armhf, alpha, and mips64.
|
||||
In addition, tested build-many-glibcs.py with {arc,csky,microblaze,nios2}-linux-gnu
|
||||
and riscv64-linux-gnu-rv64imafdc-lp64d.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/dl-conflict.c b/elf/dl-conflict.c
|
||||
index 70f14b04cd383048..31d87ac846427752 100644
|
||||
--- a/elf/dl-conflict.c
|
||||
+++ b/elf/dl-conflict.c
|
||||
@@ -40,7 +40,7 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
|
||||
data. */
|
||||
|
||||
/* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code. */
|
||||
-#define RESOLVE_MAP(ref, version, flags) (*ref = NULL, NULL)
|
||||
+#define RESOLVE_MAP(map, scope, ref, version, flags) (*ref = NULL, NULL)
|
||||
#define RESOLVE(ref, version, flags) (*ref = NULL, 0)
|
||||
#define RESOLVE_CONFLICT_FIND_MAP(map, r_offset) \
|
||||
do { \
|
||||
@@ -67,8 +67,8 @@ _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict,
|
||||
GL(dl_num_cache_relocations) += conflictend - conflict;
|
||||
|
||||
for (; conflict < conflictend; ++conflict)
|
||||
- elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset,
|
||||
- 0);
|
||||
+ elf_machine_rela (l, NULL, conflict, NULL, NULL,
|
||||
+ (void *) conflict->r_offset, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
diff --git a/elf/dl-reloc-static-pie.c b/elf/dl-reloc-static-pie.c
|
||||
index ab1ce0eacced9d2b..1efbf515c3c1c16d 100644
|
||||
--- a/elf/dl-reloc-static-pie.c
|
||||
+++ b/elf/dl-reloc-static-pie.c
|
||||
@@ -30,7 +30,7 @@ _dl_relocate_static_pie (void)
|
||||
|
||||
# define STATIC_PIE_BOOTSTRAP
|
||||
# define BOOTSTRAP_MAP (main_map)
|
||||
-# define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
|
||||
+# define RESOLVE_MAP(map, scope, sym, version, flags) BOOTSTRAP_MAP
|
||||
# include "dynamic-link.h"
|
||||
|
||||
/* Figure out the run-time load address of static PIE. */
|
||||
@@ -46,7 +46,7 @@ _dl_relocate_static_pie (void)
|
||||
|
||||
/* Relocate ourselves so we can do normal function calls and
|
||||
data access using the global offset table. */
|
||||
- ELF_DYNAMIC_RELOCATE (main_map, 0, 0, 0);
|
||||
+ ELF_DYNAMIC_RELOCATE (main_map, NULL, 0, 0, 0);
|
||||
main_map->l_relocated = 1;
|
||||
|
||||
/* Initialize _r_debug. */
|
||||
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
|
||||
index c6139b89d4ecddc8..19de5de067a5ef07 100644
|
||||
--- a/elf/dl-reloc.c
|
||||
+++ b/elf/dl-reloc.c
|
||||
@@ -250,7 +250,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
|
||||
|
||||
/* This macro is used as a callback from the ELF_DYNAMIC_RELOCATE code. */
|
||||
-#define RESOLVE_MAP(ref, version, r_type) \
|
||||
+#define RESOLVE_MAP(l, scope, ref, version, r_type) \
|
||||
((ELFW(ST_BIND) ((*ref)->st_info) != STB_LOCAL \
|
||||
&& __glibc_likely (!dl_symbol_visibility_binds_local_p (*ref))) \
|
||||
? ((__builtin_expect ((*ref) == l->l_lookup_cache.sym, 0) \
|
||||
@@ -275,7 +275,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
|
||||
#include "dynamic-link.h"
|
||||
|
||||
- ELF_DYNAMIC_RELOCATE (l, lazy, consider_profiling, skip_ifunc);
|
||||
+ ELF_DYNAMIC_RELOCATE (l, scope, lazy, consider_profiling, skip_ifunc);
|
||||
|
||||
#ifndef PROF
|
||||
if (__glibc_unlikely (consider_profiling)
|
||||
diff --git a/elf/do-rel.h b/elf/do-rel.h
|
||||
index 19cb5d236ee30698..0b04d1a0bf28b9f4 100644
|
||||
--- a/elf/do-rel.h
|
||||
+++ b/elf/do-rel.h
|
||||
@@ -38,7 +38,7 @@
|
||||
than fully resolved now. */
|
||||
|
||||
auto inline void __attribute__ ((always_inline))
|
||||
-elf_dynamic_do_Rel (struct link_map *map,
|
||||
+elf_dynamic_do_Rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
ElfW(Addr) reladdr, ElfW(Addr) relsize,
|
||||
__typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative,
|
||||
int lazy, int skip_ifunc)
|
||||
@@ -68,13 +68,13 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
}
|
||||
else
|
||||
# endif
|
||||
- elf_machine_lazy_rel (map, l_addr, r, skip_ifunc);
|
||||
+ elf_machine_lazy_rel (map, scope, l_addr, r, skip_ifunc);
|
||||
|
||||
# ifdef ELF_MACHINE_IRELATIVE
|
||||
if (r2 != NULL)
|
||||
for (; r2 <= end2; ++r2)
|
||||
if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
|
||||
- elf_machine_lazy_rel (map, l_addr, r2, skip_ifunc);
|
||||
+ elf_machine_lazy_rel (map, scope, l_addr, r2, skip_ifunc);
|
||||
# endif
|
||||
}
|
||||
else
|
||||
@@ -134,7 +134,7 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
#endif
|
||||
|
||||
ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
|
||||
- elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
|
||||
+ elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)],
|
||||
&map->l_versions[ndx],
|
||||
(void *) (l_addr + r->r_offset), skip_ifunc);
|
||||
}
|
||||
@@ -146,7 +146,7 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
{
|
||||
ElfW(Half) ndx
|
||||
= version[ELFW(R_SYM) (r2->r_info)] & 0x7fff;
|
||||
- elf_machine_rel (map, r2,
|
||||
+ elf_machine_rel (map, scope, r2,
|
||||
&symtab[ELFW(R_SYM) (r2->r_info)],
|
||||
&map->l_versions[ndx],
|
||||
(void *) (l_addr + r2->r_offset),
|
||||
@@ -167,14 +167,14 @@ elf_dynamic_do_Rel (struct link_map *map,
|
||||
}
|
||||
else
|
||||
# endif
|
||||
- elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
|
||||
+ elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
|
||||
(void *) (l_addr + r->r_offset), skip_ifunc);
|
||||
|
||||
# ifdef ELF_MACHINE_IRELATIVE
|
||||
if (r2 != NULL)
|
||||
for (; r2 <= end2; ++r2)
|
||||
if (ELFW(R_TYPE) (r2->r_info) == ELF_MACHINE_IRELATIVE)
|
||||
- elf_machine_rel (map, r2, &symtab[ELFW(R_SYM) (r2->r_info)],
|
||||
+ elf_machine_rel (map, scope, r2, &symtab[ELFW(R_SYM) (r2->r_info)],
|
||||
NULL, (void *) (l_addr + r2->r_offset),
|
||||
skip_ifunc);
|
||||
# endif
|
||||
diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h
|
||||
index 2fc3c91b7defe84e..357a2e3c6825e0fc 100644
|
||||
--- a/elf/dynamic-link.h
|
||||
+++ b/elf/dynamic-link.h
|
||||
@@ -60,8 +60,9 @@ int _dl_try_allocate_static_tls (struct link_map *map, bool optional)
|
||||
unaligned cases. */
|
||||
# if ! ELF_MACHINE_NO_REL
|
||||
auto inline void __attribute__((always_inline))
|
||||
-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc,
|
||||
- const ElfW(Sym) *sym, const struct r_found_version *version,
|
||||
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const ElfW(Rel) *reloc, const ElfW(Sym) *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr, int skip_ifunc);
|
||||
auto inline void __attribute__((always_inline))
|
||||
elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
|
||||
@@ -69,8 +70,9 @@ elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
|
||||
# endif
|
||||
# if ! ELF_MACHINE_NO_RELA
|
||||
auto inline void __attribute__((always_inline))
|
||||
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
- const ElfW(Sym) *sym, const struct r_found_version *version,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr, int skip_ifunc);
|
||||
auto inline void __attribute__((always_inline))
|
||||
elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
@@ -78,12 +80,12 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
# endif
|
||||
# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL
|
||||
auto inline void __attribute__((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
ElfW(Addr) l_addr, const ElfW(Rel) *reloc,
|
||||
int skip_ifunc);
|
||||
# else
|
||||
auto inline void __attribute__((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
int skip_ifunc);
|
||||
# endif
|
||||
@@ -114,7 +116,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
consumes precisely the very end of the DT_REL*, or DT_JMPREL and DT_REL*
|
||||
are completely separate and there is a gap between them. */
|
||||
|
||||
-# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, do_lazy, skip_ifunc, test_rel) \
|
||||
+# define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, scope, do_lazy, skip_ifunc, test_rel) \
|
||||
do { \
|
||||
struct { ElfW(Addr) start, size; \
|
||||
__typeof (((ElfW(Dyn) *) 0)->d_un.d_val) nrelative; int lazy; } \
|
||||
@@ -152,13 +154,13 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
} \
|
||||
\
|
||||
if (ELF_DURING_STARTUP) \
|
||||
- elf_dynamic_do_##reloc ((map), ranges[0].start, ranges[0].size, \
|
||||
+ elf_dynamic_do_##reloc ((map), scope, ranges[0].start, ranges[0].size, \
|
||||
ranges[0].nrelative, 0, skip_ifunc); \
|
||||
else \
|
||||
{ \
|
||||
int ranges_index; \
|
||||
for (ranges_index = 0; ranges_index < 2; ++ranges_index) \
|
||||
- elf_dynamic_do_##reloc ((map), \
|
||||
+ elf_dynamic_do_##reloc ((map), scope, \
|
||||
ranges[ranges_index].start, \
|
||||
ranges[ranges_index].size, \
|
||||
ranges[ranges_index].nrelative, \
|
||||
@@ -175,29 +177,29 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
|
||||
# if ! ELF_MACHINE_NO_REL
|
||||
# include "do-rel.h"
|
||||
-# define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) \
|
||||
- _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, lazy, skip_ifunc, _ELF_CHECK_REL)
|
||||
+# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc) \
|
||||
+ _ELF_DYNAMIC_DO_RELOC (REL, Rel, map, scope, lazy, skip_ifunc, _ELF_CHECK_REL)
|
||||
# else
|
||||
-# define ELF_DYNAMIC_DO_REL(map, lazy, skip_ifunc) /* Nothing to do. */
|
||||
+# define ELF_DYNAMIC_DO_REL(map, scope, lazy, skip_ifunc) /* Nothing to do. */
|
||||
# endif
|
||||
|
||||
# if ! ELF_MACHINE_NO_RELA
|
||||
# define DO_RELA
|
||||
# include "do-rel.h"
|
||||
-# define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) \
|
||||
- _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, lazy, skip_ifunc, _ELF_CHECK_REL)
|
||||
+# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) \
|
||||
+ _ELF_DYNAMIC_DO_RELOC (RELA, Rela, map, scope, lazy, skip_ifunc, _ELF_CHECK_REL)
|
||||
# else
|
||||
-# define ELF_DYNAMIC_DO_RELA(map, lazy, skip_ifunc) /* Nothing to do. */
|
||||
+# define ELF_DYNAMIC_DO_RELA(map, scope, lazy, skip_ifunc) /* Nothing to do. */
|
||||
# endif
|
||||
|
||||
/* This can't just be an inline function because GCC is too dumb
|
||||
to inline functions containing inlines themselves. */
|
||||
-# define ELF_DYNAMIC_RELOCATE(map, lazy, consider_profile, skip_ifunc) \
|
||||
+# define ELF_DYNAMIC_RELOCATE(map, scope, lazy, consider_profile, skip_ifunc) \
|
||||
do { \
|
||||
- int edr_lazy = elf_machine_runtime_setup ((map), (lazy), \
|
||||
+ int edr_lazy = elf_machine_runtime_setup ((map), (scope), (lazy), \
|
||||
(consider_profile)); \
|
||||
- ELF_DYNAMIC_DO_REL ((map), edr_lazy, skip_ifunc); \
|
||||
- ELF_DYNAMIC_DO_RELA ((map), edr_lazy, skip_ifunc); \
|
||||
+ ELF_DYNAMIC_DO_REL ((map), (scope), edr_lazy, skip_ifunc); \
|
||||
+ ELF_DYNAMIC_DO_RELA ((map), (scope), edr_lazy, skip_ifunc); \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index e107af4014d43777..f3836b8a78faaf27 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -514,7 +514,7 @@ _dl_start (void *arg)
|
||||
is trivial: always the map of ld.so itself. */
|
||||
#define RTLD_BOOTSTRAP
|
||||
#define BOOTSTRAP_MAP (&bootstrap_map)
|
||||
-#define RESOLVE_MAP(sym, version, flags) BOOTSTRAP_MAP
|
||||
+#define RESOLVE_MAP(map, scope, sym, version, flags) BOOTSTRAP_MAP
|
||||
#include "dynamic-link.h"
|
||||
|
||||
#ifdef DONT_USE_BOOTSTRAP_MAP
|
||||
@@ -560,7 +560,7 @@ _dl_start (void *arg)
|
||||
/* Relocate ourselves so we can do normal function calls and
|
||||
data access using the global offset table. */
|
||||
|
||||
- ELF_DYNAMIC_RELOCATE (&bootstrap_map, 0, 0, 0);
|
||||
+ ELF_DYNAMIC_RELOCATE (&bootstrap_map, NULL, 0, 0, 0);
|
||||
}
|
||||
bootstrap_map.l_relocated = 1;
|
||||
|
||||
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
|
||||
index 3fd3c8a265d012b1..5eab544afe2717f7 100644
|
||||
--- a/sysdeps/aarch64/dl-machine.h
|
||||
+++ b/sysdeps/aarch64/dl-machine.h
|
||||
@@ -65,7 +65,8 @@ elf_machine_load_address (void)
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
|
||||
static inline int __attribute__ ((unused))
|
||||
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
|
||||
+ int lazy, int profile)
|
||||
{
|
||||
if (l->l_info[DT_JMPREL] && lazy)
|
||||
{
|
||||
@@ -242,8 +243,9 @@ elf_machine_plt_value (struct link_map *map,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
- const ElfW(Sym) *sym, const struct r_found_version *version,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
@@ -256,7 +258,8 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
else
|
||||
{
|
||||
const ElfW(Sym) *const refsym = sym;
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
|
||||
+ r_type);
|
||||
ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
|
||||
|
||||
if (sym != NULL
|
||||
@@ -381,7 +384,7 @@ elf_machine_rela_relative (ElfW(Addr) l_addr,
|
||||
|
||||
inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
ElfW(Addr) l_addr,
|
||||
const ElfW(Rela) *reloc,
|
||||
int skip_ifunc)
|
||||
@@ -408,7 +411,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
(const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
|
||||
version = &map->l_versions[vernum[symndx] & 0x7fff];
|
||||
}
|
||||
- elf_machine_rela (map, reloc, sym, version, reloc_addr,
|
||||
+ elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
|
||||
skip_ifunc);
|
||||
return;
|
||||
}
|
||||
@@ -435,7 +438,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
|
||||
/* Always initialize TLS descriptors completely, because lazy
|
||||
initialization requires synchronization at every TLS access. */
|
||||
- elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
|
||||
+ elf_machine_rela (map, scope, reloc, sym, version, reloc_addr, skip_ifunc);
|
||||
}
|
||||
else if (__glibc_unlikely (r_type == AARCH64_R(IRELATIVE)))
|
||||
{
|
||||
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
|
||||
index 3a30671591284d79..5ba95b9e4af49942 100644
|
||||
--- a/sysdeps/i386/dl-machine.h
|
||||
+++ b/sysdeps/i386/dl-machine.h
|
||||
@@ -61,7 +61,8 @@ elf_machine_load_address (void)
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
|
||||
static inline int __attribute__ ((unused, always_inline))
|
||||
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
|
||||
+ int lazy, int profile)
|
||||
{
|
||||
Elf32_Addr *got;
|
||||
extern void _dl_runtime_resolve (Elf32_Word) attribute_hidden;
|
||||
@@ -293,8 +294,9 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rel *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute ((always_inline))
|
||||
-elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
- const Elf32_Sym *sym, const struct r_found_version *version,
|
||||
+elf_machine_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const Elf32_Rel *reloc, const Elf32_Sym *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
@@ -327,7 +329,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
# endif
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
|
||||
+ r_type);
|
||||
Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
|
||||
|
||||
if (sym != NULL
|
||||
@@ -493,8 +496,9 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
- const Elf32_Sym *sym, const struct r_found_version *version,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const Elf32_Rela *reloc, const Elf32_Sym *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
Elf32_Addr *const reloc_addr = reloc_addr_arg;
|
||||
@@ -507,7 +511,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc,
|
||||
# ifndef RESOLVE_CONFLICT_FIND_MAP
|
||||
const Elf32_Sym *const refsym = sym;
|
||||
# endif
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
|
||||
+ r_type);
|
||||
Elf32_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
|
||||
|
||||
if (sym != NULL
|
||||
@@ -661,7 +666,7 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
Elf32_Addr l_addr, const Elf32_Rel *reloc,
|
||||
int skip_ifunc)
|
||||
{
|
||||
@@ -696,13 +701,13 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
const ElfW(Half) *const version =
|
||||
(const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
|
||||
ElfW(Half) ndx = version[ELFW(R_SYM) (r->r_info)] & 0x7fff;
|
||||
- elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)],
|
||||
+ elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)],
|
||||
&map->l_versions[ndx],
|
||||
(void *) (l_addr + r->r_offset), skip_ifunc);
|
||||
}
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
else
|
||||
- elf_machine_rel (map, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
|
||||
+ elf_machine_rel (map, scope, r, &symtab[ELFW(R_SYM) (r->r_info)], NULL,
|
||||
(void *) (l_addr + r->r_offset), skip_ifunc);
|
||||
# endif
|
||||
}
|
||||
@@ -721,7 +726,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_lazy_rela (struct link_map *map,
|
||||
+elf_machine_lazy_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
Elf32_Addr l_addr, const Elf32_Rela *reloc,
|
||||
int skip_ifunc)
|
||||
{
|
||||
@@ -745,7 +750,8 @@ elf_machine_lazy_rela (struct link_map *map,
|
||||
|
||||
/* Always initialize TLS descriptors completely at load time, in
|
||||
case static TLS is allocated for it that requires locking. */
|
||||
- elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
|
||||
+ elf_machine_rela (map, scope, reloc, sym, version, reloc_addr,
|
||||
+ skip_ifunc);
|
||||
}
|
||||
else if (__glibc_unlikely (r_type == R_386_IRELATIVE))
|
||||
{
|
||||
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
index 99a83d0c82ea0a9c..35996bb9173da231 100644
|
||||
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
@@ -345,7 +345,8 @@ dl_platform_init (void)
|
||||
/* Set up the loaded object described by MAP so its unrelocated PLT
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
static inline int __attribute__ ((always_inline))
|
||||
-elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
|
||||
+elf_machine_runtime_setup (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ int lazy, int profile)
|
||||
{
|
||||
if (map->l_info[DT_JMPREL])
|
||||
{
|
||||
@@ -679,7 +680,7 @@ resolve_ifunc (Elf64_Addr value,
|
||||
/* Perform the relocation specified by RELOC and SYM (which is fully
|
||||
resolved). MAP is the object containing the reloc. */
|
||||
auto inline void __attribute__ ((always_inline))
|
||||
-elf_machine_rela (struct link_map *map,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
const Elf64_Rela *reloc,
|
||||
const Elf64_Sym *sym,
|
||||
const struct r_found_version *version,
|
||||
@@ -707,7 +708,7 @@ elf_machine_rela (struct link_map *map,
|
||||
|
||||
/* We need SYM_MAP even in the absence of TLS, for elf_machine_fixup_plt
|
||||
and STT_GNU_IFUNC. */
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
|
||||
Elf64_Addr value = SYMBOL_ADDRESS (sym_map, sym, true) + reloc->r_addend;
|
||||
|
||||
if (sym != NULL
|
||||
@@ -1036,7 +1037,7 @@ elf_machine_rela (struct link_map *map,
|
||||
}
|
||||
|
||||
auto inline void __attribute__ ((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
||||
int skip_ifunc)
|
||||
{
|
||||
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
|
||||
index f22db7860b4da3ec..36327c40a1972dd7 100644
|
||||
--- a/sysdeps/s390/s390-64/dl-machine.h
|
||||
+++ b/sysdeps/s390/s390-64/dl-machine.h
|
||||
@@ -75,7 +75,8 @@ elf_machine_load_address (void)
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
|
||||
static inline int __attribute__ ((unused))
|
||||
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
|
||||
+ int lazy, int profile)
|
||||
{
|
||||
extern void _dl_runtime_resolve (Elf64_Word);
|
||||
extern void _dl_runtime_profile (Elf64_Word);
|
||||
@@ -270,8 +271,9 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
||||
- const Elf64_Sym *sym, const struct r_found_version *version,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const Elf64_Rela *reloc, const Elf64_Sym *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
Elf64_Addr *const reloc_addr = reloc_addr_arg;
|
||||
@@ -304,7 +306,8 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
|
||||
/* Only needed for R_390_COPY below. */
|
||||
const Elf64_Sym *const refsym = sym;
|
||||
#endif
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version,
|
||||
+ r_type);
|
||||
Elf64_Addr value = SYMBOL_ADDRESS (sym_map, sym, true);
|
||||
|
||||
if (sym != NULL
|
||||
@@ -449,7 +452,7 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
Elf64_Addr l_addr, const Elf64_Rela *reloc,
|
||||
int skip_ifunc)
|
||||
{
|
||||
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
|
||||
index b94d3b39ec1dca64..5262aa69c06aa8db 100644
|
||||
--- a/sysdeps/x86_64/dl-machine.h
|
||||
+++ b/sysdeps/x86_64/dl-machine.h
|
||||
@@ -62,7 +62,8 @@ elf_machine_load_address (void)
|
||||
entries will jump to the on-demand fixup code in dl-runtime.c. */
|
||||
|
||||
static inline int __attribute__ ((unused, always_inline))
|
||||
-elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
|
||||
+elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
|
||||
+ int lazy, int profile)
|
||||
{
|
||||
Elf64_Addr *got;
|
||||
extern void _dl_runtime_resolve_fxsave (ElfW(Word)) attribute_hidden;
|
||||
@@ -260,8 +261,9 @@ elf_machine_plt_value (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute__ ((always_inline))
|
||||
-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
- const ElfW(Sym) *sym, const struct r_found_version *version,
|
||||
+elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[],
|
||||
+ const ElfW(Rela) *reloc, const ElfW(Sym) *sym,
|
||||
+ const struct r_found_version *version,
|
||||
void *const reloc_addr_arg, int skip_ifunc)
|
||||
{
|
||||
ElfW(Addr) *const reloc_addr = reloc_addr_arg;
|
||||
@@ -300,7 +302,7 @@ elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc,
|
||||
# ifndef RTLD_BOOTSTRAP
|
||||
const ElfW(Sym) *const refsym = sym;
|
||||
# endif
|
||||
- struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type);
|
||||
+ struct link_map *sym_map = RESOLVE_MAP (map, scope, &sym, version, r_type);
|
||||
ElfW(Addr) value = SYMBOL_ADDRESS (sym_map, sym, true);
|
||||
|
||||
if (sym != NULL
|
||||
@@ -539,7 +541,7 @@ elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
|
||||
auto inline void
|
||||
__attribute ((always_inline))
|
||||
-elf_machine_lazy_rel (struct link_map *map,
|
||||
+elf_machine_lazy_rel (struct link_map *map, struct r_scope_elem *scope[],
|
||||
ElfW(Addr) l_addr, const ElfW(Rela) *reloc,
|
||||
int skip_ifunc)
|
||||
{
|
||||
@@ -573,7 +575,7 @@ elf_machine_lazy_rel (struct link_map *map,
|
||||
|
||||
/* Always initialize TLS descriptors completely at load time, in
|
||||
case static TLS is allocated for it that requires locking. */
|
||||
- elf_machine_rela (map, reloc, sym, version, reloc_addr, skip_ifunc);
|
||||
+ elf_machine_rela (map, scope, reloc, sym, version, reloc_addr, skip_ifunc);
|
||||
}
|
||||
else if (__glibc_unlikely (r_type == R_X86_64_IRELATIVE))
|
||||
{
|
65
SOURCES/glibc-rh2047981-13.patch
Normal file
65
SOURCES/glibc-rh2047981-13.patch
Normal file
@ -0,0 +1,65 @@
|
||||
commit 54816ae98d57930b7c945f17485714a5574bfe47
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Thu Jul 29 11:13:57 2021 -0300
|
||||
|
||||
elf: Move LAV_CURRENT to link_lavcurrent.h
|
||||
|
||||
No functional change.
|
||||
|
||||
diff --git a/bits/link_lavcurrent.h b/bits/link_lavcurrent.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..44fbea1e8060997f
|
||||
--- /dev/null
|
||||
+++ b/bits/link_lavcurrent.h
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* Data structure for communication from the run-time dynamic linker for
|
||||
+ loaded ELF shared objects. LAV_CURRENT definition.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _LINK_H
|
||||
+# error "Never include <bits/link_lavcurrent.h> directly; use <link.h> instead."
|
||||
+#endif
|
||||
+
|
||||
+/* Version numbers for la_version handshake interface. */
|
||||
+#define LAV_CURRENT 1
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 6262a4a65cfd2148..b9751e8bd87c4f71 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -21,7 +21,7 @@ subdir := elf
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
-headers = elf.h bits/elfclass.h link.h bits/link.h
|
||||
+headers = elf.h bits/elfclass.h link.h bits/link.h bits/link_lavcurrent.h
|
||||
routines = $(all-dl-routines) dl-support dl-iteratephdr \
|
||||
dl-addr dl-addr-obj enbl-secure dl-profstub \
|
||||
dl-origin dl-libc dl-sym dl-sysdep dl-error \
|
||||
diff --git a/elf/link.h b/elf/link.h
|
||||
index c67a50dd8ee9187e..cbda60b4135997f6 100644
|
||||
--- a/elf/link.h
|
||||
+++ b/elf/link.h
|
||||
@@ -96,7 +96,7 @@ struct link_map
|
||||
#ifdef __USE_GNU
|
||||
|
||||
/* Version numbers for la_version handshake interface. */
|
||||
-#define LAV_CURRENT 1
|
||||
+#include <bits/link_lavcurrent.h>
|
||||
|
||||
/* Activity types signaled through la_activity. */
|
||||
enum
|
388
SOURCES/glibc-rh2047981-14.patch
Normal file
388
SOURCES/glibc-rh2047981-14.patch
Normal file
@ -0,0 +1,388 @@
|
||||
Added $(objpfx)tst-audit18: $(libdl) in elf/Makefile since
|
||||
we still have $(libdl) in RHEL8.
|
||||
|
||||
commit ed3ce71f5c64c5f07cbde0ef03554ea8950d8f2c
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Thu Nov 11 09:28:21 2021 -0300
|
||||
|
||||
elf: Move la_activity (LA_ACT_ADD) after _dl_add_to_namespace_list() (BZ #28062)
|
||||
|
||||
It ensures that the the namespace is guaranteed to not be empty.
|
||||
|
||||
Checked on x86_64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
elf/dl-load.c
|
||||
Conflict with missing MAP_ANON removal.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index b9751e8bd87c4f71..2312184692433313 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -219,6 +219,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-dlmopen-dlerror \
|
||||
tst-dlmopen-gethostbyname \
|
||||
tst-audit17 \
|
||||
+ tst-audit18 \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -354,6 +355,8 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
libmarkermod5-5 tst-tls20mod-bad tst-tls21mod \
|
||||
tst-dlmopen-dlerror-mod \
|
||||
tst-dlmopen-gethostbyname-mod \
|
||||
+ tst-auditmod18 \
|
||||
+ tst-audit18mod \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1539,6 +1542,11 @@ $(objpfx)tst-auditmod17.so: $(objpfx)tst-auditmod17.os
|
||||
CFLAGS-.os += $(call elide-stack-protector,.os,tst-auditmod17)
|
||||
tst-audit17-ENV = LD_AUDIT=$(objpfx)tst-auditmod17.so
|
||||
|
||||
+$(objpfx)tst-audit18: $(libdl)
|
||||
+$(objpfx)tst-audit18.out: $(objpfx)tst-auditmod18.so \
|
||||
+ $(objpfx)tst-audit18mod.so
|
||||
+tst-audit18-ARGS = -- $(host-test-program-cmd)
|
||||
+
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
-Wl,--version-script=tst-sonamemove-linkmod1.map \
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index 303e6594f9af9b7e..de5aef5777045da5 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -978,42 +978,6 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd,
|
||||
}
|
||||
#endif
|
||||
|
||||
- /* Signal that we are going to add new objects. */
|
||||
- if (r->r_state == RT_CONSISTENT)
|
||||
- {
|
||||
-#ifdef SHARED
|
||||
- /* Auditing checkpoint: we are going to add new objects. */
|
||||
- if ((mode & __RTLD_AUDIT) == 0
|
||||
- && __glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct link_map *head = GL(dl_ns)[nsid]._ns_loaded;
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- afct->activity (&link_map_audit_state (head, cnt)->cookie,
|
||||
- LA_ACT_ADD);
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
- /* Notify the debugger we have added some objects. We need to
|
||||
- call _dl_debug_initialize in a static program in case dynamic
|
||||
- linking has not been used before. */
|
||||
- r->r_state = RT_ADD;
|
||||
- _dl_debug_state ();
|
||||
- LIBC_PROBE (map_start, 2, nsid, r);
|
||||
- make_consistent = true;
|
||||
- }
|
||||
- else
|
||||
- assert (r->r_state == RT_ADD);
|
||||
-
|
||||
/* Enter the new object in the list of loaded objects. */
|
||||
l = _dl_new_object (realname, name, l_type, loader, mode, nsid);
|
||||
if (__glibc_unlikely (l == NULL))
|
||||
@@ -1432,6 +1396,44 @@ cannot enable executable stack as shared object requires");
|
||||
/* Now that the object is fully initialized add it to the object list. */
|
||||
_dl_add_to_namespace_list (l, nsid);
|
||||
|
||||
+ /* Signal that we are going to add new objects. */
|
||||
+ if (r->r_state == RT_CONSISTENT)
|
||||
+ {
|
||||
+#ifdef SHARED
|
||||
+ /* Auditing checkpoint: we are going to add new objects. Since this
|
||||
+ is called after _dl_add_to_namespace_list the namespace is guaranteed
|
||||
+ to not be empty. */
|
||||
+ if ((mode & __RTLD_AUDIT) == 0
|
||||
+ && __glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
+ {
|
||||
+ struct link_map *head = GL(dl_ns)[nsid]._ns_loaded;
|
||||
+ /* Do not call the functions for any auditing object. */
|
||||
+ if (head->l_auditing == 0)
|
||||
+ {
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->activity != NULL)
|
||||
+ afct->activity (&link_map_audit_state (head, cnt)->cookie,
|
||||
+ LA_ACT_ADD);
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
+ /* Notify the debugger we have added some objects. We need to
|
||||
+ call _dl_debug_initialize in a static program in case dynamic
|
||||
+ linking has not been used before. */
|
||||
+ r->r_state = RT_ADD;
|
||||
+ _dl_debug_state ();
|
||||
+ LIBC_PROBE (map_start, 2, nsid, r);
|
||||
+ make_consistent = true;
|
||||
+ }
|
||||
+ else
|
||||
+ assert (r->r_state == RT_ADD);
|
||||
+
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have a new object. */
|
||||
if (__glibc_unlikely (GLRO(dl_naudit) > 0)
|
||||
diff --git a/elf/tst-audit18.c b/elf/tst-audit18.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..ef784908f60d50aa
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit18.c
|
||||
@@ -0,0 +1,129 @@
|
||||
+/* Check DT_AUDIT with dlmopen.
|
||||
+ Copyright (C) 2021 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 <array_length.h>
|
||||
+#include <getopt.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <unistd.h>
|
||||
+#include <gnu/lib-names.h>
|
||||
+#include <support/capture_subprocess.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+#include <support/xstdio.h>
|
||||
+#include <support/support.h>
|
||||
+
|
||||
+static int restart;
|
||||
+#define CMDLINE_OPTIONS \
|
||||
+ { "restart", no_argument, &restart, 1 },
|
||||
+
|
||||
+static int
|
||||
+handle_restart (void)
|
||||
+{
|
||||
+ {
|
||||
+ void *h = xdlmopen (LM_ID_NEWLM, LIBC_SO, RTLD_NOW);
|
||||
+
|
||||
+ pid_t (*s) (void) = xdlsym (h, "getpid");
|
||||
+ TEST_COMPARE (s (), getpid ());
|
||||
+
|
||||
+ xdlclose (h);
|
||||
+ }
|
||||
+
|
||||
+ {
|
||||
+ void *h = xdlmopen (LM_ID_NEWLM, "tst-audit18mod.so", RTLD_NOW);
|
||||
+
|
||||
+ int (*foo) (void) = xdlsym (h, "foo");
|
||||
+ TEST_COMPARE (foo (), 10);
|
||||
+
|
||||
+ xdlclose (h);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (int argc, char *argv[])
|
||||
+{
|
||||
+ /* We must have either:
|
||||
+ - One our fource parameters left if called initially:
|
||||
+ + path to ld.so optional
|
||||
+ + "--library-path" optional
|
||||
+ + the library path optional
|
||||
+ + the application name */
|
||||
+
|
||||
+ if (restart)
|
||||
+ return handle_restart ();
|
||||
+
|
||||
+ char *spargv[9];
|
||||
+ int i = 0;
|
||||
+ for (; i < argc - 1; i++)
|
||||
+ spargv[i] = argv[i + 1];
|
||||
+ spargv[i++] = (char *) "--direct";
|
||||
+ spargv[i++] = (char *) "--restart";
|
||||
+ spargv[i] = NULL;
|
||||
+
|
||||
+ setenv ("LD_AUDIT", "tst-auditmod18.so", 0);
|
||||
+ struct support_capture_subprocess result
|
||||
+ = support_capture_subprogram (spargv[0], spargv);
|
||||
+ support_capture_subprocess_check (&result, "tst-audit18", 0, sc_allow_stderr);
|
||||
+
|
||||
+ struct
|
||||
+ {
|
||||
+ const char *name;
|
||||
+ bool found;
|
||||
+ } audit_iface[] =
|
||||
+ {
|
||||
+ { "la_version", false },
|
||||
+ { "la_objsearch", false },
|
||||
+ { "la_activity", false },
|
||||
+ { "la_objopen", false },
|
||||
+ { "la_objclose", false },
|
||||
+ { "la_preinit", false },
|
||||
+#if __WORDSIZE == 32
|
||||
+ { "la_symbind32", false },
|
||||
+#elif __WORDSIZE == 64
|
||||
+ { "la_symbind64", false },
|
||||
+#endif
|
||||
+ };
|
||||
+
|
||||
+ /* Some hooks are called more than once but the test only check if any
|
||||
+ is called at least once. */
|
||||
+ FILE *out = fmemopen (result.err.buffer, result.err.length, "r");
|
||||
+ TEST_VERIFY (out != NULL);
|
||||
+ char *buffer = NULL;
|
||||
+ size_t buffer_length = 0;
|
||||
+ while (xgetline (&buffer, &buffer_length, out))
|
||||
+ {
|
||||
+ for (int i = 0; i < array_length (audit_iface); i++)
|
||||
+ if (strncmp (buffer, audit_iface[i].name,
|
||||
+ strlen (audit_iface[i].name)) == 0)
|
||||
+ audit_iface[i].found = true;
|
||||
+ }
|
||||
+ free (buffer);
|
||||
+ xfclose (out);
|
||||
+
|
||||
+ for (int i = 0; i < array_length (audit_iface); i++)
|
||||
+ TEST_COMPARE (audit_iface[i].found, true);
|
||||
+
|
||||
+ support_capture_subprocess_free (&result);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define TEST_FUNCTION_ARGV do_test
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-audit18mod.c b/elf/tst-audit18mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..096a9167c9f8353f
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit18mod.c
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* Check DT_AUDIT with dlmopen.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ return 10;
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod18.c b/elf/tst-auditmod18.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..182992e9fdb1620c
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod18.c
|
||||
@@ -0,0 +1,73 @@
|
||||
+/* Check DT_AUDIT with dlmopen.
|
||||
+ Copyright (C) 2021 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>
|
||||
+#include <link.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+char *
|
||||
+la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+ return (char *) name;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_activity (uintptr_t *cookie, unsigned int flag)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+ return LA_FLG_BINDTO | LA_FLG_BINDFROM;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objclose (uintptr_t *cookie)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_preinit (uintptr_t *cookie)
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+}
|
||||
+
|
||||
+uintptr_t
|
||||
+#if __ELF_NATIVE_CLASS == 32
|
||||
+la_symbind32 (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
+ uintptr_t *defcook, unsigned int *flags, const char *symname)
|
||||
+#else
|
||||
+la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
+ uintptr_t *defcook, unsigned int *flags, const char *symname)
|
||||
+#endif
|
||||
+{
|
||||
+ fprintf (stderr, "%s\n", __func__);
|
||||
+ return sym->st_value;
|
||||
+}
|
160
SOURCES/glibc-rh2047981-15.patch
Normal file
160
SOURCES/glibc-rh2047981-15.patch
Normal file
@ -0,0 +1,160 @@
|
||||
commit aee6e90f93e285016b6cd9c8bd00402c19ba271b
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Mon Jul 19 15:47:51 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_objopen
|
||||
|
||||
It consolidates the code required to call la_objopen audit callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 2312184692433313..08a32a712a34f2cc 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -64,7 +64,8 @@ elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin \
|
||||
# interpreter and operating independent of libc.
|
||||
rtld-routines = rtld $(all-dl-routines) dl-sysdep dl-environ dl-minimal \
|
||||
dl-error-minimal dl-conflict dl-hwcaps dl-hwcaps_split dl-hwcaps-subdirs \
|
||||
- dl-usage dl-diagnostics dl-diagnostics-kernel dl-diagnostics-cpu
|
||||
+ dl-usage dl-diagnostics dl-diagnostics-kernel dl-diagnostics-cpu \
|
||||
+ dl-audit
|
||||
all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines)
|
||||
|
||||
CFLAGS-dl-runtime.c += -fexceptions -fasynchronous-unwind-tables
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..4066dfe85146b9d4
|
||||
--- /dev/null
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -0,0 +1,39 @@
|
||||
+/* Audit common functions.
|
||||
+ Copyright (C) 2021 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 <ldsodefs.h>
|
||||
+
|
||||
+void
|
||||
+_dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
+{
|
||||
+ if (__glibc_likely (GLRO(dl_naudit) == 0))
|
||||
+ return;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->objopen != NULL)
|
||||
+ {
|
||||
+ struct auditstate *state = link_map_audit_state (l, cnt);
|
||||
+ state->bindflags = afct->objopen (l, nsid, &state->cookie);
|
||||
+ l->l_audit_any_plt |= state->bindflags != 0;
|
||||
+ }
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index de5aef5777045da5..c11b1d1781e9b40b 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1436,22 +1436,8 @@ cannot enable executable stack as shared object requires");
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have a new object. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0)
|
||||
- && !GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->objopen != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (l, cnt);
|
||||
- state->bindflags = afct->objopen (l, nsid, &state->cookie);
|
||||
- l->l_audit_any_plt |= state->bindflags != 0;
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
+ if (!GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
|
||||
+ _dl_audit_objopen (l, nsid);
|
||||
#endif
|
||||
|
||||
return l;
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index f3836b8a78faaf27..1982e42390760e0a 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1075,25 +1075,6 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
|
||||
dlmargs.map->l_auditing = 1;
|
||||
}
|
||||
|
||||
-/* Notify the the audit modules that the object MAP has already been
|
||||
- loaded. */
|
||||
-static void
|
||||
-notify_audit_modules_of_loaded_object (struct link_map *map)
|
||||
-{
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->objopen != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (map, cnt);
|
||||
- state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie);
|
||||
- map->l_audit_any_plt |= state->bindflags != 0;
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
/* Load all audit modules. */
|
||||
static void
|
||||
load_audit_modules (struct link_map *main_map, struct audit_list *audit_list)
|
||||
@@ -1112,8 +1093,8 @@ load_audit_modules (struct link_map *main_map, struct audit_list *audit_list)
|
||||
program and the dynamic linker itself). */
|
||||
if (GLRO(dl_naudit) > 0)
|
||||
{
|
||||
- notify_audit_modules_of_loaded_object (main_map);
|
||||
- notify_audit_modules_of_loaded_object (&GL(dl_rtld_map));
|
||||
+ _dl_audit_objopen (main_map, LM_ID_BASE);
|
||||
+ _dl_audit_objopen (&GL(dl_rtld_map), LM_ID_BASE);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 2dd6f0c3c4aaaef5..410f070e28b74bdf 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1268,6 +1268,11 @@ link_map_audit_state (struct link_map *l, size_t index)
|
||||
{
|
||||
return &l->l_audit[index];
|
||||
}
|
||||
+
|
||||
+/* Call the la_objopen from the audit modules for the link_map L on the
|
||||
+ namespace identification NSID. */
|
||||
+void _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
+ attribute_hidden;
|
||||
#endif /* SHARED */
|
||||
|
||||
__END_DECLS
|
253
SOURCES/glibc-rh2047981-16.patch
Normal file
253
SOURCES/glibc-rh2047981-16.patch
Normal file
@ -0,0 +1,253 @@
|
||||
commit 3dac3959a5cb585b065cef2cb8a8d909c907e202
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Tue Jul 20 11:03:34 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_activity_map and _dl_audit_activity_nsid
|
||||
|
||||
It consolidates the code required to call la_activity audit
|
||||
callback.
|
||||
|
||||
Also for a new Lmid_t the namespace link_map list are empty, so it
|
||||
requires to check if before using it. This can happen for when audit
|
||||
module is used along with dlmopen.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 4066dfe85146b9d4..74b87f4b39be75e1 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -18,6 +18,32 @@
|
||||
|
||||
#include <ldsodefs.h>
|
||||
|
||||
+void
|
||||
+_dl_audit_activity_map (struct link_map *l, int action)
|
||||
+{
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->activity != NULL)
|
||||
+ afct->activity (&link_map_audit_state (l, cnt)->cookie, action);
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+_dl_audit_activity_nsid (Lmid_t nsid, int action)
|
||||
+{
|
||||
+ /* If head is NULL, the namespace has become empty, and the audit interface
|
||||
+ does not give us a way to signal LA_ACT_CONSISTENT for it because the
|
||||
+ first loaded module is used to identify the namespace. */
|
||||
+ struct link_map *head = GL(dl_ns)[nsid]._ns_loaded;
|
||||
+ if (__glibc_likely (GLRO(dl_naudit) == 0)
|
||||
+ || head == NULL || head->l_auditing)
|
||||
+ return;
|
||||
+
|
||||
+ _dl_audit_activity_map (head, action);
|
||||
+}
|
||||
+
|
||||
void
|
||||
_dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
{
|
||||
diff --git a/elf/dl-close.c b/elf/dl-close.c
|
||||
index 698bda929c0eab6c..1ba594b600c4c87a 100644
|
||||
--- a/elf/dl-close.c
|
||||
+++ b/elf/dl-close.c
|
||||
@@ -478,25 +478,7 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we will start deleting objects. */
|
||||
- if (__glibc_unlikely (do_audit))
|
||||
- {
|
||||
- struct link_map *head = ns->_ns_loaded;
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
- {
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (head, cnt);
|
||||
- afct->activity (&state->cookie, LA_ACT_DELETE);
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_activity_nsid (nsid, LA_ACT_DELETE);
|
||||
#endif
|
||||
|
||||
/* Notify the debugger we are about to remove some loaded objects. */
|
||||
@@ -791,32 +773,9 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
__rtld_lock_unlock_recursive (GL(dl_load_tls_lock));
|
||||
|
||||
#ifdef SHARED
|
||||
- /* Auditing checkpoint: we have deleted all objects. */
|
||||
- if (__glibc_unlikely (do_audit))
|
||||
- {
|
||||
- struct link_map *head = ns->_ns_loaded;
|
||||
- /* If head is NULL, the namespace has become empty, and the
|
||||
- audit interface does not give us a way to signal
|
||||
- LA_ACT_CONSISTENT for it because the first loaded module is
|
||||
- used to identify the namespace.
|
||||
-
|
||||
- Furthermore, do not notify auditors of the cleanup of a
|
||||
- failed audit module loading attempt. */
|
||||
- if (head != NULL && head->l_auditing == 0)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (head, cnt);
|
||||
- afct->activity (&state->cookie, LA_ACT_CONSISTENT);
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ /* Auditing checkpoint: we have deleted all objects. Also, do not notify
|
||||
+ auditors of the cleanup of a failed audit module loading attempt. */
|
||||
+ _dl_audit_activity_nsid (nsid, LA_ACT_CONSISTENT);
|
||||
#endif
|
||||
|
||||
if (__builtin_expect (ns->_ns_loaded == NULL, 0)
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index c11b1d1781e9b40b..8a18c761bb753e37 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1403,24 +1403,8 @@ cannot enable executable stack as shared object requires");
|
||||
/* Auditing checkpoint: we are going to add new objects. Since this
|
||||
is called after _dl_add_to_namespace_list the namespace is guaranteed
|
||||
to not be empty. */
|
||||
- if ((mode & __RTLD_AUDIT) == 0
|
||||
- && __glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct link_map *head = GL(dl_ns)[nsid]._ns_loaded;
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- afct->activity (&link_map_audit_state (head, cnt)->cookie,
|
||||
- LA_ACT_ADD);
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ if ((mode & __RTLD_AUDIT) == 0)
|
||||
+ _dl_audit_activity_nsid (nsid, LA_ACT_ADD);
|
||||
#endif
|
||||
|
||||
/* Notify the debugger we have added some objects. We need to
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index b5a4da04907d8d29..660a56b2fb2639cd 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -598,25 +598,7 @@ dl_open_worker_begin (void *a)
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have added all objects. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct link_map *head = GL(dl_ns)[new->l_ns]._ns_loaded;
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (head, cnt);
|
||||
- afct->activity (&state->cookie, LA_ACT_CONSISTENT);
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_activity_nsid (new->l_ns, LA_ACT_CONSISTENT);
|
||||
#endif
|
||||
|
||||
/* Notify the debugger all new objects are now ready to go. */
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 1982e42390760e0a..767acd122262b824 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1799,18 +1799,7 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
|
||||
/* Auditing checkpoint: we are ready to signal that the initial map
|
||||
is being constructed. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- afct->activity (&link_map_audit_state (main_map, cnt)->cookie,
|
||||
- LA_ACT_ADD);
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_activity_map (main_map, LA_ACT_ADD);
|
||||
|
||||
/* We have two ways to specify objects to preload: via environment
|
||||
variable and via the file /etc/ld.so.preload. The latter can also
|
||||
@@ -2484,23 +2473,7 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we have added all objects. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->activity != NULL)
|
||||
- afct->activity (&link_map_audit_state (head, cnt)->cookie,
|
||||
- LA_ACT_CONSISTENT);
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_activity_nsid (LM_ID_BASE, LA_ACT_CONSISTENT);
|
||||
#endif
|
||||
|
||||
/* Notify the debugger all new objects are now ready to go. We must re-get
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 410f070e28b74bdf..05737342d6287233 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1269,6 +1269,16 @@ link_map_audit_state (struct link_map *l, size_t index)
|
||||
return &l->l_audit[index];
|
||||
}
|
||||
|
||||
+/* Call the la_activity from the audit modules from the link map L and issues
|
||||
+ the ACTION argument. */
|
||||
+void _dl_audit_activity_map (struct link_map *l, int action)
|
||||
+ attribute_hidden;
|
||||
+
|
||||
+/* Call the la_activity from the audit modules from the link map from the
|
||||
+ namespace NSID and issues the ACTION argument. */
|
||||
+void _dl_audit_activity_nsid (Lmid_t nsid, int action)
|
||||
+ attribute_hidden;
|
||||
+
|
||||
/* Call the la_objopen from the audit modules for the link_map L on the
|
||||
namespace identification NSID. */
|
||||
void _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
156
SOURCES/glibc-rh2047981-17.patch
Normal file
156
SOURCES/glibc-rh2047981-17.patch
Normal file
@ -0,0 +1,156 @@
|
||||
commit c91008d3490e4e3ce29520068405f081f0d368ca
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Tue Jul 20 13:47:36 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_objsearch
|
||||
|
||||
It consolidates the code required to call la_objsearch audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 74b87f4b39be75e1..5682427220569d90 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -44,6 +44,28 @@ _dl_audit_activity_nsid (Lmid_t nsid, int action)
|
||||
_dl_audit_activity_map (head, action);
|
||||
}
|
||||
|
||||
+const char *
|
||||
+_dl_audit_objsearch (const char *name, struct link_map *l, unsigned int code)
|
||||
+{
|
||||
+ if (l == NULL || l->l_auditing || code == 0)
|
||||
+ return name;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->objsearch != NULL)
|
||||
+ {
|
||||
+ struct auditstate *state = link_map_audit_state (l, cnt);
|
||||
+ name = afct->objsearch (name, &state->cookie, code);
|
||||
+ if (name == NULL)
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+
|
||||
+ return name;
|
||||
+}
|
||||
+
|
||||
void
|
||||
_dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
{
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index 8a18c761bb753e37..1613217a236c7fc3 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -1517,32 +1517,20 @@ open_verify (const char *name, int fd,
|
||||
|
||||
#ifdef SHARED
|
||||
/* Give the auditing libraries a chance. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0) && whatcode != 0
|
||||
- && loader->l_auditing == 0)
|
||||
+ if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
{
|
||||
const char *original_name = name;
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->objsearch != NULL)
|
||||
- {
|
||||
- struct auditstate *state = link_map_audit_state (loader, cnt);
|
||||
- name = afct->objsearch (name, &state->cookie, whatcode);
|
||||
- if (name == NULL)
|
||||
- /* Ignore the path. */
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
+ name = _dl_audit_objsearch (name, loader, whatcode);
|
||||
+ if (name == NULL)
|
||||
+ return -1;
|
||||
|
||||
if (fd != -1 && name != original_name && strcmp (name, original_name))
|
||||
- {
|
||||
- /* An audit library changed what we're supposed to open,
|
||||
- so FD no longer matches it. */
|
||||
- __close_nocancel (fd);
|
||||
- fd = -1;
|
||||
- }
|
||||
+ {
|
||||
+ /* An audit library changed what we're supposed to open,
|
||||
+ so FD no longer matches it. */
|
||||
+ __close_nocancel (fd);
|
||||
+ fd = -1;
|
||||
+ }
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1992,36 +1980,17 @@ _dl_map_object (struct link_map *loader, const char *name,
|
||||
#ifdef SHARED
|
||||
/* Give the auditing libraries a chance to change the name before we
|
||||
try anything. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0)
|
||||
- && (loader == NULL || loader->l_auditing == 0))
|
||||
+ if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
{
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ const char *before = name;
|
||||
+ name = _dl_audit_objsearch (name, loader, LA_SER_ORIG);
|
||||
+ if (name == NULL)
|
||||
{
|
||||
- if (afct->objsearch != NULL)
|
||||
- {
|
||||
- const char *before = name;
|
||||
- struct auditstate *state = link_map_audit_state (loader, cnt);
|
||||
- name = afct->objsearch (name, &state->cookie, LA_SER_ORIG);
|
||||
- if (name == NULL)
|
||||
- {
|
||||
- /* Do not try anything further. */
|
||||
- fd = -1;
|
||||
- goto no_file;
|
||||
- }
|
||||
- if (before != name && strcmp (before, name) != 0)
|
||||
- {
|
||||
- if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
|
||||
- _dl_debug_printf ("audit changed filename %s -> %s\n",
|
||||
- before, name);
|
||||
-
|
||||
- if (origname == NULL)
|
||||
- origname = before;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
+ fd = -1;
|
||||
+ goto no_file;
|
||||
}
|
||||
+ if (before != name && strcmp (before, name) != 0)
|
||||
+ origname = before;
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 05737342d6287233..da83e717e8cd8e0b 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1269,6 +1269,13 @@ link_map_audit_state (struct link_map *l, size_t index)
|
||||
return &l->l_audit[index];
|
||||
}
|
||||
|
||||
+/* Call the la_objsearch from the audit modules from the link map L. If
|
||||
+ ORIGNAME is non NULL, it is updated with the revious name prior calling
|
||||
+ la_objsearch. */
|
||||
+const char *_dl_audit_objsearch (const char *name, struct link_map *l,
|
||||
+ unsigned int code)
|
||||
+ attribute_hidden;
|
||||
+
|
||||
/* Call the la_activity from the audit modules from the link map L and issues
|
||||
the ACTION argument. */
|
||||
void _dl_audit_activity_map (struct link_map *l, int action)
|
122
SOURCES/glibc-rh2047981-18.patch
Normal file
122
SOURCES/glibc-rh2047981-18.patch
Normal file
@ -0,0 +1,122 @@
|
||||
commit 311c9ee54ea963ff69bd3a2e6981c37e893b4c3e
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Tue Jul 20 14:04:51 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_objclose
|
||||
|
||||
It consolidates the code required to call la_objclose audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 5682427220569d90..cb1c3de93cba447b 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -85,3 +85,24 @@ _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
afct = afct->next;
|
||||
}
|
||||
}
|
||||
+
|
||||
+void
|
||||
+_dl_audit_objclose (struct link_map *l)
|
||||
+{
|
||||
+ if (__glibc_likely (GLRO(dl_naudit) == 0)
|
||||
+ || GL(dl_ns)[l->l_ns]._ns_loaded->l_auditing)
|
||||
+ return;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->objclose != NULL)
|
||||
+ {
|
||||
+ struct auditstate *state= link_map_audit_state (l, cnt);
|
||||
+ /* Return value is ignored. */
|
||||
+ afct->objclose (&state->cookie);
|
||||
+ }
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/elf/dl-close.c b/elf/dl-close.c
|
||||
index 1ba594b600c4c87a..74ca9a85dd309780 100644
|
||||
--- a/elf/dl-close.c
|
||||
+++ b/elf/dl-close.c
|
||||
@@ -266,9 +266,6 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
used + (nsid == LM_ID_BASE), true);
|
||||
|
||||
/* Call all termination functions at once. */
|
||||
-#ifdef SHARED
|
||||
- bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
|
||||
-#endif
|
||||
bool unload_any = false;
|
||||
bool scope_mem_left = false;
|
||||
unsigned int unload_global = 0;
|
||||
@@ -302,22 +299,7 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: we remove an object. */
|
||||
- if (__glibc_unlikely (do_audit))
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->objclose != NULL)
|
||||
- {
|
||||
- struct auditstate *state
|
||||
- = link_map_audit_state (imap, cnt);
|
||||
- /* Return value is ignored. */
|
||||
- (void) afct->objclose (&state->cookie);
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_objclose (imap);
|
||||
#endif
|
||||
|
||||
/* This object must not be used anymore. */
|
||||
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
|
||||
index 915ceb104e1c81d6..e102d93647cb8c47 100644
|
||||
--- a/elf/dl-fini.c
|
||||
+++ b/elf/dl-fini.c
|
||||
@@ -146,21 +146,7 @@ _dl_fini (void)
|
||||
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: another object closed. */
|
||||
- if (!do_audit && __builtin_expect (GLRO(dl_naudit) > 0, 0))
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->objclose != NULL)
|
||||
- {
|
||||
- struct auditstate *state
|
||||
- = link_map_audit_state (l, cnt);
|
||||
- /* Return value is ignored. */
|
||||
- (void) afct->objclose (&state->cookie);
|
||||
- }
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
+ _dl_audit_objclose (l);
|
||||
#endif
|
||||
}
|
||||
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index da83e717e8cd8e0b..3db25c5be1acf871 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1290,6 +1290,10 @@ void _dl_audit_activity_nsid (Lmid_t nsid, int action)
|
||||
namespace identification NSID. */
|
||||
void _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
attribute_hidden;
|
||||
+
|
||||
+/* Call the la_objclose from the audit modules for the link_map L. */
|
||||
+void _dl_audit_objclose (struct link_map *l)
|
||||
+ attribute_hidden;
|
||||
#endif /* SHARED */
|
||||
|
||||
__END_DECLS
|
333
SOURCES/glibc-rh2047981-19.patch
Normal file
333
SOURCES/glibc-rh2047981-19.patch
Normal file
@ -0,0 +1,333 @@
|
||||
commit cda4f265c65fb6c4ce38ca1cf0a7e527c5e77cd5
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Tue Jul 20 15:58:35 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_symbind_alt and _dl_audit_symbind
|
||||
|
||||
It consolidates the code required to call la_symbind{32,64} audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/Versions b/elf/Versions
|
||||
index be88c48e6d45a937..c5d4342cf1f5124c 100644
|
||||
--- a/elf/Versions
|
||||
+++ b/elf/Versions
|
||||
@@ -59,6 +59,7 @@ ld {
|
||||
_dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
|
||||
_dl_deallocate_tls; _dl_make_stack_executable;
|
||||
_dl_rtld_di_serinfo; _dl_starting_up; _dl_fatal_printf;
|
||||
+ _dl_audit_symbind_alt;
|
||||
_rtld_global; _rtld_global_ro;
|
||||
|
||||
# Only here for gdb while a better method is developed.
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index cb1c3de93cba447b..a21530f30bc5524b 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -16,6 +16,7 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
+#include <assert.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
void
|
||||
@@ -106,3 +107,124 @@ _dl_audit_objclose (struct link_map *l)
|
||||
afct = afct->next;
|
||||
}
|
||||
}
|
||||
+
|
||||
+void
|
||||
+_dl_audit_symbind_alt (struct link_map *l, const ElfW(Sym) *ref, void **value,
|
||||
+ lookup_t result)
|
||||
+{
|
||||
+ if ((l->l_audit_any_plt | result->l_audit_any_plt) == 0)
|
||||
+ return;
|
||||
+
|
||||
+ const char *strtab = (const char *) D_PTR (result, l_info[DT_STRTAB]);
|
||||
+ /* Compute index of the symbol entry in the symbol table of the DSO with
|
||||
+ the definition. */
|
||||
+ unsigned int ndx = (ref - (ElfW(Sym) *) D_PTR (result, l_info[DT_SYMTAB]));
|
||||
+
|
||||
+ unsigned int altvalue = 0;
|
||||
+ /* Synthesize a symbol record where the st_value field is the result. */
|
||||
+ ElfW(Sym) sym = *ref;
|
||||
+ sym.st_value = (ElfW(Addr)) *value;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ struct auditstate *match_audit = link_map_audit_state (l, cnt);
|
||||
+ struct auditstate *result_audit = link_map_audit_state (result, cnt);
|
||||
+ if (afct->symbind != NULL
|
||||
+ && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0
|
||||
+ || ((result_audit->bindflags & LA_FLG_BINDTO)
|
||||
+ != 0)))
|
||||
+ {
|
||||
+ unsigned int flags = altvalue | LA_SYMB_DLSYM;
|
||||
+ uintptr_t new_value = afct->symbind (&sym, ndx,
|
||||
+ &match_audit->cookie,
|
||||
+ &result_audit->cookie,
|
||||
+ &flags, strtab + ref->st_name);
|
||||
+ if (new_value != (uintptr_t) sym.st_value)
|
||||
+ {
|
||||
+ altvalue = LA_SYMB_ALTVALUE;
|
||||
+ sym.st_value = new_value;
|
||||
+ }
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+
|
||||
+ *value = (void *) sym.st_value;
|
||||
+ }
|
||||
+}
|
||||
+rtld_hidden_def (_dl_audit_symbind_alt)
|
||||
+
|
||||
+void
|
||||
+_dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
+ const ElfW(Sym) *defsym, DL_FIXUP_VALUE_TYPE *value,
|
||||
+ lookup_t result)
|
||||
+{
|
||||
+ reloc_result->bound = result;
|
||||
+ /* Compute index of the symbol entry in the symbol table of the DSO with the
|
||||
+ definition. */
|
||||
+ reloc_result->boundndx = (defsym - (ElfW(Sym) *) D_PTR (result,
|
||||
+ l_info[DT_SYMTAB]));
|
||||
+
|
||||
+ if ((l->l_audit_any_plt | result->l_audit_any_plt) == 0)
|
||||
+ {
|
||||
+ /* Set all bits since this symbol binding is not interesting. */
|
||||
+ reloc_result->enterexit = (1u << DL_NNS) - 1;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /* Synthesize a symbol record where the st_value field is the result. */
|
||||
+ ElfW(Sym) sym = *defsym;
|
||||
+ sym.st_value = DL_FIXUP_VALUE_ADDR (*value);
|
||||
+
|
||||
+ /* Keep track whether there is any interest in tracing the call in the lower
|
||||
+ two bits. */
|
||||
+ assert (DL_NNS * 2 <= sizeof (reloc_result->flags) * 8);
|
||||
+ assert ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) == 3);
|
||||
+ reloc_result->enterexit = LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT;
|
||||
+
|
||||
+ const char *strtab2 = (const void *) D_PTR (result, l_info[DT_STRTAB]);
|
||||
+
|
||||
+ unsigned int flags = 0;
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ /* XXX Check whether both DSOs must request action or only one */
|
||||
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
+ struct auditstate *result_state = link_map_audit_state (result, cnt);
|
||||
+ if ((l_state->bindflags & LA_FLG_BINDFROM) != 0
|
||||
+ && (result_state->bindflags & LA_FLG_BINDTO) != 0)
|
||||
+ {
|
||||
+ if (afct->symbind != NULL)
|
||||
+ {
|
||||
+ uintptr_t new_value = afct->symbind (&sym,
|
||||
+ reloc_result->boundndx,
|
||||
+ &l_state->cookie,
|
||||
+ &result_state->cookie,
|
||||
+ &flags,
|
||||
+ strtab2 + defsym->st_name);
|
||||
+ if (new_value != (uintptr_t) sym.st_value)
|
||||
+ {
|
||||
+ flags |= LA_SYMB_ALTVALUE;
|
||||
+ sym.st_value = new_value;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Remember the results for every audit library and store a summary
|
||||
+ in the first two bits. */
|
||||
+ reloc_result->enterexit &= flags & (LA_SYMB_NOPLTENTER
|
||||
+ | LA_SYMB_NOPLTEXIT);
|
||||
+ reloc_result->enterexit |= ((flags & (LA_SYMB_NOPLTENTER
|
||||
+ | LA_SYMB_NOPLTEXIT))
|
||||
+ << ((cnt + 1) * 2));
|
||||
+ }
|
||||
+ else
|
||||
+ /* If the bind flags say this auditor is not interested, set the bits
|
||||
+ manually. */
|
||||
+ reloc_result->enterexit |= ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT)
|
||||
+ << ((cnt + 1) * 2));
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+
|
||||
+ reloc_result->flags = flags;
|
||||
+ *value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
+}
|
||||
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
|
||||
index 4ccd7c30678fafad..d4840a7c17441126 100644
|
||||
--- a/elf/dl-runtime.c
|
||||
+++ b/elf/dl-runtime.c
|
||||
@@ -296,84 +296,7 @@ _dl_profile_fixup (
|
||||
auditing libraries the possibility to change the value and
|
||||
tell us whether further auditing is wanted. */
|
||||
if (defsym != NULL && GLRO(dl_naudit) > 0)
|
||||
- {
|
||||
- reloc_result->bound = result;
|
||||
- /* Compute index of the symbol entry in the symbol table of
|
||||
- the DSO with the definition. */
|
||||
- reloc_result->boundndx = (defsym
|
||||
- - (ElfW(Sym) *) D_PTR (result,
|
||||
- l_info[DT_SYMTAB]));
|
||||
-
|
||||
- /* Determine whether any of the two participating DSOs is
|
||||
- interested in auditing. */
|
||||
- if ((l->l_audit_any_plt | result->l_audit_any_plt) != 0)
|
||||
- {
|
||||
- unsigned int flags = 0;
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- /* Synthesize a symbol record where the st_value field is
|
||||
- the result. */
|
||||
- ElfW(Sym) sym = *defsym;
|
||||
- sym.st_value = DL_FIXUP_VALUE_ADDR (value);
|
||||
-
|
||||
- /* Keep track whether there is any interest in tracing
|
||||
- the call in the lower two bits. */
|
||||
- assert (DL_NNS * 2 <= sizeof (reloc_result->flags) * 8);
|
||||
- assert ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) == 3);
|
||||
- reloc_result->enterexit = LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT;
|
||||
-
|
||||
- const char *strtab2 = (const void *) D_PTR (result,
|
||||
- l_info[DT_STRTAB]);
|
||||
-
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- /* XXX Check whether both DSOs must request action or
|
||||
- only one */
|
||||
- struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
- struct auditstate *result_state
|
||||
- = link_map_audit_state (result, cnt);
|
||||
- if ((l_state->bindflags & LA_FLG_BINDFROM) != 0
|
||||
- && (result_state->bindflags & LA_FLG_BINDTO) != 0)
|
||||
- {
|
||||
- if (afct->symbind != NULL)
|
||||
- {
|
||||
- uintptr_t new_value
|
||||
- = afct->symbind (&sym, reloc_result->boundndx,
|
||||
- &l_state->cookie,
|
||||
- &result_state->cookie,
|
||||
- &flags,
|
||||
- strtab2 + defsym->st_name);
|
||||
- if (new_value != (uintptr_t) sym.st_value)
|
||||
- {
|
||||
- flags |= LA_SYMB_ALTVALUE;
|
||||
- sym.st_value = new_value;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- /* Remember the results for every audit library and
|
||||
- store a summary in the first two bits. */
|
||||
- reloc_result->enterexit
|
||||
- &= flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT);
|
||||
- reloc_result->enterexit
|
||||
- |= ((flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT))
|
||||
- << ((cnt + 1) * 2));
|
||||
- }
|
||||
- else
|
||||
- /* If the bind flags say this auditor is not interested,
|
||||
- set the bits manually. */
|
||||
- reloc_result->enterexit
|
||||
- |= ((LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT)
|
||||
- << ((cnt + 1) * 2));
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
-
|
||||
- reloc_result->flags = flags;
|
||||
- value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
- }
|
||||
- else
|
||||
- /* Set all bits since this symbol binding is not interesting. */
|
||||
- reloc_result->enterexit = (1u << DL_NNS) - 1;
|
||||
- }
|
||||
+ _dl_audit_symbind (l, reloc_result, defsym, &value, result);
|
||||
#endif
|
||||
|
||||
/* Store the result for later runs. */
|
||||
diff --git a/elf/dl-sym-post.h b/elf/dl-sym-post.h
|
||||
index 4c4f574633497789..f33934c92047f293 100644
|
||||
--- a/elf/dl-sym-post.h
|
||||
+++ b/elf/dl-sym-post.h
|
||||
@@ -52,54 +52,9 @@ _dl_sym_post (lookup_t result, const ElfW(Sym) *ref, void *value,
|
||||
tell us whether further auditing is wanted. */
|
||||
if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
{
|
||||
- const char *strtab = (const char *) D_PTR (result,
|
||||
- l_info[DT_STRTAB]);
|
||||
- /* Compute index of the symbol entry in the symbol table of
|
||||
- the DSO with the definition. */
|
||||
- unsigned int ndx = (ref - (ElfW(Sym) *) D_PTR (result,
|
||||
- l_info[DT_SYMTAB]));
|
||||
-
|
||||
if (match == NULL)
|
||||
match = _dl_sym_find_caller_link_map (caller);
|
||||
-
|
||||
- if ((match->l_audit_any_plt | result->l_audit_any_plt) != 0)
|
||||
- {
|
||||
- unsigned int altvalue = 0;
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- /* Synthesize a symbol record where the st_value field is
|
||||
- the result. */
|
||||
- ElfW(Sym) sym = *ref;
|
||||
- sym.st_value = (ElfW(Addr)) value;
|
||||
-
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- struct auditstate *match_audit
|
||||
- = link_map_audit_state (match, cnt);
|
||||
- struct auditstate *result_audit
|
||||
- = link_map_audit_state (result, cnt);
|
||||
- if (afct->symbind != NULL
|
||||
- && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0
|
||||
- || ((result_audit->bindflags & LA_FLG_BINDTO)
|
||||
- != 0)))
|
||||
- {
|
||||
- unsigned int flags = altvalue | LA_SYMB_DLSYM;
|
||||
- uintptr_t new_value
|
||||
- = afct->symbind (&sym, ndx,
|
||||
- &match_audit->cookie,
|
||||
- &result_audit->cookie,
|
||||
- &flags, strtab + ref->st_name);
|
||||
- if (new_value != (uintptr_t) sym.st_value)
|
||||
- {
|
||||
- altvalue = LA_SYMB_ALTVALUE;
|
||||
- sym.st_value = new_value;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
-
|
||||
- value = (void *) sym.st_value;
|
||||
- }
|
||||
+ _dl_audit_symbind_alt (match, ref, &value, result);
|
||||
}
|
||||
#endif
|
||||
return value;
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 3db25c5be1acf871..fa55c3bde10de52e 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1294,6 +1294,16 @@ void _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
/* Call the la_objclose from the audit modules for the link_map L. */
|
||||
void _dl_audit_objclose (struct link_map *l)
|
||||
attribute_hidden;
|
||||
+
|
||||
+/* Call the la_symbind{32,64} from the audit modules for the link_map L. */
|
||||
+void _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
+ const ElfW(Sym) *defsym, DL_FIXUP_VALUE_TYPE *value,
|
||||
+ lookup_t result)
|
||||
+ attribute_hidden;
|
||||
+/* Same as _dl_audit_symbind, but also sets LA_SYMB_DLSYM flag. */
|
||||
+void _dl_audit_symbind_alt (struct link_map *l, const ElfW(Sym) *ref,
|
||||
+ void **value, lookup_t result);
|
||||
+rtld_hidden_proto (_dl_audit_symbind_alt)
|
||||
#endif /* SHARED */
|
||||
|
||||
__END_DECLS
|
70
SOURCES/glibc-rh2047981-2.patch
Normal file
70
SOURCES/glibc-rh2047981-2.patch
Normal file
@ -0,0 +1,70 @@
|
||||
commit acdcca72940e060270e4e54d9c0457398110f409
|
||||
Author: John David Anglin <danglin@gcc.gnu.org>
|
||||
Date: Mon Mar 30 21:58:06 2020 +0000
|
||||
|
||||
Add new file missed in previous hppa commit.
|
||||
|
||||
diff --git a/sysdeps/hppa/dl-runtime.c b/sysdeps/hppa/dl-runtime.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..885a3f1837cbc56d
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/hppa/dl-runtime.c
|
||||
@@ -0,0 +1,58 @@
|
||||
+/* On-demand PLT fixup for shared objects. HPPA version.
|
||||
+ Copyright (C) 2019 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, write to the Free
|
||||
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
+ 02111-1307 USA. */
|
||||
+
|
||||
+/* Clear PA_GP_RELOC bit in relocation offset. */
|
||||
+#define reloc_offset (reloc_arg & ~PA_GP_RELOC)
|
||||
+#define reloc_index (reloc_arg & ~PA_GP_RELOC) / sizeof (PLTREL)
|
||||
+
|
||||
+#include <elf/dl-runtime.c>
|
||||
+
|
||||
+/* The caller has encountered a partially relocated function descriptor.
|
||||
+ The gp of the descriptor has been updated, but not the ip. We find
|
||||
+ the function descriptor again and compute the relocation offset and
|
||||
+ return that to the caller. The caller will continue on to call
|
||||
+ _dl_fixup with the relocation offset. */
|
||||
+
|
||||
+ElfW(Word)
|
||||
+attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
|
||||
+_dl_fix_reloc_arg (struct fdesc *fptr, struct link_map *l)
|
||||
+{
|
||||
+ Elf32_Addr l_addr, iplt, jmprel, end_jmprel, r_type;
|
||||
+ const Elf32_Rela *reloc;
|
||||
+
|
||||
+ l_addr = l->l_addr;
|
||||
+ jmprel = D_PTR(l, l_info[DT_JMPREL]);
|
||||
+ end_jmprel = jmprel + l->l_info[DT_PLTRELSZ]->d_un.d_val;
|
||||
+
|
||||
+ /* Look for the entry... */
|
||||
+ for (iplt = jmprel; iplt < end_jmprel; iplt += sizeof (Elf32_Rela))
|
||||
+ {
|
||||
+ reloc = (const Elf32_Rela *) iplt;
|
||||
+ r_type = ELF32_R_TYPE (reloc->r_info);
|
||||
+
|
||||
+ if (__builtin_expect (r_type == R_PARISC_IPLT, 1)
|
||||
+ && fptr == (struct fdesc *) (reloc->r_offset + l_addr))
|
||||
+ /* Found entry. Return the reloc offset. */
|
||||
+ return iplt - jmprel;
|
||||
+ }
|
||||
+
|
||||
+ /* Crash if we weren't passed a valid function pointer. */
|
||||
+ ABORT_INSTRUCTION;
|
||||
+ return 0;
|
||||
+}
|
113
SOURCES/glibc-rh2047981-20.patch
Normal file
113
SOURCES/glibc-rh2047981-20.patch
Normal file
@ -0,0 +1,113 @@
|
||||
commit 0b98a8748759e88b58927882a8714109abe0a2d6
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Thu Jul 22 17:10:57 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_preinit
|
||||
|
||||
It consolidates the code required to call la_preinit audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
csu/libc-start.c
|
||||
Rework to existing init call code.
|
||||
|
||||
diff --git a/csu/libc-start.c b/csu/libc-start.c
|
||||
index fd0f8640eaeae34c..ae703cfa620163fd 100644
|
||||
--- a/csu/libc-start.c
|
||||
+++ b/csu/libc-start.c
|
||||
@@ -265,32 +265,20 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
|
||||
#ifdef SHARED
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS, 0))
|
||||
GLRO(dl_debug_printf) ("\ninitialize program: %s\n\n", argv[0]);
|
||||
-#endif
|
||||
+
|
||||
if (init)
|
||||
(*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
|
||||
|
||||
-#ifdef SHARED
|
||||
/* Auditing checkpoint: we have a new object. */
|
||||
- if (__glibc_unlikely (GLRO(dl_naudit) > 0))
|
||||
- {
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- struct link_map *head = GL(dl_ns)[LM_ID_BASE]._ns_loaded;
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->preinit != NULL)
|
||||
- afct->preinit (&link_map_audit_state (head, cnt)->cookie);
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
- }
|
||||
-#endif
|
||||
+ _dl_audit_preinit (GL(dl_ns)[LM_ID_BASE]._ns_loaded);
|
||||
|
||||
-#ifdef SHARED
|
||||
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS))
|
||||
GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]);
|
||||
-#endif
|
||||
|
||||
-#ifndef SHARED
|
||||
+#else /* !SHARED */
|
||||
+ if (init)
|
||||
+ (*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
|
||||
+
|
||||
_dl_debug_initialize (0, LM_ID_BASE);
|
||||
#endif
|
||||
#ifdef HAVE_CLEANUP_JMP_BUF
|
||||
diff --git a/elf/Versions b/elf/Versions
|
||||
index c5d4342cf1f5124c..35ac181bdb099af8 100644
|
||||
--- a/elf/Versions
|
||||
+++ b/elf/Versions
|
||||
@@ -59,7 +59,7 @@ ld {
|
||||
_dl_argv; _dl_find_dso_for_object; _dl_get_tls_static_info;
|
||||
_dl_deallocate_tls; _dl_make_stack_executable;
|
||||
_dl_rtld_di_serinfo; _dl_starting_up; _dl_fatal_printf;
|
||||
- _dl_audit_symbind_alt;
|
||||
+ _dl_audit_symbind_alt; _dl_audit_preinit;
|
||||
_rtld_global; _rtld_global_ro;
|
||||
|
||||
# Only here for gdb while a better method is developed.
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index a21530f30bc5524b..0b6fac8e48877c93 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -108,6 +108,21 @@ _dl_audit_objclose (struct link_map *l)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+_dl_audit_preinit (struct link_map *l)
|
||||
+{
|
||||
+ if (__glibc_likely (GLRO(dl_naudit) == 0))
|
||||
+ return;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->preinit != NULL)
|
||||
+ afct->preinit (&link_map_audit_state (l, cnt)->cookie);
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void
|
||||
_dl_audit_symbind_alt (struct link_map *l, const ElfW(Sym) *ref, void **value,
|
||||
lookup_t result)
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index fa55c3bde10de52e..03676b474c3d37a3 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1295,6 +1295,9 @@ void _dl_audit_objopen (struct link_map *l, Lmid_t nsid)
|
||||
void _dl_audit_objclose (struct link_map *l)
|
||||
attribute_hidden;
|
||||
|
||||
+/* Call the la_preinit from the audit modules for the link_map L. */
|
||||
+void _dl_audit_preinit (struct link_map *l);
|
||||
+
|
||||
/* Call the la_symbind{32,64} from the audit modules for the link_map L. */
|
||||
void _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
const ElfW(Sym) *defsym, DL_FIXUP_VALUE_TYPE *value,
|
205
SOURCES/glibc-rh2047981-21.patch
Normal file
205
SOURCES/glibc-rh2047981-21.patch
Normal file
@ -0,0 +1,205 @@
|
||||
commit eff687e8462b0eaf65992a6031b54a4b1cd16796
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Thu Jul 22 17:45:33 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_pltenter
|
||||
|
||||
It consolidates the code required to call la_pltenter audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 0b6fac8e48877c93..15250c67e8ac1658 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -17,7 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <assert.h>
|
||||
+#include <link.h>
|
||||
#include <ldsodefs.h>
|
||||
+#include <dl-machine.h>
|
||||
|
||||
void
|
||||
_dl_audit_activity_map (struct link_map *l, int action)
|
||||
@@ -243,3 +245,78 @@ _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
reloc_result->flags = flags;
|
||||
*value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
}
|
||||
+
|
||||
+void
|
||||
+_dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
|
||||
+ DL_FIXUP_VALUE_TYPE *value, void *regs, long int *framesize)
|
||||
+{
|
||||
+ /* Don't do anything if no auditor wants to intercept this call. */
|
||||
+ if (GLRO(dl_naudit) == 0
|
||||
+ || (reloc_result->enterexit & LA_SYMB_NOPLTENTER))
|
||||
+ return;
|
||||
+
|
||||
+ /* Sanity check: DL_FIXUP_VALUE_CODE_ADDR (value) should have been
|
||||
+ initialized earlier in this function or in another thread. */
|
||||
+ assert (DL_FIXUP_VALUE_CODE_ADDR (*value) != 0);
|
||||
+ ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
|
||||
+ l_info[DT_SYMTAB])
|
||||
+ + reloc_result->boundndx);
|
||||
+
|
||||
+ /* Set up the sym parameter. */
|
||||
+ ElfW(Sym) sym = *defsym;
|
||||
+ sym.st_value = DL_FIXUP_VALUE_ADDR (*value);
|
||||
+
|
||||
+ /* Get the symbol name. */
|
||||
+ const char *strtab = (const void *) D_PTR (reloc_result->bound,
|
||||
+ l_info[DT_STRTAB]);
|
||||
+ const char *symname = strtab + sym.st_name;
|
||||
+
|
||||
+ /* Keep track of overwritten addresses. */
|
||||
+ unsigned int flags = reloc_result->flags;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->ARCH_LA_PLTENTER != NULL
|
||||
+ && (reloc_result->enterexit
|
||||
+ & (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
|
||||
+ {
|
||||
+ long int new_framesize = -1;
|
||||
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
+ struct auditstate *bound_state
|
||||
+ = link_map_audit_state (reloc_result->bound, cnt);
|
||||
+ uintptr_t new_value
|
||||
+ = afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
|
||||
+ &l_state->cookie, &bound_state->cookie,
|
||||
+ regs, &flags, symname, &new_framesize);
|
||||
+ if (new_value != (uintptr_t) sym.st_value)
|
||||
+ {
|
||||
+ flags |= LA_SYMB_ALTVALUE;
|
||||
+ sym.st_value = new_value;
|
||||
+ }
|
||||
+
|
||||
+ /* Remember the results for every audit library and store a summary
|
||||
+ in the first two bits. */
|
||||
+ reloc_result->enterexit |= ((flags & (LA_SYMB_NOPLTENTER
|
||||
+ | LA_SYMB_NOPLTEXIT))
|
||||
+ << (2 * (cnt + 1)));
|
||||
+
|
||||
+ if ((reloc_result->enterexit & (LA_SYMB_NOPLTEXIT
|
||||
+ << (2 * (cnt + 1))))
|
||||
+ == 0 && new_framesize != -1 && *framesize != -2)
|
||||
+ {
|
||||
+ /* If this is the first call providing information, use it. */
|
||||
+ if (*framesize == -1)
|
||||
+ *framesize = new_framesize;
|
||||
+ /* If two pltenter calls provide conflicting information, use
|
||||
+ the larger value. */
|
||||
+ else if (new_framesize != *framesize)
|
||||
+ *framesize = MAX (new_framesize, *framesize);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+
|
||||
+ *value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
+}
|
||||
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
|
||||
index d4840a7c17441126..b46f7d7376e65361 100644
|
||||
--- a/elf/dl-runtime.c
|
||||
+++ b/elf/dl-runtime.c
|
||||
@@ -319,78 +319,7 @@ _dl_profile_fixup (
|
||||
#ifdef SHARED
|
||||
/* Auditing checkpoint: report the PLT entering and allow the
|
||||
auditors to change the value. */
|
||||
- if (GLRO(dl_naudit) > 0
|
||||
- /* Don't do anything if no auditor wants to intercept this call. */
|
||||
- && (reloc_result->enterexit & LA_SYMB_NOPLTENTER) == 0)
|
||||
- {
|
||||
- /* Sanity check: DL_FIXUP_VALUE_CODE_ADDR (value) should have been
|
||||
- initialized earlier in this function or in another thread. */
|
||||
- assert (DL_FIXUP_VALUE_CODE_ADDR (value) != 0);
|
||||
- ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
|
||||
- l_info[DT_SYMTAB])
|
||||
- + reloc_result->boundndx);
|
||||
-
|
||||
- /* Set up the sym parameter. */
|
||||
- ElfW(Sym) sym = *defsym;
|
||||
- sym.st_value = DL_FIXUP_VALUE_ADDR (value);
|
||||
-
|
||||
- /* Get the symbol name. */
|
||||
- const char *strtab = (const void *) D_PTR (reloc_result->bound,
|
||||
- l_info[DT_STRTAB]);
|
||||
- const char *symname = strtab + sym.st_name;
|
||||
-
|
||||
- /* Keep track of overwritten addresses. */
|
||||
- unsigned int flags = reloc_result->flags;
|
||||
-
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->ARCH_LA_PLTENTER != NULL
|
||||
- && (reloc_result->enterexit
|
||||
- & (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0)
|
||||
- {
|
||||
- long int new_framesize = -1;
|
||||
- struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
- struct auditstate *bound_state
|
||||
- = link_map_audit_state (reloc_result->bound, cnt);
|
||||
- uintptr_t new_value
|
||||
- = afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx,
|
||||
- &l_state->cookie,
|
||||
- &bound_state->cookie,
|
||||
- regs, &flags, symname,
|
||||
- &new_framesize);
|
||||
- if (new_value != (uintptr_t) sym.st_value)
|
||||
- {
|
||||
- flags |= LA_SYMB_ALTVALUE;
|
||||
- sym.st_value = new_value;
|
||||
- }
|
||||
-
|
||||
- /* Remember the results for every audit library and
|
||||
- store a summary in the first two bits. */
|
||||
- reloc_result->enterexit
|
||||
- |= ((flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT))
|
||||
- << (2 * (cnt + 1)));
|
||||
-
|
||||
- if ((reloc_result->enterexit & (LA_SYMB_NOPLTEXIT
|
||||
- << (2 * (cnt + 1))))
|
||||
- == 0 && new_framesize != -1 && framesize != -2)
|
||||
- {
|
||||
- /* If this is the first call providing information,
|
||||
- use it. */
|
||||
- if (framesize == -1)
|
||||
- framesize = new_framesize;
|
||||
- /* If two pltenter calls provide conflicting information,
|
||||
- use the larger value. */
|
||||
- else if (new_framesize != framesize)
|
||||
- framesize = MAX (new_framesize, framesize);
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
-
|
||||
- value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
- }
|
||||
+ _dl_audit_pltenter (l, reloc_result, &value, regs, &framesize);
|
||||
#endif
|
||||
|
||||
/* Store the frame size information. */
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 03676b474c3d37a3..47a9dee5b1c0ca63 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1307,6 +1307,10 @@ void _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
void _dl_audit_symbind_alt (struct link_map *l, const ElfW(Sym) *ref,
|
||||
void **value, lookup_t result);
|
||||
rtld_hidden_proto (_dl_audit_symbind_alt)
|
||||
+void _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
|
||||
+ DL_FIXUP_VALUE_TYPE *value, void *regs,
|
||||
+ long int *framesize)
|
||||
+ attribute_hidden;
|
||||
#endif /* SHARED */
|
||||
|
||||
__END_DECLS
|
795
SOURCES/glibc-rh2047981-22.patch
Normal file
795
SOURCES/glibc-rh2047981-22.patch
Normal file
@ -0,0 +1,795 @@
|
||||
commit 8c0664e2b861fd3789602cc0b0b1922b0e20cb3a
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Thu Jul 22 18:02:42 2021 -0300
|
||||
|
||||
elf: Add _dl_audit_pltexit
|
||||
|
||||
It consolidates the code required to call la_pltexit audit
|
||||
callback.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
nptl/tst-atfork4mod.c
|
||||
sysdeps/powerpc/fpu/s_fmaf.S
|
||||
sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c
|
||||
sysdeps/powerpc/powerpc64/power5+/fpu/s_floor.S
|
||||
Without d6d89608ac8cf2b37c75debad1fff653f6939f90 we
|
||||
don't have dl-machine-rel.h so git picks a match for
|
||||
all four files above, instead we modify dl-machine.h
|
||||
for the targets:
|
||||
sysdeps/i386/dl-machine.h
|
||||
sysdeps/arm/dl-machine.h
|
||||
sysdeps/mips/dl-machine.h
|
||||
The fourth is the generic file and without it we
|
||||
add the PLTREL macro to each target:
|
||||
sysdeps/aarch64/dl-machine.h
|
||||
sysdeps/powerpc/powerpc32/dl-machine.h
|
||||
sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
sysdeps/s390/s390-32/dl-machine.h
|
||||
sysdeps/s390/s390-64/dl-machine.h
|
||||
sysdeps/x86_64/dl-machine.h
|
||||
sysdeps/s390/s390-32/dl-trampoline.h
|
||||
sysdeps/s390/s390-64/dl-trampoline.h
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 15250c67e8ac1658..152712b12fed6de2 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -20,6 +20,8 @@
|
||||
#include <link.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <dl-machine.h>
|
||||
+#include <dl-runtime.h>
|
||||
+#include <dl-fixup-attribute.h>
|
||||
|
||||
void
|
||||
_dl_audit_activity_map (struct link_map *l, int action)
|
||||
@@ -320,3 +322,48 @@ _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
|
||||
|
||||
*value = DL_FIXUP_ADDR_VALUE (sym.st_value);
|
||||
}
|
||||
+
|
||||
+void
|
||||
+DL_ARCH_FIXUP_ATTRIBUTE
|
||||
+_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
|
||||
+ const void *inregs, void *outregs)
|
||||
+{
|
||||
+ const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
+
|
||||
+ /* This is the address in the array where we store the result of previous
|
||||
+ relocations. */
|
||||
+ // XXX Maybe the bound information must be stored on the stack since
|
||||
+ // XXX with bind_not a new value could have been stored in the meantime.
|
||||
+ struct reloc_result *reloc_result =
|
||||
+ &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
|
||||
+ ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
|
||||
+ l_info[DT_SYMTAB])
|
||||
+ + reloc_result->boundndx);
|
||||
+
|
||||
+ /* Set up the sym parameter. */
|
||||
+ ElfW(Sym) sym = *defsym;
|
||||
+ sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
|
||||
+
|
||||
+ /* Get the symbol name. */
|
||||
+ const char *strtab = (const void *) D_PTR (reloc_result->bound,
|
||||
+ l_info[DT_STRTAB]);
|
||||
+ const char *symname = strtab + sym.st_name;
|
||||
+
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ if (afct->ARCH_LA_PLTEXIT != NULL
|
||||
+ && (reloc_result->enterexit
|
||||
+ & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
|
||||
+ {
|
||||
+ struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
+ struct auditstate *bound_state
|
||||
+ = link_map_audit_state (reloc_result->bound, cnt);
|
||||
+ afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
|
||||
+ &l_state->cookie, &bound_state->cookie,
|
||||
+ inregs, outregs, symname);
|
||||
+ }
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
|
||||
index b46f7d7376e65361..ec0b2164825fa538 100644
|
||||
--- a/elf/dl-runtime.c
|
||||
+++ b/elf/dl-runtime.c
|
||||
@@ -16,8 +16,6 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
-#define IN_DL_RUNTIME 1 /* This can be tested in dl-machine.h. */
|
||||
-
|
||||
#include <alloca.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
@@ -30,19 +28,6 @@
|
||||
#include <dl-runtime.h>
|
||||
|
||||
|
||||
-#if (!ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
|
||||
- || ELF_MACHINE_NO_REL
|
||||
-# define PLTREL ElfW(Rela)
|
||||
-#else
|
||||
-# define PLTREL ElfW(Rel)
|
||||
-#endif
|
||||
-
|
||||
-/* The fixup functions might have need special attributes. If none
|
||||
- are provided define the macro as empty. */
|
||||
-#ifndef ARCH_FIXUP_ATTRIBUTE
|
||||
-# define ARCH_FIXUP_ATTRIBUTE
|
||||
-#endif
|
||||
-
|
||||
/* This function is called through a special trampoline from the PLT the
|
||||
first time each PLT entry is called. We must perform the relocation
|
||||
specified in the PLT of the given shared object, and return the resolved
|
||||
@@ -51,7 +36,7 @@
|
||||
function. */
|
||||
|
||||
DL_FIXUP_VALUE_TYPE
|
||||
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
|
||||
+attribute_hidden __attribute ((noinline)) DL_ARCH_FIXUP_ATTRIBUTE
|
||||
_dl_fixup (
|
||||
# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
|
||||
ELF_MACHINE_RUNTIME_FIXUP_ARGS,
|
||||
@@ -147,7 +132,8 @@ _dl_fixup (
|
||||
|
||||
#ifndef PROF
|
||||
DL_FIXUP_VALUE_TYPE
|
||||
-__attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
|
||||
+__attribute ((noinline))
|
||||
+DL_ARCH_FIXUP_ATTRIBUTE
|
||||
_dl_profile_fixup (
|
||||
#ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS
|
||||
ELF_MACHINE_RUNTIME_FIXUP_ARGS,
|
||||
@@ -331,52 +317,3 @@ _dl_profile_fixup (
|
||||
}
|
||||
|
||||
#endif /* PROF */
|
||||
-
|
||||
-
|
||||
-#include <stdio.h>
|
||||
-void
|
||||
-ARCH_FIXUP_ATTRIBUTE
|
||||
-_dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
|
||||
- const void *inregs, void *outregs)
|
||||
-{
|
||||
-#ifdef SHARED
|
||||
- const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
-
|
||||
- /* This is the address in the array where we store the result of previous
|
||||
- relocations. */
|
||||
- // XXX Maybe the bound information must be stored on the stack since
|
||||
- // XXX with bind_not a new value could have been stored in the meantime.
|
||||
- struct reloc_result *reloc_result =
|
||||
- &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
|
||||
- ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
|
||||
- l_info[DT_SYMTAB])
|
||||
- + reloc_result->boundndx);
|
||||
-
|
||||
- /* Set up the sym parameter. */
|
||||
- ElfW(Sym) sym = *defsym;
|
||||
- sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr);
|
||||
-
|
||||
- /* Get the symbol name. */
|
||||
- const char *strtab = (const void *) D_PTR (reloc_result->bound,
|
||||
- l_info[DT_STRTAB]);
|
||||
- const char *symname = strtab + sym.st_name;
|
||||
-
|
||||
- struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
- for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
- {
|
||||
- if (afct->ARCH_LA_PLTEXIT != NULL
|
||||
- && (reloc_result->enterexit
|
||||
- & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0)
|
||||
- {
|
||||
- struct auditstate *l_state = link_map_audit_state (l, cnt);
|
||||
- struct auditstate *bound_state
|
||||
- = link_map_audit_state (reloc_result->bound, cnt);
|
||||
- afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx,
|
||||
- &l_state->cookie, &bound_state->cookie,
|
||||
- inregs, outregs, symname);
|
||||
- }
|
||||
-
|
||||
- afct = afct->next;
|
||||
- }
|
||||
-#endif
|
||||
-}
|
||||
diff --git a/elf/dl-support.c b/elf/dl-support.c
|
||||
index 3e5531138eaa18f8..e9943e889ef447ad 100644
|
||||
--- a/elf/dl-support.c
|
||||
+++ b/elf/dl-support.c
|
||||
@@ -399,3 +399,11 @@ _dl_get_dl_main_map (void)
|
||||
return &_dl_main_map;
|
||||
}
|
||||
#endif
|
||||
+
|
||||
+/* This is used by _dl_runtime_profile, not used on static code. */
|
||||
+void
|
||||
+DL_ARCH_FIXUP_ATTRIBUTE
|
||||
+_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
|
||||
+ const void *inregs, void *outregs)
|
||||
+{
|
||||
+}
|
||||
diff --git a/sysdeps/aarch64/dl-machine.h b/sysdeps/aarch64/dl-machine.h
|
||||
index 5eab544afe2717f7..c13d896a57811c7d 100644
|
||||
--- a/sysdeps/aarch64/dl-machine.h
|
||||
+++ b/sysdeps/aarch64/dl-machine.h
|
||||
@@ -196,6 +196,7 @@ _dl_start_user: \n\
|
||||
/* AArch64 uses RELA not REL */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
|
||||
diff --git a/sysdeps/aarch64/dl-trampoline.S b/sysdeps/aarch64/dl-trampoline.S
|
||||
index a86d0722d4a0415b..18740398e63fdf97 100644
|
||||
--- a/sysdeps/aarch64/dl-trampoline.S
|
||||
+++ b/sysdeps/aarch64/dl-trampoline.S
|
||||
@@ -277,7 +277,7 @@ _dl_runtime_profile:
|
||||
ldp x0, x1, [x29, #OFFSET_SAVED_CALL_X0]
|
||||
add x2, x29, #OFFSET_RG
|
||||
add x3, x29, #OFFSET_RV
|
||||
- bl _dl_call_pltexit
|
||||
+ bl _dl_audit_pltexit
|
||||
|
||||
ldp x0, x1, [x29, #OFFSET_RV + DL_OFFSET_RV_X0]
|
||||
ldp d0, d1, [x29, #OFFSET_RV + DL_OFFSET_RV_D0 + 16*0]
|
||||
diff --git a/sysdeps/alpha/dl-trampoline.S b/sysdeps/alpha/dl-trampoline.S
|
||||
index b326b37acedb5eaa..3acf5dec8d9585da 100644
|
||||
--- a/sysdeps/alpha/dl-trampoline.S
|
||||
+++ b/sysdeps/alpha/dl-trampoline.S
|
||||
@@ -187,7 +187,7 @@ _dl_runtime_profile_new:
|
||||
jsr $26, ($27), 0
|
||||
ldgp $29, 0($26)
|
||||
|
||||
- /* Set up for call to _dl_call_pltexit. */
|
||||
+ /* Set up for call to _dl_audit_pltexit. */
|
||||
ldq $16, 16*8($15)
|
||||
ldq $17, 17*8($15)
|
||||
stq $0, 16*8($15)
|
||||
@@ -196,7 +196,7 @@ _dl_runtime_profile_new:
|
||||
lda $19, 16*8($15)
|
||||
stt $f0, 18*8($15)
|
||||
stt $f1, 19*8($15)
|
||||
- bsr $26, _dl_call_pltexit !samegp
|
||||
+ bsr $26, _dl_audit_pltexit !samegp
|
||||
|
||||
mov $15, $30
|
||||
cfi_def_cfa_register (30)
|
||||
@@ -518,7 +518,7 @@ _dl_runtime_profile_old:
|
||||
jsr $26, ($27), 0
|
||||
ldgp $29, 0($26)
|
||||
|
||||
- /* Set up for call to _dl_call_pltexit. */
|
||||
+ /* Set up for call to _dl_audit_pltexit. */
|
||||
ldq $16, 48*8($15)
|
||||
ldq $17, 49*8($15)
|
||||
stq $0, 46*8($15)
|
||||
@@ -527,7 +527,7 @@ _dl_runtime_profile_old:
|
||||
lda $19, 46*8($15)
|
||||
stt $f0, 48*8($15)
|
||||
stt $f1, 49*8($15)
|
||||
- bsr $26, _dl_call_pltexit !samegp
|
||||
+ bsr $26, _dl_audit_pltexit !samegp
|
||||
|
||||
mov $15, $30
|
||||
cfi_def_cfa_register (30)
|
||||
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
|
||||
index 1a4fd3f17b6df7da..9b5d0567df984c5d 100644
|
||||
--- a/sysdeps/arm/dl-machine.h
|
||||
+++ b/sysdeps/arm/dl-machine.h
|
||||
@@ -260,6 +260,8 @@ _dl_start_user:\n\
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_PLT_REL 1
|
||||
|
||||
+#define PLTREL ElfW(Rel)
|
||||
+
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
diff --git a/sysdeps/arm/dl-trampoline.S b/sysdeps/arm/dl-trampoline.S
|
||||
index c731b012869a9cbc..ced1b1cb1017d677 100644
|
||||
--- a/sysdeps/arm/dl-trampoline.S
|
||||
+++ b/sysdeps/arm/dl-trampoline.S
|
||||
@@ -194,7 +194,7 @@ _dl_runtime_profile:
|
||||
ldmia ip, {r0,r1}
|
||||
add r2, r7, #72
|
||||
add r3, r7, #0
|
||||
- bl _dl_call_pltexit
|
||||
+ bl _dl_audit_pltexit
|
||||
|
||||
@ Return to caller.
|
||||
ldmia r7, {r0-r3}
|
||||
diff --git a/sysdeps/generic/dl-fixup-attribute.h b/sysdeps/generic/dl-fixup-attribute.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..aa92169b709b3fea
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/generic/dl-fixup-attribute.h
|
||||
@@ -0,0 +1,24 @@
|
||||
+/* ABI specifics for lazy resolution functions.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DL_FIXUP_ATTRIBUTE_H
|
||||
+#define _DL_FIXUP_ATTRIBUTE_H
|
||||
+
|
||||
+#define DL_ARCH_FIXUP_ATTRIBUTE
|
||||
+
|
||||
+#endif
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 47a9dee5b1c0ca63..29b77b35175c1116 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <link.h>
|
||||
#include <dl-lookupcfg.h>
|
||||
#include <dl-sysdep.h>
|
||||
+#include <dl-fixup-attribute.h>
|
||||
#include <libc-lock.h>
|
||||
#include <hp-timing.h>
|
||||
#include <tls.h>
|
||||
@@ -1311,6 +1312,11 @@ void _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result,
|
||||
DL_FIXUP_VALUE_TYPE *value, void *regs,
|
||||
long int *framesize)
|
||||
attribute_hidden;
|
||||
+void DL_ARCH_FIXUP_ATTRIBUTE _dl_audit_pltexit (struct link_map *l,
|
||||
+ ElfW(Word) reloc_arg,
|
||||
+ const void *inregs,
|
||||
+ void *outregs)
|
||||
+ attribute_hidden;
|
||||
#endif /* SHARED */
|
||||
|
||||
__END_DECLS
|
||||
diff --git a/sysdeps/hppa/dl-runtime.c b/sysdeps/hppa/dl-runtime.c
|
||||
index 2d061b150f0602c1..4c323131f937094b 100644
|
||||
--- a/sysdeps/hppa/dl-runtime.c
|
||||
+++ b/sysdeps/hppa/dl-runtime.c
|
||||
@@ -26,7 +26,7 @@
|
||||
_dl_fixup with the relocation offset. */
|
||||
|
||||
ElfW(Word)
|
||||
-attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE
|
||||
+attribute_hidden __attribute ((noinline)) DL_ARCH_FIXUP_ATTRIBUTE
|
||||
_dl_fix_reloc_arg (struct fdesc *fptr, struct link_map *l)
|
||||
{
|
||||
Elf32_Addr l_addr, iplt, jmprel, end_jmprel, r_type;
|
||||
diff --git a/sysdeps/hppa/dl-trampoline.S b/sysdeps/hppa/dl-trampoline.S
|
||||
index 7ee4331cc2e7deff..3c83c8542f4fc63f 100644
|
||||
--- a/sysdeps/hppa/dl-trampoline.S
|
||||
+++ b/sysdeps/hppa/dl-trampoline.S
|
||||
@@ -275,7 +275,7 @@ L(cont):
|
||||
ldw -4(%sp),%r1
|
||||
copy %r1, %sp
|
||||
|
||||
- /* Arguments to _dl_call_pltexit */
|
||||
+ /* Arguments to _dl_audit_pltexit */
|
||||
ldw -116(%sp), %r26 /* (1) got[1] == struct link_map */
|
||||
ldw -120(%sp), %r25 /* (2) reloc offsets */
|
||||
ldo -56(%sp), %r24 /* (3) *La_hppa_regs */
|
||||
@@ -287,8 +287,8 @@ L(cont):
|
||||
ldo -128(%sp), %r1
|
||||
fstd %fr4,0(%r1)
|
||||
|
||||
- /* Call _dl_call_pltexit */
|
||||
- bl _dl_call_pltexit,%rp
|
||||
+ /* Call _dl_audit_pltexit */
|
||||
+ bl _dl_audit_pltexit,%rp
|
||||
nop
|
||||
|
||||
/* Restore *La_hppa_retval */
|
||||
diff --git a/sysdeps/i386/dl-fixup-attribute.h b/sysdeps/i386/dl-fixup-attribute.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..c10e9936f4db7254
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/i386/dl-fixup-attribute.h
|
||||
@@ -0,0 +1,30 @@
|
||||
+/* ABI specifics for lazy resolution functions. i386 version.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DL_FIXUP_ATTRIBUTE_H
|
||||
+#define _DL_FIXUP_ATTRIBUTE_H
|
||||
+
|
||||
+/* We cannot use this scheme for profiling because the _mcount call destroys
|
||||
+ the passed register information. */
|
||||
+#ifndef PROF
|
||||
+# define DL_ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), stdcall, unused))
|
||||
+#else
|
||||
+# define DL_ARCH_FIXUP_ATTRIBUTE
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h
|
||||
index 5ba95b9e4af49942..30c3464fc4ac19d8 100644
|
||||
--- a/sysdeps/i386/dl-machine.h
|
||||
+++ b/sysdeps/i386/dl-machine.h
|
||||
@@ -119,29 +119,6 @@ elf_machine_runtime_setup (struct link_map *l, struct r_scope_elem *scope[],
|
||||
return lazy;
|
||||
}
|
||||
|
||||
-#ifdef IN_DL_RUNTIME
|
||||
-
|
||||
-# ifndef PROF
|
||||
-/* We add a declaration of this function here so that in dl-runtime.c
|
||||
- the ELF_MACHINE_RUNTIME_TRAMPOLINE macro really can pass the parameters
|
||||
- in registers.
|
||||
-
|
||||
- We cannot use this scheme for profiling because the _mcount call
|
||||
- destroys the passed register information. */
|
||||
-#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), stdcall, unused))
|
||||
-
|
||||
-extern ElfW(Addr) _dl_fixup (struct link_map *l,
|
||||
- ElfW(Word) reloc_offset)
|
||||
- ARCH_FIXUP_ATTRIBUTE;
|
||||
-extern ElfW(Addr) _dl_profile_fixup (struct link_map *l,
|
||||
- ElfW(Word) reloc_offset,
|
||||
- ElfW(Addr) retaddr, void *regs,
|
||||
- long int *framesizep)
|
||||
- ARCH_FIXUP_ATTRIBUTE;
|
||||
-# endif
|
||||
-
|
||||
-#endif
|
||||
-
|
||||
/* Mask identifying addresses reserved for the user program,
|
||||
where the dynamic linker should not map anything. */
|
||||
#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL
|
||||
@@ -240,6 +217,8 @@ _dl_start_user:\n\
|
||||
Prelinked libraries may use Elf32_Rela though. */
|
||||
#define ELF_MACHINE_PLT_REL 1
|
||||
|
||||
+#define PLTREL ElfW(Rel)
|
||||
+
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
#define DL_PLATFORM_INIT dl_platform_init ()
|
||||
diff --git a/sysdeps/i386/dl-trampoline.S b/sysdeps/i386/dl-trampoline.S
|
||||
index 6dc03192168ae2f3..a738b291a79bf8c2 100644
|
||||
--- a/sysdeps/i386/dl-trampoline.S
|
||||
+++ b/sysdeps/i386/dl-trampoline.S
|
||||
@@ -265,7 +265,7 @@ _dl_runtime_profile:
|
||||
movl (LRV_SIZE + 4 + LR_SIZE)(%esp), %eax
|
||||
# PLT1
|
||||
movl (LRV_SIZE + 4 + LR_SIZE + 4)(%esp), %edx
|
||||
- call _dl_call_pltexit
|
||||
+ call _dl_audit_pltexit
|
||||
movl LRV_EAX_OFFSET(%esp), %eax
|
||||
movl LRV_EDX_OFFSET(%esp), %edx
|
||||
fldt LRV_ST1_OFFSET(%esp)
|
||||
diff --git a/sysdeps/ia64/dl-trampoline.S b/sysdeps/ia64/dl-trampoline.S
|
||||
index fc24c425bfe6907b..caeca3afcd7db6b6 100644
|
||||
--- a/sysdeps/ia64/dl-trampoline.S
|
||||
+++ b/sysdeps/ia64/dl-trampoline.S
|
||||
@@ -133,7 +133,7 @@ END(_dl_runtime_resolve)
|
||||
|
||||
|
||||
/* The fourth argument to _dl_profile_fixup and the third one to
|
||||
- _dl_call_pltexit are a pointer to La_ia64_regs:
|
||||
+ _dl_audit_pltexit are a pointer to La_ia64_regs:
|
||||
|
||||
8byte r8
|
||||
8byte r9
|
||||
@@ -159,7 +159,7 @@ END(_dl_runtime_resolve)
|
||||
8byte sp
|
||||
|
||||
The fifth argument to _dl_profile_fixup is a pointer to long int.
|
||||
- The fourth argument to _dl_call_pltexit is a pointer to
|
||||
+ The fourth argument to _dl_audit_pltexit is a pointer to
|
||||
La_ia64_retval:
|
||||
|
||||
8byte r8
|
||||
@@ -261,7 +261,7 @@ ENTRY(_dl_runtime_profile)
|
||||
}
|
||||
{ .mii
|
||||
mov r18 = ar.unat /* save it in La_ia64_regs */
|
||||
- mov loc7 = out3 /* save it for _dl_call_pltexit */
|
||||
+ mov loc7 = out3 /* save it for _dl_audit_pltexit */
|
||||
mov loc5 = r11 /* preserve language specific register */
|
||||
}
|
||||
{ .mmi
|
||||
@@ -272,7 +272,7 @@ ENTRY(_dl_runtime_profile)
|
||||
}
|
||||
{ .mii
|
||||
mov ar.unat = r17 /* restore it for function call */
|
||||
- mov loc8 = r16 /* save it for _dl_call_pltexit */
|
||||
+ mov loc8 = r16 /* save it for _dl_audit_pltexit */
|
||||
nop.i 0x0
|
||||
}
|
||||
{ .mmi
|
||||
@@ -291,7 +291,7 @@ ENTRY(_dl_runtime_profile)
|
||||
{ .mmi
|
||||
stf.spill [r2] = f14, 32
|
||||
stf.spill [r3] = f15, 24
|
||||
- mov loc9 = out1 /* save it for _dl_call_pltexit */
|
||||
+ mov loc9 = out1 /* save it for _dl_audit_pltexit */
|
||||
;;
|
||||
}
|
||||
{ .mmb
|
||||
@@ -426,7 +426,7 @@ ENTRY(_dl_runtime_profile)
|
||||
br.call.sptk.many b0 = b6
|
||||
}
|
||||
{ .mii
|
||||
- /* Prepare stack for _dl_call_pltexit. Loc10 has the original
|
||||
+ /* Prepare stack for _dl_audit_pltexit. Loc10 has the original
|
||||
stack pointer. */
|
||||
adds r12 = -PLTEXIT_FRAME_SIZE, loc10
|
||||
adds r2 = -(PLTEXIT_FRAME_SIZE - 16), loc10
|
||||
@@ -461,14 +461,14 @@ ENTRY(_dl_runtime_profile)
|
||||
{ .mmi
|
||||
stf.spill [r2] = f12, 32
|
||||
stf.spill [r3] = f13, 32
|
||||
- /* We need to restore gp for _dl_call_pltexit. */
|
||||
+ /* We need to restore gp for _dl_audit_pltexit. */
|
||||
mov gp = loc11
|
||||
;;
|
||||
}
|
||||
{ .mmb
|
||||
stf.spill [r2] = f14
|
||||
stf.spill [r3] = f15
|
||||
- br.call.sptk.many b0 = _dl_call_pltexit
|
||||
+ br.call.sptk.many b0 = _dl_audit_pltexit
|
||||
}
|
||||
{ .mmi
|
||||
/* Load all the non-floating and floating return values. Skip
|
||||
diff --git a/sysdeps/m68k/dl-trampoline.S b/sysdeps/m68k/dl-trampoline.S
|
||||
index 7e1eace26b4a519d..27282ca8a6b1dada 100644
|
||||
--- a/sysdeps/m68k/dl-trampoline.S
|
||||
+++ b/sysdeps/m68k/dl-trampoline.S
|
||||
@@ -202,7 +202,7 @@ _dl_runtime_profile:
|
||||
cfi_adjust_cfa_offset (4)
|
||||
move.l (32+FPSPACE)(%sp), -(%sp)
|
||||
cfi_adjust_cfa_offset (4)
|
||||
- jbsr _dl_call_pltexit
|
||||
+ jbsr _dl_audit_pltexit
|
||||
lea 16(%sp), %sp
|
||||
cfi_adjust_cfa_offset (-16)
|
||||
move.l (%sp)+, %d0
|
||||
diff --git a/sysdeps/mips/dl-machine.h b/sysdeps/mips/dl-machine.h
|
||||
index b41e10647d81843b..d4bd8b62f4b036a3 100644
|
||||
--- a/sysdeps/mips/dl-machine.h
|
||||
+++ b/sysdeps/mips/dl-machine.h
|
||||
@@ -63,6 +63,7 @@
|
||||
#define ELF_MACHINE_PLT_REL 1
|
||||
#define ELF_MACHINE_NO_REL 0
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rel)
|
||||
|
||||
/* Translate a processor specific dynamic tag to the index
|
||||
in l_info array. */
|
||||
diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h
|
||||
index 31c7f3f95a2ce1b2..84322595793dc8bb 100644
|
||||
--- a/sysdeps/powerpc/powerpc32/dl-machine.h
|
||||
+++ b/sysdeps/powerpc/powerpc32/dl-machine.h
|
||||
@@ -150,6 +150,7 @@ __elf_preferred_address(struct link_map *loader, size_t maplength,
|
||||
/* The PowerPC never uses REL relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
/* We define an initialization function to initialize HWCAP/HWCAP2 and
|
||||
platform data so it can be copied into the TCB later. This is called
|
||||
diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
index 35996bb9173da231..3af1f708378f9a3c 100644
|
||||
--- a/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
+++ b/sysdeps/powerpc/powerpc64/dl-machine.h
|
||||
@@ -297,6 +297,7 @@ BODY_PREFIX "_dl_start_user:\n" \
|
||||
/* The PowerPC never uses REL relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
/* We define an initialization function to initialize HWCAP/HWCAP2 and
|
||||
platform data so it can be copied into the TCB later. This is called
|
||||
diff --git a/sysdeps/powerpc/powerpc64/dl-trampoline.S b/sysdeps/powerpc/powerpc64/dl-trampoline.S
|
||||
index aa141dc44b980d9b..23290d32360507fd 100644
|
||||
--- a/sysdeps/powerpc/powerpc64/dl-trampoline.S
|
||||
+++ b/sysdeps/powerpc/powerpc64/dl-trampoline.S
|
||||
@@ -197,7 +197,7 @@ END(_dl_runtime_resolve)
|
||||
#ifndef PROF
|
||||
ENTRY (_dl_profile_resolve, 4)
|
||||
/* Spill r30, r31 to preserve the link_map* and reloc_addr, in case we
|
||||
- need to call _dl_call_pltexit. */
|
||||
+ need to call _dl_audit_pltexit. */
|
||||
std r31,-8(r1)
|
||||
std r30,-16(r1)
|
||||
/* We need to save the registers used to pass parameters, ie. r3 thru
|
||||
@@ -452,7 +452,7 @@ L(restoreFXR2):
|
||||
L(callpltexit):
|
||||
addi r5,r1,INT_PARMS
|
||||
addi r6,r1,INT_RTN
|
||||
- bl JUMPTARGET(_dl_call_pltexit)
|
||||
+ bl JUMPTARGET(_dl_audit_pltexit)
|
||||
#ifndef SHARED
|
||||
nop
|
||||
#endif
|
||||
diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h
|
||||
index ded41adff80346b6..2f3bb085ae2b6794 100644
|
||||
--- a/sysdeps/s390/s390-32/dl-machine.h
|
||||
+++ b/sysdeps/s390/s390-32/dl-machine.h
|
||||
@@ -279,6 +279,7 @@ _dl_start_user:\n\
|
||||
/* The S390 never uses Elf32_Rel relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h
|
||||
index d36c002743bf2f0c..c447a41f067c462b 100644
|
||||
--- a/sysdeps/s390/s390-32/dl-trampoline.h
|
||||
+++ b/sysdeps/s390/s390-32/dl-trampoline.h
|
||||
@@ -207,7 +207,7 @@ _dl_runtime_profile:
|
||||
basr %r1,0
|
||||
5: l %r14,7f-5b(%r1)
|
||||
la %r5,40(%r12) # pointer to struct La_s390_32_retval
|
||||
- bas %r14,0(%r14,%r1) # call _dl_call_pltexit
|
||||
+ bas %r14,0(%r14,%r1) # call _dl_audit_pltexit
|
||||
|
||||
lr %r15,%r12 # remove stack frame
|
||||
cfi_def_cfa_register (15)
|
||||
@@ -224,7 +224,7 @@ _dl_runtime_profile:
|
||||
br %r14
|
||||
|
||||
6: .long _dl_profile_fixup - 0b
|
||||
-7: .long _dl_call_pltexit - 5b
|
||||
+7: .long _dl_audit_pltexit - 5b
|
||||
cfi_endproc
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile
|
||||
#endif
|
||||
diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h
|
||||
index 36327c40a1972dd7..033e7c9916e751f4 100644
|
||||
--- a/sysdeps/s390/s390-64/dl-machine.h
|
||||
+++ b/sysdeps/s390/s390-64/dl-machine.h
|
||||
@@ -228,6 +228,7 @@ _dl_start_user:\n\
|
||||
/* The 64 bit S/390 never uses Elf64_Rel relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
/* We define an initialization functions. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
diff --git a/sysdeps/s390/s390-64/dl-trampoline.h b/sysdeps/s390/s390-64/dl-trampoline.h
|
||||
index d313fd521db0b859..18534d629ebc00e2 100644
|
||||
--- a/sysdeps/s390/s390-64/dl-trampoline.h
|
||||
+++ b/sysdeps/s390/s390-64/dl-trampoline.h
|
||||
@@ -203,7 +203,7 @@ _dl_runtime_profile:
|
||||
lmg %r2,%r4,48(%r12) # r2, r3: load arguments saved by PLT
|
||||
# r4: pointer to struct La_s390_64_regs
|
||||
la %r5,72(%r12) # pointer to struct La_s390_64_retval
|
||||
- brasl %r14,_dl_call_pltexit
|
||||
+ brasl %r14,_dl_audit_pltexit
|
||||
|
||||
lgr %r15,%r12 # remove stack frame
|
||||
cfi_def_cfa_register (15)
|
||||
diff --git a/sysdeps/sh/dl-trampoline.S b/sysdeps/sh/dl-trampoline.S
|
||||
index 0c8f84d26d3015ca..73f865f2af4e2d48 100644
|
||||
--- a/sysdeps/sh/dl-trampoline.S
|
||||
+++ b/sysdeps/sh/dl-trampoline.S
|
||||
@@ -423,8 +423,8 @@ _dl_runtime_profile:
|
||||
.align 2
|
||||
#ifdef SHARED
|
||||
7: .long _GLOBAL_OFFSET_TABLE_
|
||||
-8: .long _dl_call_pltexit@GOTOFF
|
||||
+8: .long _dl_audit_pltexit@GOTOFF
|
||||
#else
|
||||
-8: .long _dl_call_pltexit
|
||||
+8: .long _dl_audit_pltexit
|
||||
#endif
|
||||
.size _dl_runtime_profile, .-_dl_runtime_profile
|
||||
diff --git a/sysdeps/sparc/sparc32/dl-trampoline.S b/sysdeps/sparc/sparc32/dl-trampoline.S
|
||||
index 098ffcfacc55d0b6..18ef2f0d3655b3de 100644
|
||||
--- a/sysdeps/sparc/sparc32/dl-trampoline.S
|
||||
+++ b/sysdeps/sparc/sparc32/dl-trampoline.S
|
||||
@@ -127,7 +127,7 @@ _dl_profile_invoke:
|
||||
mov %l5, %o0
|
||||
mov %l6, %o1
|
||||
add %sp, (11 * 8), %o2
|
||||
- call _dl_call_pltexit
|
||||
+ call _dl_audit_pltexit
|
||||
add %sp, ( 9 * 8), %o3
|
||||
|
||||
ldd [%sp + ( 9 * 8)], %i0
|
||||
diff --git a/sysdeps/sparc/sparc64/dl-trampoline.S b/sysdeps/sparc/sparc64/dl-trampoline.S
|
||||
index 4948b88b9640691d..9c18ceb131c9a25b 100644
|
||||
--- a/sysdeps/sparc/sparc64/dl-trampoline.S
|
||||
+++ b/sysdeps/sparc/sparc64/dl-trampoline.S
|
||||
@@ -196,7 +196,7 @@ _dl_profile_invoke:
|
||||
mov %l5, %o0
|
||||
mov %l6, %o1
|
||||
add %sp, STACK_BIAS + (24 * 8), %o2
|
||||
- call _dl_call_pltexit
|
||||
+ call _dl_audit_pltexit
|
||||
add %sp, STACK_BIAS + (16 * 8), %o3
|
||||
|
||||
ldx [%sp + STACK_BIAS + (16 * 8)], %i0
|
||||
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
|
||||
index 5262aa69c06aa8db..d30317980882ac51 100644
|
||||
--- a/sysdeps/x86_64/dl-machine.h
|
||||
+++ b/sysdeps/x86_64/dl-machine.h
|
||||
@@ -210,6 +210,7 @@ _dl_start_user:\n\
|
||||
/* The x86-64 never uses Elf64_Rel/Elf32_Rel relocations. */
|
||||
#define ELF_MACHINE_NO_REL 1
|
||||
#define ELF_MACHINE_NO_RELA 0
|
||||
+#define PLTREL ElfW(Rela)
|
||||
|
||||
/* We define an initialization function. This is called very early in
|
||||
_dl_sysdep_start. */
|
||||
diff --git a/sysdeps/x86_64/dl-runtime.h b/sysdeps/x86_64/dl-runtime.h
|
||||
index 3fa61d7a4697cf3f..379f8bd4dea8ef97 100644
|
||||
--- a/sysdeps/x86_64/dl-runtime.h
|
||||
+++ b/sysdeps/x86_64/dl-runtime.h
|
||||
@@ -18,7 +18,7 @@
|
||||
02111-1307 USA. */
|
||||
|
||||
/* The ABI calls for the PLT stubs to pass the index of the relocation
|
||||
- and not its offset. In _dl_profile_fixup and _dl_call_pltexit we
|
||||
+ and not its offset. In _dl_profile_fixup and _dl_audit_pltexit we
|
||||
also use the index. Therefore it is wasteful to compute the offset
|
||||
in the trampoline just to reverse the operation immediately
|
||||
afterwards. */
|
||||
diff --git a/sysdeps/x86_64/dl-trampoline.h b/sysdeps/x86_64/dl-trampoline.h
|
||||
index a28b1e73a4b187ba..256dfbb64df9f03d 100644
|
||||
--- a/sysdeps/x86_64/dl-trampoline.h
|
||||
+++ b/sysdeps/x86_64/dl-trampoline.h
|
||||
@@ -388,7 +388,7 @@ _dl_runtime_profile:
|
||||
jns 3f
|
||||
|
||||
/* There's nothing in the frame size, so there
|
||||
- will be no call to the _dl_call_pltexit. */
|
||||
+ will be no call to the _dl_audit_pltexit. */
|
||||
|
||||
/* Get back registers content. */
|
||||
movq LR_RCX_OFFSET(%rsp), %rcx
|
||||
@@ -436,7 +436,7 @@ _dl_runtime_profile:
|
||||
mov 24(%rbx), %RSP_LP # Drop the copied stack content
|
||||
|
||||
/* Now we have to prepare the La_x86_64_retval structure for the
|
||||
- _dl_call_pltexit. The La_x86_64_regs is being pointed by rsp now,
|
||||
+ _dl_audit_pltexit. The La_x86_64_regs is being pointed by rsp now,
|
||||
so we just need to allocate the sizeof(La_x86_64_retval) space on
|
||||
the stack, since the alignment has already been taken care of. */
|
||||
# ifdef RESTORE_AVX
|
||||
@@ -491,7 +491,7 @@ _dl_runtime_profile:
|
||||
movq 24(%rbx), %rdx # La_x86_64_regs argument to %rdx.
|
||||
movq 40(%rbx), %rsi # Copy args pushed by PLT in register.
|
||||
movq 32(%rbx), %rdi # %rdi: link_map, %rsi: reloc_index
|
||||
- call _dl_call_pltexit
|
||||
+ call _dl_audit_pltexit
|
||||
|
||||
/* Restore return registers. */
|
||||
movq LRV_RAX_OFFSET(%rsp), %rax
|
449
SOURCES/glibc-rh2047981-23.patch
Normal file
449
SOURCES/glibc-rh2047981-23.patch
Normal file
@ -0,0 +1,449 @@
|
||||
Added $(objpfx)tst-audit19a: $(libdl) to elf/Makefile since
|
||||
we still need $(libdl) in RHEL8.
|
||||
|
||||
commit 063f9ba220f434c7f30dd65c4cff17c0c458a7cf
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Jun 30 10:24:09 2021 -0300
|
||||
|
||||
elf: Avoid unnecessary slowdown from profiling with audit (BZ#15533)
|
||||
|
||||
The rtld-audit interfaces introduces a slowdown due to enabling
|
||||
profiling instrumentation (as if LD_AUDIT implied LD_PROFILE).
|
||||
However, instrumenting is only necessary if one of audit libraries
|
||||
provides PLT callbacks (la_pltenter or la_pltexit symbols). Otherwise,
|
||||
the slowdown can be avoided.
|
||||
|
||||
The following patch adjusts the logic that enables profiling to iterate
|
||||
over all audit modules and check if any of those provides a PLT hook.
|
||||
To keep la_symbind to work even without PLT callbacks, _dl_fixup now
|
||||
calls the audit callback if the modules implements it.
|
||||
|
||||
Co-authored-by: Alexander Monakov <amonakov@ispras.ru>
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 08a32a712a34f2cc..0cc03ffe2984ee50 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -221,12 +221,14 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-dlmopen-gethostbyname \
|
||||
tst-audit17 \
|
||||
tst-audit18 \
|
||||
+ tst-audit19b \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
|
||||
tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
|
||||
- tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split
|
||||
+ tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split \
|
||||
+ tst-audit19a
|
||||
tests-container += tst-pldd tst-preload-pthread-libc
|
||||
ifeq ($(build-hardcoded-path-in-tests),yes)
|
||||
tests += tst-dlopen-aout
|
||||
@@ -358,6 +360,9 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
tst-dlmopen-gethostbyname-mod \
|
||||
tst-auditmod18 \
|
||||
tst-audit18mod \
|
||||
+ tst-auditmod19a \
|
||||
+ tst-auditmod19b \
|
||||
+ tst-audit19bmod \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1548,6 +1553,14 @@ $(objpfx)tst-audit18.out: $(objpfx)tst-auditmod18.so \
|
||||
$(objpfx)tst-audit18mod.so
|
||||
tst-audit18-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
+$(objpfx)tst-audit19a: $(libdl)
|
||||
+$(objpfx)tst-audit19a.out: $(objpfx)tst-auditmod19a.so
|
||||
+tst-audit19a-ENV = LD_AUDIT=$(objpfx)tst-auditmod19a.so
|
||||
+
|
||||
+$(objpfx)tst-audit19b.out: $(objpfx)tst-auditmod19b.so
|
||||
+$(objpfx)tst-audit19b: $(objpfx)tst-audit19bmod.so
|
||||
+tst-audit19b-ARGS = -- $(host-test-program-cmd)
|
||||
+
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
-Wl,--version-script=tst-sonamemove-linkmod1.map \
|
||||
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
|
||||
index 19de5de067a5ef07..7a84b1fa8c3a7fdd 100644
|
||||
--- a/elf/dl-reloc.c
|
||||
+++ b/elf/dl-reloc.c
|
||||
@@ -178,12 +178,28 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
int skip_ifunc = reloc_mode & __RTLD_NOIFUNC;
|
||||
|
||||
#ifdef SHARED
|
||||
+ bool consider_symbind = false;
|
||||
/* If we are auditing, install the same handlers we need for profiling. */
|
||||
if ((reloc_mode & __RTLD_AUDIT) == 0)
|
||||
- consider_profiling |= GLRO(dl_audit) != NULL;
|
||||
+ {
|
||||
+ struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
+ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
||||
+ {
|
||||
+ /* Profiling is needed only if PLT hooks are provided. */
|
||||
+ if (afct->ARCH_LA_PLTENTER != NULL
|
||||
+ || afct->ARCH_LA_PLTEXIT != NULL)
|
||||
+ consider_profiling = 1;
|
||||
+ if (afct->symbind != NULL)
|
||||
+ consider_symbind = true;
|
||||
+
|
||||
+ afct = afct->next;
|
||||
+ }
|
||||
+ }
|
||||
#elif defined PROF
|
||||
/* Never use dynamic linker profiling for gprof profiling code. */
|
||||
# define consider_profiling 0
|
||||
+#else
|
||||
+# define consider_symbind 0
|
||||
#endif
|
||||
|
||||
if (l->l_relocated)
|
||||
@@ -278,7 +294,7 @@ _dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[],
|
||||
ELF_DYNAMIC_RELOCATE (l, scope, lazy, consider_profiling, skip_ifunc);
|
||||
|
||||
#ifndef PROF
|
||||
- if (__glibc_unlikely (consider_profiling)
|
||||
+ if ((consider_profiling || consider_symbind)
|
||||
&& l->l_info[DT_PLTRELSZ] != NULL)
|
||||
{
|
||||
/* Allocate the array which will contain the already found
|
||||
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
|
||||
index ec0b2164825fa538..71ec65264ff780fb 100644
|
||||
--- a/elf/dl-runtime.c
|
||||
+++ b/elf/dl-runtime.c
|
||||
@@ -123,6 +123,37 @@ _dl_fixup (
|
||||
&& __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0))
|
||||
value = elf_ifunc_invoke (DL_FIXUP_VALUE_ADDR (value));
|
||||
|
||||
+#ifdef SHARED
|
||||
+ /* Auditing checkpoint: we have a new binding. Provide the auditing
|
||||
+ libraries the possibility to change the value and tell us whether further
|
||||
+ auditing is wanted.
|
||||
+ The l_reloc_result is only allocated if there is an audit module which
|
||||
+ provides a la_symbind. */
|
||||
+ if (l->l_reloc_result != NULL)
|
||||
+ {
|
||||
+ /* This is the address in the array where we store the result of previous
|
||||
+ relocations. */
|
||||
+ struct reloc_result *reloc_result
|
||||
+ = &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
|
||||
+ unsigned int init = atomic_load_acquire (&reloc_result->init);
|
||||
+ if (init == 0)
|
||||
+ {
|
||||
+ _dl_audit_symbind (l, reloc_result, sym, &value, result);
|
||||
+
|
||||
+ /* Store the result for later runs. */
|
||||
+ if (__glibc_likely (! GLRO(dl_bind_not)))
|
||||
+ {
|
||||
+ reloc_result->addr = value;
|
||||
+ /* Guarantee all previous writes complete before init is
|
||||
+ updated. See CONCURRENCY NOTES below. */
|
||||
+ atomic_store_release (&reloc_result->init, 1);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ value = reloc_result->addr;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Finally, fix up the plt itself. */
|
||||
if (__glibc_unlikely (GLRO(dl_bind_not)))
|
||||
return value;
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 767acd122262b824..2994578ba3a5f911 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1027,13 +1027,7 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
|
||||
"la_objsearch\0"
|
||||
"la_objopen\0"
|
||||
"la_preinit\0"
|
||||
-#if __ELF_NATIVE_CLASS == 32
|
||||
- "la_symbind32\0"
|
||||
-#elif __ELF_NATIVE_CLASS == 64
|
||||
- "la_symbind64\0"
|
||||
-#else
|
||||
-# error "__ELF_NATIVE_CLASS must be defined"
|
||||
-#endif
|
||||
+ LA_SYMBIND "\0"
|
||||
#define STRING(s) __STRING (s)
|
||||
"la_" STRING (ARCH_LA_PLTENTER) "\0"
|
||||
"la_" STRING (ARCH_LA_PLTEXIT) "\0"
|
||||
diff --git a/elf/tst-audit19a.c b/elf/tst-audit19a.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..035cde9351c2711b
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit19a.c
|
||||
@@ -0,0 +1,38 @@
|
||||
+/* Check if DT_AUDIT a module without la_plt{enter,exit} symbols does not incur
|
||||
+ in profiling (BZ#15533).
|
||||
+ Copyright (C) 2021 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 <link.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ void *h = xdlopen ("tst-auditmod19a.so", RTLD_NOW);
|
||||
+
|
||||
+ struct link_map *lmap;
|
||||
+ TEST_VERIFY_EXIT (dlinfo (h, RTLD_DI_LINKMAP, &lmap) == 0);
|
||||
+
|
||||
+ /* The internal array is only allocated if profiling is enabled. */
|
||||
+ TEST_VERIFY (lmap->l_reloc_result == NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-audit19b.c b/elf/tst-audit19b.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..da015734f24e0d79
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit19b.c
|
||||
@@ -0,0 +1,94 @@
|
||||
+/* Check if DT_AUDIT a module with la_plt{enter,exit} call la_symbind
|
||||
+ for lazy resolution.
|
||||
+ Copyright (C) 2021 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 <getopt.h>
|
||||
+#include <support/capture_subprocess.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/xstdio.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <stdbool.h>
|
||||
+
|
||||
+static int restart;
|
||||
+#define CMDLINE_OPTIONS \
|
||||
+ { "restart", no_argument, &restart, 1 },
|
||||
+
|
||||
+int tst_audit18bmod1_func (void);
|
||||
+
|
||||
+static int
|
||||
+handle_restart (void)
|
||||
+{
|
||||
+ TEST_COMPARE (tst_audit18bmod1_func (), 10);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline bool
|
||||
+startswith (const char *str, const char *pre)
|
||||
+{
|
||||
+ size_t lenpre = strlen (pre);
|
||||
+ size_t lenstr = strlen (str);
|
||||
+ return lenstr < lenpre ? false : memcmp (pre, str, lenpre) == 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (int argc, char *argv[])
|
||||
+{
|
||||
+ /* We must have either:
|
||||
+ - One our fource parameters left if called initially:
|
||||
+ + path to ld.so optional
|
||||
+ + "--library-path" optional
|
||||
+ + the library path optional
|
||||
+ + the application name */
|
||||
+
|
||||
+ if (restart)
|
||||
+ return handle_restart ();
|
||||
+
|
||||
+ char *spargv[9];
|
||||
+ int i = 0;
|
||||
+ for (; i < argc - 1; i++)
|
||||
+ spargv[i] = argv[i + 1];
|
||||
+ spargv[i++] = (char *) "--direct";
|
||||
+ spargv[i++] = (char *) "--restart";
|
||||
+ spargv[i] = NULL;
|
||||
+
|
||||
+ setenv ("LD_AUDIT", "tst-auditmod18b.so", 0);
|
||||
+ struct support_capture_subprocess result
|
||||
+ = support_capture_subprogram (spargv[0], spargv);
|
||||
+ support_capture_subprocess_check (&result, "tst-audit18b", 0, sc_allow_stderr);
|
||||
+
|
||||
+ bool find_symbind = false;
|
||||
+
|
||||
+ FILE *out = fmemopen (result.err.buffer, result.err.length, "r");
|
||||
+ TEST_VERIFY (out != NULL);
|
||||
+ char *buffer = NULL;
|
||||
+ size_t buffer_length = 0;
|
||||
+ while (xgetline (&buffer, &buffer_length, out))
|
||||
+ if (startswith (buffer, "la_symbind: tst_audit18bmod1_func") == 0)
|
||||
+ find_symbind = true;
|
||||
+
|
||||
+ TEST_COMPARE (find_symbind, true);
|
||||
+
|
||||
+ free (buffer);
|
||||
+ xfclose (out);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define TEST_FUNCTION_ARGV do_test
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-audit19bmod.c b/elf/tst-audit19bmod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..9ffdcd8f3ffbc38e
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit19bmod.c
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* Extra module for tst-audit18b.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+int
|
||||
+tst_audit18bmod1_func (void)
|
||||
+{
|
||||
+ return 10;
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod19a.c b/elf/tst-auditmod19a.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..f58204099457743d
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod19a.c
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* Audit module for tst-audit18a.
|
||||
+ Copyright (C) 2021 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 <link.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod19b.c b/elf/tst-auditmod19b.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..e2248b2a75946746
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod19b.c
|
||||
@@ -0,0 +1,46 @@
|
||||
+/* Audit module for tst-audit18b.
|
||||
+ Copyright (C) 2021 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 <link.h>
|
||||
+#include <string.h>
|
||||
+#include <stdio.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
|
||||
+{
|
||||
+ return LA_FLG_BINDTO | LA_FLG_BINDFROM;
|
||||
+}
|
||||
+
|
||||
+uintptr_t
|
||||
+#if __ELF_NATIVE_CLASS == 32
|
||||
+la_symbind32 (Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
+ uintptr_t *defcook, unsigned int *flags, const char *symname)
|
||||
+#else
|
||||
+la_symbind64 (Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
|
||||
+ uintptr_t *defcook, unsigned int *flags, const char *symname)
|
||||
+#endif
|
||||
+{
|
||||
+ fprintf (stderr, "la_symbind: %s\n", symname);
|
||||
+ return sym->st_value;
|
||||
+}
|
||||
diff --git a/include/link.h b/include/link.h
|
||||
index cdd011f59445e490..dd491989beb41353 100644
|
||||
--- a/include/link.h
|
||||
+++ b/include/link.h
|
||||
@@ -353,8 +353,10 @@ struct link_map
|
||||
|
||||
#if __ELF_NATIVE_CLASS == 32
|
||||
# define symbind symbind32
|
||||
+# define LA_SYMBIND "la_symbind32"
|
||||
#elif __ELF_NATIVE_CLASS == 64
|
||||
# define symbind symbind64
|
||||
+# define LA_SYMBIND "la_symbind64"
|
||||
#else
|
||||
# error "__ELF_NATIVE_CLASS must be defined"
|
||||
#endif
|
296
SOURCES/glibc-rh2047981-24.patch
Normal file
296
SOURCES/glibc-rh2047981-24.patch
Normal file
@ -0,0 +1,296 @@
|
||||
Added $(libdl) to $(objpfx)tst-audit-tlsdesc-dlopen in elf/Makefile
|
||||
since we still need $(libdl) in RHEL8.
|
||||
|
||||
commit d1b38173c9255b1a4ae00018ad9b35404a7c74d0
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Jun 30 15:51:31 2021 -0300
|
||||
|
||||
elf: Add audit tests for modules with TLSDESC
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 0cc03ffe2984ee50..d8d9734df0fea9a8 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -375,6 +375,22 @@ modules-names += tst-gnu2-tls1mod
|
||||
$(objpfx)tst-gnu2-tls1: $(objpfx)tst-gnu2-tls1mod.so
|
||||
tst-gnu2-tls1mod.so-no-z-defs = yes
|
||||
CFLAGS-tst-gnu2-tls1mod.c += -mtls-dialect=gnu2
|
||||
+
|
||||
+tests += tst-audit-tlsdesc tst-audit-tlsdesc-dlopen
|
||||
+modules-names += tst-audit-tlsdesc-mod1 tst-audit-tlsdesc-mod2 tst-auditmod-tlsdesc
|
||||
+$(objpfx)tst-audit-tlsdesc: $(objpfx)tst-audit-tlsdesc-mod1.so \
|
||||
+ $(objpfx)tst-audit-tlsdesc-mod2.so \
|
||||
+ $(shared-thread-library)
|
||||
+CFLAGS-tst-audit-tlsdesc-mod1.c += -mtls-dialect=gnu2
|
||||
+CFLAGS-tst-audit-tlsdesc-mod2.c += -mtls-dialect=gnu2
|
||||
+$(objpfx)tst-audit-tlsdesc-dlopen: $(shared-thread-library) $(libdl)
|
||||
+$(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-audit-tlsdesc-mod1.so \
|
||||
+ $(objpfx)tst-audit-tlsdesc-mod2.so
|
||||
+$(objpfx)tst-audit-tlsdesc-mod1.so: $(objpfx)tst-audit-tlsdesc-mod2.so
|
||||
+$(objpfx)tst-audit-tlsdesc.out: $(objpfx)tst-auditmod-tlsdesc.so
|
||||
+tst-audit-tlsdesc-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so
|
||||
+$(objpfx)tst-audit-tlsdesc-dlopen.out: $(objpfx)tst-auditmod-tlsdesc.so
|
||||
+tst-audit-tlsdesc-dlopen-ENV = LD_AUDIT=$(objpfx)tst-auditmod-tlsdesc.so
|
||||
endif
|
||||
ifeq (yes,$(have-protected-data))
|
||||
modules-names += tst-protected1moda tst-protected1modb
|
||||
diff --git a/elf/tst-audit-tlsdesc-dlopen.c b/elf/tst-audit-tlsdesc-dlopen.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..9c16bb087aca1b77
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit-tlsdesc-dlopen.c
|
||||
@@ -0,0 +1,67 @@
|
||||
+/* DT_AUDIT with modules with TLSDESC.
|
||||
+ Copyright (C) 2021 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 <support/check.h>
|
||||
+#include <support/xthread.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+
|
||||
+static void *
|
||||
+thr_func (void *mod)
|
||||
+{
|
||||
+ int* (*get_global1)(void) = xdlsym (mod, "get_global1");
|
||||
+ int* (*get_global2)(void) = xdlsym (mod, "get_global2");
|
||||
+ void (*set_global2)(int) = xdlsym (mod, "set_global2");
|
||||
+ int* (*get_local1)(void) = xdlsym (mod, "get_local1");
|
||||
+ int* (*get_local2)(void) = xdlsym (mod, "get_local2");
|
||||
+
|
||||
+ int *global1 = get_global1 ();
|
||||
+ TEST_COMPARE (*global1, 0);
|
||||
+ ++*global1;
|
||||
+
|
||||
+ int *global2 = get_global2 ();
|
||||
+ TEST_COMPARE (*global2, 0);
|
||||
+ ++*global2;
|
||||
+ TEST_COMPARE (*global2, 1);
|
||||
+
|
||||
+ set_global2 (10);
|
||||
+ TEST_COMPARE (*global2, 10);
|
||||
+
|
||||
+ int *local1 = get_local1 ();
|
||||
+ TEST_COMPARE (*local1, 0);
|
||||
+ ++*local1;
|
||||
+
|
||||
+ int *local2 = get_local2 ();
|
||||
+ TEST_COMPARE (*local2, 0);
|
||||
+ ++*local2;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ void *mod = xdlopen ("tst-audit-tlsdesc-mod1.so", RTLD_LAZY);
|
||||
+
|
||||
+ pthread_t thr = xpthread_create (NULL, thr_func, mod);
|
||||
+ void *r = xpthread_join (thr);
|
||||
+ TEST_VERIFY (r == NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-audit-tlsdesc-mod1.c b/elf/tst-audit-tlsdesc-mod1.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..61c7dd99a2fb5e28
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit-tlsdesc-mod1.c
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* DT_AUDIT with modules with TLSDESC.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+__thread int global1;
|
||||
+
|
||||
+int *
|
||||
+get_global1 (void)
|
||||
+{
|
||||
+ return &global1;
|
||||
+}
|
||||
+
|
||||
+static __thread int local1;
|
||||
+
|
||||
+void *
|
||||
+get_local1 (void)
|
||||
+{
|
||||
+ return &local1;
|
||||
+}
|
||||
+
|
||||
+extern __thread int global2;
|
||||
+
|
||||
+void
|
||||
+set_global2 (int v)
|
||||
+{
|
||||
+ global2 = v;
|
||||
+}
|
||||
diff --git a/elf/tst-audit-tlsdesc-mod2.c b/elf/tst-audit-tlsdesc-mod2.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..28aef635f688ee03
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit-tlsdesc-mod2.c
|
||||
@@ -0,0 +1,33 @@
|
||||
+/* DT_AUDIT with modules with TLSDESC.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+__thread int global2;
|
||||
+
|
||||
+int *
|
||||
+get_global2 (void)
|
||||
+{
|
||||
+ return &global2;
|
||||
+}
|
||||
+
|
||||
+static __thread int local2;
|
||||
+
|
||||
+void *
|
||||
+get_local2 (void)
|
||||
+{
|
||||
+ return &local2;
|
||||
+}
|
||||
diff --git a/elf/tst-audit-tlsdesc.c b/elf/tst-audit-tlsdesc.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..3c8be81c95528f47
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit-tlsdesc.c
|
||||
@@ -0,0 +1,60 @@
|
||||
+/* DT_AUDIT with modules with TLSDESC.
|
||||
+ Copyright (C) 2021 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 <support/check.h>
|
||||
+#include <support/xthread.h>
|
||||
+
|
||||
+extern __thread int global1;
|
||||
+extern __thread int global2;
|
||||
+void *get_local1 (void);
|
||||
+void set_global2 (int v);
|
||||
+void *get_local2 (void);
|
||||
+
|
||||
+static void *
|
||||
+thr_func (void *clousure)
|
||||
+{
|
||||
+ TEST_COMPARE (global1, 0);
|
||||
+ ++global1;
|
||||
+ TEST_COMPARE (global2, 0);
|
||||
+ ++global2;
|
||||
+ TEST_COMPARE (global2, 1);
|
||||
+
|
||||
+ set_global2 (10);
|
||||
+ TEST_COMPARE (global2, 10);
|
||||
+
|
||||
+ int *local1 = get_local1 ();
|
||||
+ TEST_COMPARE (*local1, 0);
|
||||
+ ++*local1;
|
||||
+
|
||||
+ int *local2 = get_local2 ();
|
||||
+ TEST_COMPARE (*local2, 0);
|
||||
+ ++*local2;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ pthread_t thr = xpthread_create (NULL, thr_func, NULL);
|
||||
+ void *r = xpthread_join (thr);
|
||||
+ TEST_VERIFY (r == NULL);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod-tlsdesc.c b/elf/tst-auditmod-tlsdesc.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..e4b835d1f1fb6f73
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod-tlsdesc.c
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* DT_AUDIT with modules with TLSDESC.
|
||||
+ Copyright (C) 2021 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 <link.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
313
SOURCES/glibc-rh2047981-25.patch
Normal file
313
SOURCES/glibc-rh2047981-25.patch
Normal file
@ -0,0 +1,313 @@
|
||||
commit f0e23d34a7bdf6b90fba954ee741419171ac41b2
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Mon Jul 19 18:42:26 2021 -0300
|
||||
|
||||
elf: Issue audit la_objopen for vDSO
|
||||
|
||||
The vDSO is is listed in the link_map chain, but is never the subject of
|
||||
an la_objopen call. A new internal flag __RTLD_VDSO is added that
|
||||
acts as __RTLD_OPENEXEC to allocate the required 'struct auditstate'
|
||||
extra space for the 'struct link_map'.
|
||||
|
||||
The return value from the callback is currently ignored, since there
|
||||
is no PLT call involved by glibc when using the vDSO, neither the vDSO
|
||||
are exported directly.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index d8d9734df0fea9a8..f047c1cce0c55da0 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -222,6 +222,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-audit17 \
|
||||
tst-audit18 \
|
||||
tst-audit19b \
|
||||
+ tst-audit22 \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -363,6 +364,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
tst-auditmod19a \
|
||||
tst-auditmod19b \
|
||||
tst-audit19bmod \
|
||||
+ tst-auditmod22 \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1577,6 +1579,9 @@ $(objpfx)tst-audit19b.out: $(objpfx)tst-auditmod19b.so
|
||||
$(objpfx)tst-audit19b: $(objpfx)tst-audit19bmod.so
|
||||
tst-audit19b-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
+$(objpfx)tst-audit22.out: $(objpfx)tst-auditmod22.so
|
||||
+tst-audit22-ARGS = -- $(host-test-program-cmd)
|
||||
+
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
-Wl,--version-script=tst-sonamemove-linkmod1.map \
|
||||
diff --git a/elf/dl-object.c b/elf/dl-object.c
|
||||
index 05a7750c65305771..3be309ecf1b5d4e2 100644
|
||||
--- a/elf/dl-object.c
|
||||
+++ b/elf/dl-object.c
|
||||
@@ -59,16 +59,19 @@ _dl_new_object (char *realname, const char *libname, int type,
|
||||
{
|
||||
#ifdef SHARED
|
||||
unsigned int naudit;
|
||||
- if (__glibc_unlikely ((mode & __RTLD_OPENEXEC) != 0))
|
||||
+ if (__glibc_unlikely ((mode & (__RTLD_OPENEXEC | __RTLD_VDSO)) != 0))
|
||||
{
|
||||
- assert (type == lt_executable);
|
||||
- assert (nsid == LM_ID_BASE);
|
||||
+ if (mode & __RTLD_OPENEXEC)
|
||||
+ {
|
||||
+ assert (type == lt_executable);
|
||||
+ assert (nsid == LM_ID_BASE);
|
||||
|
||||
- /* Ignore the specified libname for the main executable. It is
|
||||
- only known with an explicit loader invocation. */
|
||||
- libname = "";
|
||||
+ /* Ignore the specified libname for the main executable. It is
|
||||
+ only known with an explicit loader invocation. */
|
||||
+ libname = "";
|
||||
+ }
|
||||
|
||||
- /* We create the map for the executable before we know whether
|
||||
+ /* We create the map for the executable and vDSO before we know whether
|
||||
we have auditing libraries and if yes, how many. Assume the
|
||||
worst. */
|
||||
naudit = DL_NNS;
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 2994578ba3a5f911..efcbeac6c24c4b7b 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1917,6 +1917,12 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
assert (i == npreloads);
|
||||
}
|
||||
|
||||
+#ifdef NEED_DL_SYSINFO_DSO
|
||||
+ /* Now that the audit modules are opened, call la_objopen for the vDSO. */
|
||||
+ if (GLRO(dl_sysinfo_map) != NULL)
|
||||
+ _dl_audit_objopen (GLRO(dl_sysinfo_map), LM_ID_BASE);
|
||||
+#endif
|
||||
+
|
||||
/* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
|
||||
specified some libraries to load, these are inserted before the actual
|
||||
dependencies in the executable's searchlist for symbol resolution. */
|
||||
diff --git a/elf/setup-vdso.h b/elf/setup-vdso.h
|
||||
index 34b1d5e8c37c2610..d2b35a080b57c183 100644
|
||||
--- a/elf/setup-vdso.h
|
||||
+++ b/elf/setup-vdso.h
|
||||
@@ -30,7 +30,7 @@ setup_vdso (struct link_map *main_map __attribute__ ((unused)),
|
||||
We just want our data structures to describe it as if we had just
|
||||
mapped and relocated it normally. */
|
||||
struct link_map *l = _dl_new_object ((char *) "", "", lt_library, NULL,
|
||||
- 0, LM_ID_BASE);
|
||||
+ __RTLD_VDSO, LM_ID_BASE);
|
||||
if (__glibc_likely (l != NULL))
|
||||
{
|
||||
static ElfW(Dyn) dyn_temp[DL_RO_DYN_TEMP_CNT] attribute_relro;
|
||||
diff --git a/elf/tst-audit22.c b/elf/tst-audit22.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..18fd22a760ddc3d8
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit22.c
|
||||
@@ -0,0 +1,124 @@
|
||||
+/* Check DTAUDIT and vDSO interaction.
|
||||
+ Copyright (C) 2021 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 <errno.h>
|
||||
+#include <getopt.h>
|
||||
+#include <limits.h>
|
||||
+#include <inttypes.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <support/capture_subprocess.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/xstdio.h>
|
||||
+#include <support/support.h>
|
||||
+#include <sys/auxv.h>
|
||||
+
|
||||
+static int restart;
|
||||
+#define CMDLINE_OPTIONS \
|
||||
+ { "restart", no_argument, &restart, 1 },
|
||||
+
|
||||
+static uintptr_t vdso_addr;
|
||||
+
|
||||
+static int
|
||||
+handle_restart (void)
|
||||
+{
|
||||
+ fprintf (stderr, "vdso: %p\n", (void*) vdso_addr);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static uintptr_t
|
||||
+parse_address (const char *str)
|
||||
+{
|
||||
+ void *r;
|
||||
+ TEST_COMPARE (sscanf (str, "%p\n", &r), 1);
|
||||
+ return (uintptr_t) r;
|
||||
+}
|
||||
+
|
||||
+static inline bool
|
||||
+startswith (const char *str, const char *pre)
|
||||
+{
|
||||
+ size_t lenpre = strlen (pre);
|
||||
+ size_t lenstr = strlen (str);
|
||||
+ return lenstr >= lenpre && memcmp (pre, str, lenpre) == 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (int argc, char *argv[])
|
||||
+{
|
||||
+ vdso_addr = getauxval (AT_SYSINFO_EHDR);
|
||||
+ if (vdso_addr == 0)
|
||||
+ FAIL_UNSUPPORTED ("getauxval (AT_SYSINFO_EHDR) returned 0");
|
||||
+
|
||||
+ /* We must have either:
|
||||
+ - One our fource parameters left if called initially:
|
||||
+ + path to ld.so optional
|
||||
+ + "--library-path" optional
|
||||
+ + the library path optional
|
||||
+ + the application name */
|
||||
+ if (restart)
|
||||
+ return handle_restart ();
|
||||
+
|
||||
+ char *spargv[9];
|
||||
+ int i = 0;
|
||||
+ for (; i < argc - 1; i++)
|
||||
+ spargv[i] = argv[i + 1];
|
||||
+ spargv[i++] = (char *) "--direct";
|
||||
+ spargv[i++] = (char *) "--restart";
|
||||
+ spargv[i] = NULL;
|
||||
+
|
||||
+ setenv ("LD_AUDIT", "tst-auditmod22.so", 0);
|
||||
+ struct support_capture_subprocess result
|
||||
+ = support_capture_subprogram (spargv[0], spargv);
|
||||
+ support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
|
||||
+
|
||||
+ /* The respawned process should always print the vDSO address (otherwise it
|
||||
+ will fails as unsupported). However, on some architectures the audit
|
||||
+ module might see the vDSO with l_addr being 0, meaning a fixed mapping
|
||||
+ (linux-gate.so). In this case we don't check its value against
|
||||
+ AT_SYSINFO_EHDR one. */
|
||||
+ uintptr_t vdso_process = 0;
|
||||
+ bool vdso_audit_found = false;
|
||||
+ uintptr_t vdso_audit = 0;
|
||||
+
|
||||
+ FILE *out = fmemopen (result.err.buffer, result.err.length, "r");
|
||||
+ TEST_VERIFY (out != NULL);
|
||||
+ char *buffer = NULL;
|
||||
+ size_t buffer_length = 0;
|
||||
+ while (xgetline (&buffer, &buffer_length, out))
|
||||
+ {
|
||||
+ if (startswith (buffer, "vdso: "))
|
||||
+ vdso_process = parse_address (buffer + strlen ("vdso: "));
|
||||
+ else if (startswith (buffer, "vdso found: "))
|
||||
+ {
|
||||
+ vdso_audit = parse_address (buffer + strlen ("vdso found: "));
|
||||
+ vdso_audit_found = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ TEST_COMPARE (vdso_audit_found, true);
|
||||
+ if (vdso_audit != 0)
|
||||
+ TEST_COMPARE (vdso_process, vdso_audit);
|
||||
+
|
||||
+ free (buffer);
|
||||
+ xfclose (out);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define TEST_FUNCTION_ARGV do_test
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod22.c b/elf/tst-auditmod22.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..8e05ce8cbb215dd5
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod22.c
|
||||
@@ -0,0 +1,51 @@
|
||||
+/* Check DTAUDIT and vDSO interaction.
|
||||
+ Copyright (C) 2021 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 <link.h>
|
||||
+#include <inttypes.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <string.h>
|
||||
+#include <stdio.h>
|
||||
+#include <sys/auxv.h>
|
||||
+
|
||||
+static inline bool
|
||||
+startswith (const char *str, const char *pre)
|
||||
+{
|
||||
+ size_t lenpre = strlen (pre);
|
||||
+ size_t lenstr = strlen (str);
|
||||
+ return lenstr < lenpre ? false : memcmp (pre, str, lenpre) == 0;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
|
||||
+{
|
||||
+ /* The linux-gate.so is placed at a fixed address, thus l_addr being 0,
|
||||
+ and it might be the value reported as the AT_SYSINFO_EHDR. */
|
||||
+ if (map->l_addr == 0 && startswith (map->l_name, "linux-gate.so"))
|
||||
+ fprintf (stderr, "vdso found: %p\n", NULL);
|
||||
+ else if (map->l_addr == getauxval (AT_SYSINFO_EHDR))
|
||||
+ fprintf (stderr, "vdso found: %p\n", (void*) map->l_addr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/include/dlfcn.h b/include/dlfcn.h
|
||||
index 109586a1d968b630..a39cc9c69f55a56a 100644
|
||||
--- a/include/dlfcn.h
|
||||
+++ b/include/dlfcn.h
|
||||
@@ -12,6 +12,8 @@
|
||||
#define __RTLD_AUDIT 0x08000000
|
||||
#define __RTLD_SECURE 0x04000000 /* Apply additional security checks. */
|
||||
#define __RTLD_NOIFUNC 0x02000000 /* Suppress calling ifunc functions. */
|
||||
+#define __RTLD_VDSO 0x01000000 /* Tell _dl_new_object the object is
|
||||
+ system-loaded. */
|
||||
|
||||
#define __LM_ID_CALLER -2
|
||||
|
170
SOURCES/glibc-rh2047981-26.patch
Normal file
170
SOURCES/glibc-rh2047981-26.patch
Normal file
@ -0,0 +1,170 @@
|
||||
Added $(objpfx)tst-auditmod20: $(libdl) in elf/Makefile since
|
||||
we still have $(libdl) in RHEL8.
|
||||
|
||||
commit 484e672ddabe0a919a692520e6ac8f2580866235
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Jun 30 17:33:57 2021 -0300
|
||||
|
||||
elf: Do not fail for failed dlmopen on audit modules (BZ #28061)
|
||||
|
||||
The dl_main sets the LM_ID_BASE to RT_ADD just before starting to
|
||||
add load new shared objects. The state is set to RT_CONSISTENT just
|
||||
after all objects are loaded.
|
||||
|
||||
However if a audit modules tries to dlmopen an inexistent module,
|
||||
the _dl_open will assert that the namespace is in an inconsistent
|
||||
state.
|
||||
|
||||
This is different than dlopen, since first it will not use
|
||||
LM_ID_BASE and second _dl_map_object_from_fd is the sole responsible
|
||||
to set and reset the r_state value.
|
||||
|
||||
So the assert on _dl_open can not really be seen if the state is
|
||||
consistent, since _dt_main resets it. This patch removes the assert.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/dl-open.c
|
||||
Uses dl_debug_initialize instead of dl_debug_update.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index f047c1cce0c55da0..7c7b9e1937d3e41c 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -222,6 +222,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-audit17 \
|
||||
tst-audit18 \
|
||||
tst-audit19b \
|
||||
+ tst-audit20 \
|
||||
tst-audit22 \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
@@ -364,6 +365,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
tst-auditmod19a \
|
||||
tst-auditmod19b \
|
||||
tst-audit19bmod \
|
||||
+ tst-auditmod20 \
|
||||
tst-auditmod22 \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
@@ -1579,6 +1581,10 @@ $(objpfx)tst-audit19b.out: $(objpfx)tst-auditmod19b.so
|
||||
$(objpfx)tst-audit19b: $(objpfx)tst-audit19bmod.so
|
||||
tst-audit19b-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
+$(objpfx)tst-audit20.out: $(objpfx)tst-auditmod20.so
|
||||
+tst-audit20-ENV = LD_AUDIT=$(objpfx)tst-auditmod20.so
|
||||
+$(objpfx)tst-auditmod20.so: $(libdl)
|
||||
+
|
||||
$(objpfx)tst-audit22.out: $(objpfx)tst-auditmod22.so
|
||||
tst-audit22-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index 660a56b2fb2639cd..6b85e9ab4e249f86 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -911,8 +911,6 @@ no more namespaces available for dlmopen()"));
|
||||
the flag here. */
|
||||
}
|
||||
|
||||
- assert (_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT);
|
||||
-
|
||||
/* Release the lock. */
|
||||
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
|
||||
diff --git a/elf/tst-audit20.c b/elf/tst-audit20.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..6f39ccee865b012b
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit20.c
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* Check dlopen failure on audit modules.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod20.c b/elf/tst-auditmod20.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..c57e50ee4e88dd6b
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod20.c
|
||||
@@ -0,0 +1,57 @@
|
||||
+/* Check dlopen failure on audit modules.
|
||||
+ Copyright (C) 2021 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 <dlfcn.h>
|
||||
+#include <link.h>
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int v)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+check (void)
|
||||
+{
|
||||
+ {
|
||||
+ void *mod = dlopen ("nonexistent.so", RTLD_NOW);
|
||||
+ if (mod != NULL)
|
||||
+ abort ();
|
||||
+ }
|
||||
+
|
||||
+ {
|
||||
+ void *mod = dlmopen (LM_ID_BASE, "nonexistent.so", RTLD_NOW);
|
||||
+ if (mod != NULL)
|
||||
+ abort ();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_activity (uintptr_t *cookie, unsigned int flag)
|
||||
+{
|
||||
+ if (flag != LA_ACT_CONSISTENT)
|
||||
+ return;
|
||||
+ check ();
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_preinit (uintptr_t *cookie)
|
||||
+{
|
||||
+ check ();
|
||||
+}
|
557
SOURCES/glibc-rh2047981-27.patch
Normal file
557
SOURCES/glibc-rh2047981-27.patch
Normal file
@ -0,0 +1,557 @@
|
||||
commit 28713c06129f8f64f88c423266e6ff2880216509
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Mon Dec 13 09:43:52 2021 -0800
|
||||
|
||||
elf: Sort tests and modules-names
|
||||
|
||||
Sort tests and modules-names to reduce future conflicts.
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
Complete rewrite of sorted lists.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 7c7b9e1937d3e41c..914cb5ad2f2c3aea 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -185,46 +185,130 @@ tests-static += tst-tls9-static
|
||||
tst-tls9-static-ENV = \
|
||||
LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)dlfcn
|
||||
|
||||
-tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
- constload1 order noload filter \
|
||||
- reldep reldep2 reldep3 reldep4 nodelete nodelete2 \
|
||||
- nodlopen nodlopen2 lateglobal initfirst global \
|
||||
- restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
|
||||
- tst-tls4 tst-tls5 \
|
||||
- tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 \
|
||||
- tst-tls16 tst-tls17 tst-tls18 tst-tls19 tst-tls-dlinfo \
|
||||
- tst-align tst-align2 \
|
||||
- tst-dlmodcount tst-dlopenrpath tst-deep1 \
|
||||
- tst-dlmopen1 tst-dlmopen3 \
|
||||
- unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \
|
||||
- tst-audit1 tst-audit2 tst-audit8 tst-audit9 \
|
||||
- tst-addr1 tst-thrlock \
|
||||
- tst-unique1 tst-unique2 $(if $(CXX),tst-unique3 tst-unique4 \
|
||||
- tst-nodelete tst-dlopen-nodelete-reloc) \
|
||||
- tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
|
||||
- tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
|
||||
- tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
|
||||
- tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \
|
||||
- tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \
|
||||
- tst-audit13 \
|
||||
- tst-sonamemove-link tst-sonamemove-dlopen \
|
||||
- tst-auditmany tst-initfinilazyfail \
|
||||
- tst-dlopenfail tst-dlopenfail-2 \
|
||||
- tst-filterobj tst-filterobj-dlopen tst-auxobj tst-auxobj-dlopen \
|
||||
- tst-audit14 tst-audit15 tst-audit16 \
|
||||
- tst-tls-ie tst-tls-ie-dlmopen \
|
||||
- argv0test \
|
||||
- tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \
|
||||
- tst-tls20 tst-tls21 \
|
||||
- tst-rtld-run-static \
|
||||
- tst-dlmopen-dlerror \
|
||||
- tst-dlmopen-gethostbyname \
|
||||
- tst-audit17 \
|
||||
- tst-audit18 \
|
||||
- tst-audit19b \
|
||||
- tst-audit20 \
|
||||
- tst-audit22 \
|
||||
+tests += \
|
||||
+ argv0test \
|
||||
+ constload1 \
|
||||
+ dblload \
|
||||
+ dblunload \
|
||||
+ filter \
|
||||
+ global \
|
||||
+ initfirst \
|
||||
+ lateglobal \
|
||||
+ loadfail \
|
||||
+ multiload \
|
||||
+ next \
|
||||
+ nodelete \
|
||||
+ nodelete2 \
|
||||
+ nodlopen \
|
||||
+ nodlopen2 \
|
||||
+ noload \
|
||||
+ order \
|
||||
+ order2 \
|
||||
+ origtest \
|
||||
+ preloadtest \
|
||||
+ reldep \
|
||||
+ reldep2 \
|
||||
+ reldep3 \
|
||||
+ reldep4 \
|
||||
+ reldep5 \
|
||||
+ reldep6 \
|
||||
+ reldep7 \
|
||||
+ reldep8 \
|
||||
+ resolvfail \
|
||||
+ restest1 \
|
||||
+ restest2 \
|
||||
+ tst-absolute-sym \
|
||||
+ tst-absolute-zero \
|
||||
+ tst-addr1 \
|
||||
+ tst-align \
|
||||
+ tst-align2 \
|
||||
+ tst-audit1 \
|
||||
+ tst-audit11 \
|
||||
+ tst-audit12 \
|
||||
+ tst-audit13 \
|
||||
+ tst-audit14 \
|
||||
+ tst-audit15 \
|
||||
+ tst-audit16 \
|
||||
+ tst-audit17 \
|
||||
+ tst-audit18 \
|
||||
+ tst-audit19b \
|
||||
+ tst-audit2 \
|
||||
+ tst-audit20 \
|
||||
+ tst-audit22 \
|
||||
+ tst-audit8 \
|
||||
+ tst-audit9 \
|
||||
+ tst-auditmany \
|
||||
+ tst-auxobj \
|
||||
+ tst-auxobj-dlopen \
|
||||
+ tst-big-note \
|
||||
+ tst-debug1 \
|
||||
+ tst-deep1 \
|
||||
+ tst-dlmodcount \
|
||||
+ tst-dlmopen1 \
|
||||
+ tst-dlmopen3 \
|
||||
+ tst-dlmopen-dlerror \
|
||||
+ tst-dlmopen-gethostbyname \
|
||||
+ tst-dlopenfail \
|
||||
+ tst-dlopenfail-2 \
|
||||
+ tst-dlopenrpath \
|
||||
+ tst-dlsym-error \
|
||||
+ tst-filterobj \
|
||||
+ tst-filterobj-dlopen \
|
||||
+ tst-glibc-hwcaps \
|
||||
+ tst-glibc-hwcaps-mask \
|
||||
+ tst-glibc-hwcaps-prepend \
|
||||
+ tst-global1 \
|
||||
+ tst-initfinilazyfail \
|
||||
+ tst-initorder \
|
||||
+ tst-initorder2 \
|
||||
+ tst-latepthread \
|
||||
+ tst-main1 \
|
||||
+ tst-nodelete2 \
|
||||
+ tst-nodelete-dlclose \
|
||||
+ tst-nodelete-opened \
|
||||
+ tst-noload \
|
||||
+ tst-null-argv \
|
||||
+ tst-relsort1 \
|
||||
+ tst-rtld-run-static \
|
||||
+ tst-sonamemove-dlopen \
|
||||
+ tst-sonamemove-link \
|
||||
+ tst-thrlock \
|
||||
+ tst-tls10 \
|
||||
+ tst-tls11 \
|
||||
+ tst-tls12 \
|
||||
+ tst-tls13 \
|
||||
+ tst-tls14 \
|
||||
+ tst-tls15 \
|
||||
+ tst-tls16 \
|
||||
+ tst-tls17 \
|
||||
+ tst-tls18 \
|
||||
+ tst-tls19 \
|
||||
+ tst-tls20 \
|
||||
+ tst-tls21 \
|
||||
+ tst-tls4 \
|
||||
+ tst-tls5 \
|
||||
+ tst-tlsalign \
|
||||
+ tst-tlsalign-extern \
|
||||
+ tst-tls-dlinfo \
|
||||
+ tst-tls-ie \
|
||||
+ tst-tls-ie-dlmopen \
|
||||
+ tst-tls-manydynamic \
|
||||
+ tst-unique1 \
|
||||
+ tst-unique2 \
|
||||
+ unload3 \
|
||||
+ unload4 \
|
||||
+ unload5 \
|
||||
+ unload6 \
|
||||
+ unload7 \
|
||||
+ unload8 \
|
||||
# reldep9
|
||||
+tests-cxx = \
|
||||
+ tst-dlopen-nodelete-reloc \
|
||||
+ tst-nodelete \
|
||||
+ tst-unique3 \
|
||||
+ tst-unique4 \
|
||||
+
|
||||
+tests += $(if $(CXX),$(tests-cxx))
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
|
||||
@@ -266,107 +350,269 @@ tst-tls-many-dynamic-modules-dep-bad = \
|
||||
extra-test-objs += $(tlsmod17a-modules:=.os) $(tlsmod18a-modules:=.os) \
|
||||
tst-tlsalign-vars.o
|
||||
test-extras += tst-tlsmod17a tst-tlsmod18a tst-tlsalign-vars
|
||||
-modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
- testobj1_1 failobj constload2 constload3 unloadmod \
|
||||
- dep1 dep2 dep3 dep4 vismod1 vismod2 vismod3 \
|
||||
- nodelmod1 nodelmod2 nodelmod3 nodelmod4 \
|
||||
- nodel2mod1 nodel2mod2 nodel2mod3 \
|
||||
- nodlopenmod nodlopenmod2 filtmod1 filtmod2 \
|
||||
- reldepmod1 reldepmod2 reldepmod3 reldepmod4 nextmod1 nextmod2 \
|
||||
- reldep4mod1 reldep4mod2 reldep4mod3 reldep4mod4 \
|
||||
- neededobj1 neededobj2 neededobj3 neededobj4 \
|
||||
- neededobj5 neededobj6 firstobj globalmod1 \
|
||||
- unload2mod unload2dep ltglobmod1 ltglobmod2 pathoptobj \
|
||||
- dblloadmod1 dblloadmod2 dblloadmod3 reldepmod5 reldepmod6 \
|
||||
- reldep6mod0 reldep6mod1 reldep6mod2 reldep6mod3 reldep6mod4 \
|
||||
- reldep7mod1 reldep7mod2 \
|
||||
- tst-tlsmod1 tst-tlsmod2 tst-tlsmod3 tst-tlsmod4 \
|
||||
- tst-tlsmod5 tst-tlsmod6 tst-tlsmod7 tst-tlsmod8 \
|
||||
- tst-tlsmod9 tst-tlsmod10 tst-tlsmod11 tst-tlsmod12 \
|
||||
- tst-tlsmod13 tst-tlsmod13a tst-tlsmod14a tst-tlsmod14b \
|
||||
- tst-tlsmod15a tst-tlsmod15b tst-tlsmod16a tst-tlsmod16b \
|
||||
- $(tlsmod17a-modules) tst-tlsmod17b $(tlsmod18a-modules) \
|
||||
- tst-tls19mod1 tst-tls19mod2 tst-tls19mod3 \
|
||||
- circlemod1 circlemod1a circlemod2 circlemod2a \
|
||||
- circlemod3 circlemod3a \
|
||||
- reldep8mod1 reldep8mod2 reldep8mod3 \
|
||||
- reldep9mod1 reldep9mod2 reldep9mod3 \
|
||||
- tst-alignmod tst-alignmod2 \
|
||||
- $(modules-execstack-$(have-z-execstack)) \
|
||||
- tst-dlopenrpathmod tst-deep1mod1 tst-deep1mod2 tst-deep1mod3 \
|
||||
- tst-dlmopen1mod tst-auditmod1 \
|
||||
- unload3mod1 unload3mod2 unload3mod3 unload3mod4 \
|
||||
- unload4mod1 unload4mod2 unload4mod3 unload4mod4 \
|
||||
- unload6mod1 unload6mod2 unload6mod3 \
|
||||
- unload7mod1 unload7mod2 \
|
||||
- unload8mod1 unload8mod1x unload8mod2 unload8mod3 \
|
||||
- order2mod1 order2mod2 order2mod3 order2mod4 \
|
||||
- tst-unique1mod1 tst-unique1mod2 \
|
||||
- tst-unique2mod1 tst-unique2mod2 \
|
||||
- tst-auditmod9a tst-auditmod9b \
|
||||
- $(if $(CXX),tst-unique3lib tst-unique3lib2 tst-unique4lib \
|
||||
- tst-nodelete-uniquemod tst-nodelete-rtldmod \
|
||||
- tst-nodelete-zmod \
|
||||
- tst-dlopen-nodelete-reloc-mod1 \
|
||||
- tst-dlopen-nodelete-reloc-mod2 \
|
||||
- tst-dlopen-nodelete-reloc-mod3 \
|
||||
- tst-dlopen-nodelete-reloc-mod4 \
|
||||
- tst-dlopen-nodelete-reloc-mod5 \
|
||||
- tst-dlopen-nodelete-reloc-mod6 \
|
||||
- tst-dlopen-nodelete-reloc-mod7 \
|
||||
- tst-dlopen-nodelete-reloc-mod8 \
|
||||
- tst-dlopen-nodelete-reloc-mod9 \
|
||||
- tst-dlopen-nodelete-reloc-mod10 \
|
||||
- tst-dlopen-nodelete-reloc-mod11 \
|
||||
- tst-dlopen-nodelete-reloc-mod12 \
|
||||
- tst-dlopen-nodelete-reloc-mod13 \
|
||||
- tst-dlopen-nodelete-reloc-mod14 \
|
||||
- tst-dlopen-nodelete-reloc-mod15 \
|
||||
- tst-dlopen-nodelete-reloc-mod16 \
|
||||
- tst-dlopen-nodelete-reloc-mod17) \
|
||||
- tst-initordera1 tst-initorderb1 \
|
||||
- tst-initordera2 tst-initorderb2 \
|
||||
- tst-initordera3 tst-initordera4 \
|
||||
- tst-initorder2a tst-initorder2b tst-initorder2c \
|
||||
- tst-initorder2d \
|
||||
- tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \
|
||||
- tst-array5dep tst-null-argv-lib \
|
||||
- tst-tlsalign-lib tst-nodelete-opened-lib tst-nodelete2mod \
|
||||
- tst-audit11mod1 tst-audit11mod2 tst-auditmod11 \
|
||||
- tst-audit12mod1 tst-audit12mod2 tst-audit12mod3 tst-auditmod12 \
|
||||
- tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
|
||||
- $(tst-tls-many-dynamic-modules-dep) \
|
||||
- $(tst-tls-many-dynamic-modules-dep-bad) \
|
||||
- tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
|
||||
- tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
|
||||
- tst-absolute-zero-lib tst-big-note-lib \
|
||||
- tst-audit13mod1 tst-sonamemove-linkmod1 \
|
||||
- tst-sonamemove-runmod1 tst-sonamemove-runmod2 \
|
||||
- tst-auditmanymod1 tst-auditmanymod2 tst-auditmanymod3 \
|
||||
- tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
|
||||
- tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
|
||||
- tst-initlazyfailmod tst-finilazyfailmod \
|
||||
- tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
|
||||
- tst-dlopenfailmod3 \
|
||||
- tst-filterobj-flt tst-filterobj-aux tst-filterobj-filtee \
|
||||
- tst-auditlogmod-1 tst-auditlogmod-2 tst-auditlogmod-3 \
|
||||
- tst-tls-ie-mod0 tst-tls-ie-mod1 tst-tls-ie-mod2 \
|
||||
- tst-tls-ie-mod3 tst-tls-ie-mod4 tst-tls-ie-mod5 \
|
||||
- tst-tls-ie-mod6 libmarkermod1-1 libmarkermod1-2 libmarkermod1-3 \
|
||||
- libmarkermod2-1 libmarkermod2-2 \
|
||||
- libmarkermod3-1 libmarkermod3-2 libmarkermod3-3 \
|
||||
- libmarkermod4-1 libmarkermod4-2 libmarkermod4-3 libmarkermod4-4 \
|
||||
- libmarkermod5-1 libmarkermod5-2 libmarkermod5-3 libmarkermod5-4 \
|
||||
- libmarkermod5-5 tst-tls20mod-bad tst-tls21mod \
|
||||
- tst-dlmopen-dlerror-mod \
|
||||
- tst-dlmopen-gethostbyname-mod \
|
||||
- tst-auditmod18 \
|
||||
- tst-audit18mod \
|
||||
- tst-auditmod19a \
|
||||
- tst-auditmod19b \
|
||||
- tst-audit19bmod \
|
||||
- tst-auditmod20 \
|
||||
- tst-auditmod22 \
|
||||
+modules-names = \
|
||||
+ circlemod1 \
|
||||
+ circlemod1a \
|
||||
+ circlemod2 \
|
||||
+ circlemod2a \
|
||||
+ circlemod3 \
|
||||
+ circlemod3a \
|
||||
+ constload2 \
|
||||
+ constload3 \
|
||||
+ dblloadmod1 \
|
||||
+ dblloadmod2 \
|
||||
+ dblloadmod3 \
|
||||
+ dep1 \
|
||||
+ dep2 \
|
||||
+ dep3 \
|
||||
+ dep4 \
|
||||
+ failobj \
|
||||
+ filtmod1 \
|
||||
+ filtmod2 \
|
||||
+ firstobj \
|
||||
+ globalmod1 \
|
||||
+ libmarkermod1-1 \
|
||||
+ libmarkermod1-2 \
|
||||
+ libmarkermod1-3 \
|
||||
+ libmarkermod2-1 \
|
||||
+ libmarkermod2-2 \
|
||||
+ libmarkermod3-1 \
|
||||
+ libmarkermod3-2 \
|
||||
+ libmarkermod3-3 \
|
||||
+ libmarkermod4-1 \
|
||||
+ libmarkermod4-2 \
|
||||
+ libmarkermod4-3 \
|
||||
+ libmarkermod4-4 \
|
||||
+ libmarkermod5-1 \
|
||||
+ libmarkermod5-2 \
|
||||
+ libmarkermod5-3 \
|
||||
+ libmarkermod5-4 \
|
||||
+ libmarkermod5-5 \
|
||||
+ ltglobmod1 \
|
||||
+ ltglobmod2 \
|
||||
+ neededobj1 \
|
||||
+ neededobj2 \
|
||||
+ neededobj3 \
|
||||
+ neededobj4 \
|
||||
+ neededobj5 \
|
||||
+ neededobj6 \
|
||||
+ nextmod1 \
|
||||
+ nextmod2 \
|
||||
+ nodel2mod1 \
|
||||
+ nodel2mod2 \
|
||||
+ nodel2mod3 \
|
||||
+ nodelmod1 \
|
||||
+ nodelmod2 \
|
||||
+ nodelmod3 \
|
||||
+ nodelmod4 \
|
||||
+ nodlopenmod \
|
||||
+ nodlopenmod2 \
|
||||
+ order2mod1 \
|
||||
+ order2mod2 \
|
||||
+ order2mod3 \
|
||||
+ order2mod4 \
|
||||
+ pathoptobj \
|
||||
+ reldep4mod1 \
|
||||
+ reldep4mod2 \
|
||||
+ reldep4mod3 \
|
||||
+ reldep4mod4 \
|
||||
+ reldep6mod0 \
|
||||
+ reldep6mod1 \
|
||||
+ reldep6mod2 \
|
||||
+ reldep6mod3 \
|
||||
+ reldep6mod4 \
|
||||
+ reldep7mod1 \
|
||||
+ reldep7mod2 \
|
||||
+ reldep8mod1 \
|
||||
+ reldep8mod2 \
|
||||
+ reldep8mod3 \
|
||||
+ reldep9mod1 \
|
||||
+ reldep9mod2 \
|
||||
+ reldep9mod3 \
|
||||
+ reldepmod1 \
|
||||
+ reldepmod2 \
|
||||
+ reldepmod3 \
|
||||
+ reldepmod4 \
|
||||
+ reldepmod5 \
|
||||
+ reldepmod6 \
|
||||
+ testobj1 \
|
||||
+ testobj1_1 \
|
||||
+ testobj2 \
|
||||
+ testobj3 \
|
||||
+ testobj4 \
|
||||
+ testobj5 \
|
||||
+ testobj6 \
|
||||
+ tst-absolute-sym-lib \
|
||||
+ tst-absolute-zero-lib \
|
||||
+ tst-alignmod \
|
||||
+ tst-alignmod2 \
|
||||
+ tst-array2dep \
|
||||
+ tst-array5dep \
|
||||
+ tst-audit11mod1 \
|
||||
+ tst-audit11mod2 \
|
||||
+ tst-audit12mod1 \
|
||||
+ tst-audit12mod2 \
|
||||
+ tst-audit12mod3 \
|
||||
+ tst-audit13mod1 \
|
||||
+ tst-audit18mod \
|
||||
+ tst-audit19bmod \
|
||||
+ tst-auditlogmod-1 \
|
||||
+ tst-auditlogmod-2 \
|
||||
+ tst-auditlogmod-3 \
|
||||
+ tst-auditmanymod1 \
|
||||
+ tst-auditmanymod2 \
|
||||
+ tst-auditmanymod3 \
|
||||
+ tst-auditmanymod4 \
|
||||
+ tst-auditmanymod5 \
|
||||
+ tst-auditmanymod6 \
|
||||
+ tst-auditmanymod7 \
|
||||
+ tst-auditmanymod8 \
|
||||
+ tst-auditmanymod9 \
|
||||
+ tst-auditmod1 \
|
||||
+ tst-auditmod9a \
|
||||
+ tst-auditmod9b \
|
||||
+ tst-auditmod11 \
|
||||
+ tst-auditmod12 \
|
||||
+ tst-auditmod18 \
|
||||
+ tst-auditmod19a \
|
||||
+ tst-auditmod19b \
|
||||
+ tst-auditmod20 \
|
||||
+ tst-auditmod22 \
|
||||
+ tst-big-note-lib \
|
||||
+ tst-deep1mod1 \
|
||||
+ tst-deep1mod2 \
|
||||
+ tst-deep1mod3 \
|
||||
+ tst-dlmopen1mod \
|
||||
+ tst-dlmopen-dlerror-mod \
|
||||
+ tst-dlmopen-gethostbyname-mod \
|
||||
+ tst-dlopenfaillinkmod \
|
||||
+ tst-dlopenfailmod1 \
|
||||
+ tst-dlopenfailmod2 \
|
||||
+ tst-dlopenfailmod3 \
|
||||
+ tst-dlopenrpathmod \
|
||||
+ tst-filterobj-aux \
|
||||
+ tst-filterobj-filtee \
|
||||
+ tst-filterobj-flt \
|
||||
+ tst-finilazyfailmod \
|
||||
+ tst-initlazyfailmod \
|
||||
+ tst-initorder2a \
|
||||
+ tst-initorder2b \
|
||||
+ tst-initorder2c \
|
||||
+ tst-initorder2d \
|
||||
+ tst-initordera1 \
|
||||
+ tst-initordera2 \
|
||||
+ tst-initordera3 \
|
||||
+ tst-initordera4 \
|
||||
+ tst-initorderb1 \
|
||||
+ tst-initorderb2 \
|
||||
+ tst-latepthreadmod \
|
||||
+ tst-libc_dlvsym-dso \
|
||||
+ tst-main1mod \
|
||||
+ tst-nodelete2mod \
|
||||
+ tst-nodelete-dlclose-dso \
|
||||
+ tst-nodelete-dlclose-plugin \
|
||||
+ tst-nodelete-opened-lib \
|
||||
+ tst-null-argv-lib \
|
||||
+ tst-relsort1mod1 \
|
||||
+ tst-relsort1mod2 \
|
||||
+ tst-sonamemove-linkmod1 \
|
||||
+ tst-sonamemove-runmod1 \
|
||||
+ tst-sonamemove-runmod2 \
|
||||
+ tst-tls19mod1 \
|
||||
+ tst-tls19mod2 \
|
||||
+ tst-tls19mod3 \
|
||||
+ tst-tls20mod-bad \
|
||||
+ tst-tls21mod \
|
||||
+ tst-tlsalign-lib \
|
||||
+ tst-tls-ie-mod0 \
|
||||
+ tst-tls-ie-mod1 \
|
||||
+ tst-tls-ie-mod2 \
|
||||
+ tst-tls-ie-mod3 \
|
||||
+ tst-tls-ie-mod4 \
|
||||
+ tst-tls-ie-mod5 \
|
||||
+ tst-tls-ie-mod6 \
|
||||
+ tst-tlsmod1 \
|
||||
+ tst-tlsmod10 \
|
||||
+ tst-tlsmod11 \
|
||||
+ tst-tlsmod12 \
|
||||
+ tst-tlsmod13 \
|
||||
+ tst-tlsmod13a \
|
||||
+ tst-tlsmod14a \
|
||||
+ tst-tlsmod14b \
|
||||
+ tst-tlsmod15a \
|
||||
+ tst-tlsmod15b \
|
||||
+ tst-tlsmod16a \
|
||||
+ tst-tlsmod16b \
|
||||
+ tst-tlsmod17b \
|
||||
+ tst-tlsmod2 \
|
||||
+ tst-tlsmod3 \
|
||||
+ tst-tlsmod4 \
|
||||
+ tst-tlsmod5 \
|
||||
+ tst-tlsmod6 \
|
||||
+ tst-tlsmod7 \
|
||||
+ tst-tlsmod8 \
|
||||
+ tst-tlsmod9 \
|
||||
+ tst-unique1mod1 \
|
||||
+ tst-unique1mod2 \
|
||||
+ tst-unique2mod1 \
|
||||
+ tst-unique2mod2 \
|
||||
+ unload2dep \
|
||||
+ unload2mod \
|
||||
+ unload3mod1 \
|
||||
+ unload3mod2 \
|
||||
+ unload3mod3 \
|
||||
+ unload3mod4 \
|
||||
+ unload4mod1 \
|
||||
+ unload4mod2 \
|
||||
+ unload4mod3 \
|
||||
+ unload4mod4 \
|
||||
+ unload6mod1 \
|
||||
+ unload6mod2 \
|
||||
+ unload6mod3 \
|
||||
+ unload7mod1 \
|
||||
+ unload7mod2 \
|
||||
+ unload8mod1 \
|
||||
+ unload8mod1x \
|
||||
+ unload8mod2 \
|
||||
+ unload8mod3 \
|
||||
+ unloadmod \
|
||||
+ vismod1 \
|
||||
+ vismod2 \
|
||||
+ vismod3 \
|
||||
+
|
||||
+modules-names-cxx = \
|
||||
+ tst-dlopen-nodelete-reloc-mod1 \
|
||||
+ tst-dlopen-nodelete-reloc-mod10 \
|
||||
+ tst-dlopen-nodelete-reloc-mod11 \
|
||||
+ tst-dlopen-nodelete-reloc-mod12 \
|
||||
+ tst-dlopen-nodelete-reloc-mod13 \
|
||||
+ tst-dlopen-nodelete-reloc-mod14 \
|
||||
+ tst-dlopen-nodelete-reloc-mod15 \
|
||||
+ tst-dlopen-nodelete-reloc-mod16 \
|
||||
+ tst-dlopen-nodelete-reloc-mod17 \
|
||||
+ tst-dlopen-nodelete-reloc-mod2 \
|
||||
+ tst-dlopen-nodelete-reloc-mod3 \
|
||||
+ tst-dlopen-nodelete-reloc-mod4 \
|
||||
+ tst-dlopen-nodelete-reloc-mod5 \
|
||||
+ tst-dlopen-nodelete-reloc-mod6 \
|
||||
+ tst-dlopen-nodelete-reloc-mod7 \
|
||||
+ tst-dlopen-nodelete-reloc-mod8 \
|
||||
+ tst-dlopen-nodelete-reloc-mod9 \
|
||||
+ tst-nodelete-rtldmod \
|
||||
+ tst-nodelete-uniquemod \
|
||||
+ tst-nodelete-zmod \
|
||||
+ tst-unique3lib \
|
||||
+ tst-unique3lib2 \
|
||||
+ tst-unique4lib \
|
||||
+
|
||||
+modules-names += \
|
||||
+ $(if $(CXX),$(modules-names-cxx)) \
|
||||
+ $(modules-execstack-$(have-z-execstack)) \
|
||||
+ $(tst-tls-many-dynamic-modules) \
|
||||
+ $(tst-tls-many-dynamic-modules-dep) \
|
||||
+ $(tst-tls-many-dynamic-modules-dep-bad) \
|
||||
+ $(tlsmod17a-modules) \
|
||||
+ $(tlsmod18a-modules) \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
77
SOURCES/glibc-rh2047981-28.patch
Normal file
77
SOURCES/glibc-rh2047981-28.patch
Normal file
@ -0,0 +1,77 @@
|
||||
commit bfb5ed5df3dd4d9507b4922248dc445b690d19c0
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Fri Oct 15 10:44:49 2021 -0700
|
||||
|
||||
elf: Also try DT_RUNPATH for LD_AUDIT dlopen [BZ #28455]
|
||||
|
||||
DT_RUNPATH is only used to find the immediate dependencies of the
|
||||
executable or shared object containing the DT_RUNPATH entry. Update
|
||||
LD_AUDIT dlopen call to try the DT_RUNPATH entry of the executable.
|
||||
|
||||
Add tst-audit14a, which is copied from tst-audit14, to DT_RUNPATH and
|
||||
build tst-audit14 with -Wl,--disable-new-dtags to test DT_RPATH.
|
||||
|
||||
This partially fixes BZ #28455.
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
Rewrite test inclusion to use older stdout pattern.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 914cb5ad2f2c3aea..4ec4e9a049156755 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -227,6 +227,7 @@ tests += \
|
||||
tst-audit12 \
|
||||
tst-audit13 \
|
||||
tst-audit14 \
|
||||
+ tst-audit14a \
|
||||
tst-audit15 \
|
||||
tst-audit16 \
|
||||
tst-audit17 \
|
||||
@@ -1788,9 +1789,11 @@ $(objpfx)tst-auditmany.out: $(objpfx)tst-auditmanymod1.so \
|
||||
tst-auditmany-ENV = \
|
||||
LD_AUDIT=tst-auditmanymod1.so:tst-auditmanymod2.so:tst-auditmanymod3.so:tst-auditmanymod4.so:tst-auditmanymod5.so:tst-auditmanymod6.so:tst-auditmanymod7.so:tst-auditmanymod8.so:tst-auditmanymod9.so
|
||||
|
||||
-LDFLAGS-tst-audit14 = -Wl,--audit=tst-auditlogmod-1.so
|
||||
+LDFLAGS-tst-audit14 = -Wl,--audit=tst-auditlogmod-1.so,--disable-new-dtags
|
||||
$(objpfx)tst-auditlogmod-1.so: $(libsupport)
|
||||
$(objpfx)tst-audit14.out: $(objpfx)tst-auditlogmod-1.so
|
||||
+LDFLAGS-tst-audit14a = -Wl,--audit=tst-auditlogmod-1.so,--enable-new-dtags
|
||||
+$(objpfx)tst-audit14a.out: $(objpfx)tst-auditlogmod-1.so
|
||||
LDFLAGS-tst-audit15 = \
|
||||
-Wl,--audit=tst-auditlogmod-1.so,--depaudit=tst-auditlogmod-2.so
|
||||
$(objpfx)tst-auditlogmod-2.so: $(libsupport)
|
||||
diff --git a/elf/dl-load.c b/elf/dl-load.c
|
||||
index 1613217a236c7fc3..0b45e6e3db31c70d 100644
|
||||
--- a/elf/dl-load.c
|
||||
+++ b/elf/dl-load.c
|
||||
@@ -2042,6 +2042,21 @@ _dl_map_object (struct link_map *loader, const char *name,
|
||||
&main_map->l_rpath_dirs,
|
||||
&realname, &fb, loader ?: main_map, LA_SER_RUNPATH,
|
||||
&found_other_class);
|
||||
+
|
||||
+ /* Also try DT_RUNPATH in the executable for LD_AUDIT dlopen
|
||||
+ call. */
|
||||
+ if (__glibc_unlikely (mode & __RTLD_AUDIT)
|
||||
+ && fd == -1 && !did_main_map
|
||||
+ && main_map != NULL && main_map->l_type != lt_loaded)
|
||||
+ {
|
||||
+ struct r_search_path_struct l_rpath_dirs;
|
||||
+ l_rpath_dirs.dirs = NULL;
|
||||
+ if (cache_rpath (main_map, &l_rpath_dirs,
|
||||
+ DT_RUNPATH, "RUNPATH"))
|
||||
+ fd = open_path (name, namelen, mode, &l_rpath_dirs,
|
||||
+ &realname, &fb, loader ?: main_map,
|
||||
+ LA_SER_RUNPATH, &found_other_class);
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Try the LD_LIBRARY_PATH environment variable. */
|
||||
diff --git a/elf/tst-audit14a.c b/elf/tst-audit14a.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..c6232eacf2946e4e
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit14a.c
|
||||
@@ -0,0 +1 @@
|
||||
+#include "tst-audit14.c"
|
42
SOURCES/glibc-rh2047981-29.patch
Normal file
42
SOURCES/glibc-rh2047981-29.patch
Normal file
@ -0,0 +1,42 @@
|
||||
commit f4f70c2895e3d325188a42c10eb7bb4335be6773
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Tue Jan 4 06:58:34 2022 -0800
|
||||
|
||||
elf: Add a comment after trailing backslashes
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 4ec4e9a049156755..53faca4585220048 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -308,6 +308,7 @@ tests-cxx = \
|
||||
tst-nodelete \
|
||||
tst-unique3 \
|
||||
tst-unique4 \
|
||||
+# tests-cxx
|
||||
|
||||
tests += $(if $(CXX),$(tests-cxx))
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
@@ -580,6 +581,7 @@ modules-names = \
|
||||
vismod1 \
|
||||
vismod2 \
|
||||
vismod3 \
|
||||
+# modules-names
|
||||
|
||||
modules-names-cxx = \
|
||||
tst-dlopen-nodelete-reloc-mod1 \
|
||||
@@ -605,6 +607,7 @@ modules-names-cxx = \
|
||||
tst-unique3lib \
|
||||
tst-unique3lib2 \
|
||||
tst-unique4lib \
|
||||
+# modules-names-cxx
|
||||
|
||||
modules-names += \
|
||||
$(if $(CXX),$(modules-names-cxx)) \
|
||||
@@ -614,6 +617,7 @@ modules-names += \
|
||||
$(tst-tls-many-dynamic-modules-dep-bad) \
|
||||
$(tlsmod17a-modules) \
|
||||
$(tlsmod18a-modules) \
|
||||
+# modules-names
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
245
SOURCES/glibc-rh2047981-3.patch
Normal file
245
SOURCES/glibc-rh2047981-3.patch
Normal file
@ -0,0 +1,245 @@
|
||||
commit 8dbb7a08ec52057819db4ee234f9429ab99eb4ae
|
||||
Author: Vineet Gupta <vgupta@synopsys.com>
|
||||
Date: Wed May 27 12:54:21 2020 -0700
|
||||
|
||||
dl-runtime: reloc_{offset,index} now functions arch overide'able
|
||||
|
||||
The existing macros are fragile and expect local variables with a
|
||||
certain name. Fix this by defining them as functions with default
|
||||
implementation in a new header dl-runtime.h which arches can override
|
||||
if need be.
|
||||
|
||||
This came up during ARC port review, hence the need for argument pltgot
|
||||
in reloc_index() which is not needed by existing ports.
|
||||
|
||||
This patch potentially only affects hppa/x86 ports,
|
||||
build tested for both those configs and a few more.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c
|
||||
index 72b03e000dcf190e..4ccd7c30678fafad 100644
|
||||
--- a/elf/dl-runtime.c
|
||||
+++ b/elf/dl-runtime.c
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "dynamic-link.h"
|
||||
#include <tls.h>
|
||||
#include <dl-irel.h>
|
||||
+#include <dl-runtime.h>
|
||||
|
||||
|
||||
#if (!ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \
|
||||
@@ -42,13 +43,6 @@
|
||||
# define ARCH_FIXUP_ATTRIBUTE
|
||||
#endif
|
||||
|
||||
-#ifndef reloc_offset
|
||||
-# define reloc_offset reloc_arg
|
||||
-# define reloc_index reloc_arg / sizeof (PLTREL)
|
||||
-#endif
|
||||
-
|
||||
-
|
||||
-
|
||||
/* This function is called through a special trampoline from the PLT the
|
||||
first time each PLT entry is called. We must perform the relocation
|
||||
specified in the PLT of the given shared object, and return the resolved
|
||||
@@ -68,8 +62,11 @@ _dl_fixup (
|
||||
= (const void *) D_PTR (l, l_info[DT_SYMTAB]);
|
||||
const char *strtab = (const void *) D_PTR (l, l_info[DT_STRTAB]);
|
||||
|
||||
+ const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
+
|
||||
const PLTREL *const reloc
|
||||
- = (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);
|
||||
+ = (const void *) (D_PTR (l, l_info[DT_JMPREL])
|
||||
+ + reloc_offset (pltgot, reloc_arg));
|
||||
const ElfW(Sym) *sym = &symtab[ELFW(R_SYM) (reloc->r_info)];
|
||||
const ElfW(Sym) *refsym = sym;
|
||||
void *const rel_addr = (void *)(l->l_addr + reloc->r_offset);
|
||||
@@ -180,9 +177,12 @@ _dl_profile_fixup (
|
||||
l, reloc_arg);
|
||||
}
|
||||
|
||||
+ const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
+
|
||||
/* This is the address in the array where we store the result of previous
|
||||
relocations. */
|
||||
- struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index];
|
||||
+ struct reloc_result *reloc_result
|
||||
+ = &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
|
||||
|
||||
/* CONCURRENCY NOTES:
|
||||
|
||||
@@ -219,8 +219,11 @@ _dl_profile_fixup (
|
||||
= (const void *) D_PTR (l, l_info[DT_SYMTAB]);
|
||||
const char *strtab = (const char *) D_PTR (l, l_info[DT_STRTAB]);
|
||||
|
||||
+ const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
+
|
||||
const PLTREL *const reloc
|
||||
- = (const void *) (D_PTR (l, l_info[DT_JMPREL]) + reloc_offset);
|
||||
+ = (const void *) (D_PTR (l, l_info[DT_JMPREL])
|
||||
+ + reloc_offset (pltgot, reloc_arg));
|
||||
const ElfW(Sym) *refsym = &symtab[ELFW(R_SYM) (reloc->r_info)];
|
||||
const ElfW(Sym) *defsym = refsym;
|
||||
lookup_t result;
|
||||
@@ -485,11 +488,14 @@ _dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg,
|
||||
const void *inregs, void *outregs)
|
||||
{
|
||||
#ifdef SHARED
|
||||
+ const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]);
|
||||
+
|
||||
/* This is the address in the array where we store the result of previous
|
||||
relocations. */
|
||||
// XXX Maybe the bound information must be stored on the stack since
|
||||
// XXX with bind_not a new value could have been stored in the meantime.
|
||||
- struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index];
|
||||
+ struct reloc_result *reloc_result =
|
||||
+ &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))];
|
||||
ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound,
|
||||
l_info[DT_SYMTAB])
|
||||
+ reloc_result->boundndx);
|
||||
diff --git a/elf/dl-runtime.h b/elf/dl-runtime.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..78f1da77fb4ed905
|
||||
--- /dev/null
|
||||
+++ b/elf/dl-runtime.h
|
||||
@@ -0,0 +1,30 @@
|
||||
+/* Helpers for On-demand PLT fixup for shared objects. Generic version.
|
||||
+ Copyright (C) 2020 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, write to the Free
|
||||
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
+ 02111-1307 USA. */
|
||||
+
|
||||
+static inline uintptr_t
|
||||
+reloc_offset (uintptr_t plt0, uintptr_t pltn)
|
||||
+{
|
||||
+ return pltn;
|
||||
+}
|
||||
+
|
||||
+static inline uintptr_t
|
||||
+reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)
|
||||
+{
|
||||
+ return pltn / size;
|
||||
+}
|
||||
diff --git a/sysdeps/hppa/dl-runtime.c b/sysdeps/hppa/dl-runtime.c
|
||||
index 885a3f1837cbc56d..2d061b150f0602c1 100644
|
||||
--- a/sysdeps/hppa/dl-runtime.c
|
||||
+++ b/sysdeps/hppa/dl-runtime.c
|
||||
@@ -17,10 +17,6 @@
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
-/* Clear PA_GP_RELOC bit in relocation offset. */
|
||||
-#define reloc_offset (reloc_arg & ~PA_GP_RELOC)
|
||||
-#define reloc_index (reloc_arg & ~PA_GP_RELOC) / sizeof (PLTREL)
|
||||
-
|
||||
#include <elf/dl-runtime.c>
|
||||
|
||||
/* The caller has encountered a partially relocated function descriptor.
|
||||
diff --git a/sysdeps/hppa/dl-runtime.h b/sysdeps/hppa/dl-runtime.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..6983aa0ae9b4296c
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/hppa/dl-runtime.h
|
||||
@@ -0,0 +1,31 @@
|
||||
+/* Helpers for On-demand PLT fixup for shared objects. HPAA version.
|
||||
+ Copyright (C) 2020 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, write to the Free
|
||||
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
+ 02111-1307 USA. */
|
||||
+
|
||||
+/* Clear PA_GP_RELOC bit in relocation offset. */
|
||||
+static inline uintptr_t
|
||||
+reloc_offset (uintptr_t plt0, uintptr_t pltn)
|
||||
+{
|
||||
+ return pltn & ~PA_GP_RELOC;
|
||||
+}
|
||||
+
|
||||
+static inline uintptr_t
|
||||
+reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)
|
||||
+{
|
||||
+ return (pltn & ~PA_GP_RELOC )/ size;
|
||||
+}
|
||||
diff --git a/sysdeps/x86_64/dl-runtime.c b/sysdeps/x86_64/dl-runtime.c
|
||||
deleted file mode 100644
|
||||
index b625d1e88257b018..0000000000000000
|
||||
--- a/sysdeps/x86_64/dl-runtime.c
|
||||
+++ /dev/null
|
||||
@@ -1,9 +0,0 @@
|
||||
-/* The ABI calls for the PLT stubs to pass the index of the relocation
|
||||
- and not its offset. In _dl_profile_fixup and _dl_call_pltexit we
|
||||
- also use the index. Therefore it is wasteful to compute the offset
|
||||
- in the trampoline just to reverse the operation immediately
|
||||
- afterwards. */
|
||||
-#define reloc_offset reloc_arg * sizeof (PLTREL)
|
||||
-#define reloc_index reloc_arg
|
||||
-
|
||||
-#include <elf/dl-runtime.c>
|
||||
diff --git a/sysdeps/x86_64/dl-runtime.h b/sysdeps/x86_64/dl-runtime.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..3fa61d7a4697cf3f
|
||||
--- /dev/null
|
||||
+++ b/sysdeps/x86_64/dl-runtime.h
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* Helpers for On-demand PLT fixup for shared objects. x86_64 version.
|
||||
+ Copyright (C) 2020 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, write to the Free
|
||||
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
+ 02111-1307 USA. */
|
||||
+
|
||||
+/* The ABI calls for the PLT stubs to pass the index of the relocation
|
||||
+ and not its offset. In _dl_profile_fixup and _dl_call_pltexit we
|
||||
+ also use the index. Therefore it is wasteful to compute the offset
|
||||
+ in the trampoline just to reverse the operation immediately
|
||||
+ afterwards. */
|
||||
+static inline uintptr_t
|
||||
+reloc_offset (uintptr_t plt0, uintptr_t pltn)
|
||||
+{
|
||||
+ return pltn * sizeof (ElfW(Rela));
|
||||
+}
|
||||
+
|
||||
+static inline uintptr_t
|
||||
+reloc_index (uintptr_t plt0, uintptr_t pltn, size_t size)
|
||||
+{
|
||||
+ return pltn;
|
||||
+}
|
520
SOURCES/glibc-rh2047981-30.patch
Normal file
520
SOURCES/glibc-rh2047981-30.patch
Normal file
@ -0,0 +1,520 @@
|
||||
commit 7de01e60c200c431d3469deb784da8fd4508fc15
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri Jan 14 20:16:05 2022 +0100
|
||||
|
||||
elf/Makefile: Reflow and sort most variable assignments
|
||||
|
||||
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
Complete rewrite of reflow.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 53faca4585220048..954cd08c199f5037 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -21,20 +21,60 @@ subdir := elf
|
||||
|
||||
include ../Makeconfig
|
||||
|
||||
-headers = elf.h bits/elfclass.h link.h bits/link.h bits/link_lavcurrent.h
|
||||
-routines = $(all-dl-routines) dl-support dl-iteratephdr \
|
||||
- dl-addr dl-addr-obj enbl-secure dl-profstub \
|
||||
- dl-origin dl-libc dl-sym dl-sysdep dl-error \
|
||||
- dl-reloc-static-pie libc_early_init
|
||||
+headers = \
|
||||
+ bits/elfclass.h \
|
||||
+ bits/link.h \
|
||||
+ bits/link_lavcurrent.h \
|
||||
+ elf.h \
|
||||
+ link.h \
|
||||
+ # headers
|
||||
+
|
||||
+routines = \
|
||||
+ $(all-dl-routines) \
|
||||
+ dl-addr \
|
||||
+ dl-addr-obj \
|
||||
+ dl-error \
|
||||
+ dl-iteratephdr \
|
||||
+ dl-libc \
|
||||
+ dl-origin \
|
||||
+ dl-profstub \
|
||||
+ dl-reloc-static-pie \
|
||||
+ dl-support \
|
||||
+ dl-sym \
|
||||
+ dl-sysdep \
|
||||
+ enbl-secure \
|
||||
+ libc_early_init \
|
||||
+ # routines
|
||||
|
||||
# The core dynamic linking functions are in libc for the static and
|
||||
# profiled libraries.
|
||||
-dl-routines = $(addprefix dl-,load lookup object reloc deps \
|
||||
- runtime init fini debug misc \
|
||||
- version profile tls origin scope \
|
||||
- execstack open close trampoline \
|
||||
- exception sort-maps lookup-direct \
|
||||
- call-libc-early-init write)
|
||||
+dl-routines = \
|
||||
+ dl-call-libc-early-init \
|
||||
+ dl-close \
|
||||
+ dl-debug \
|
||||
+ dl-deps \
|
||||
+ dl-exception \
|
||||
+ dl-execstack \
|
||||
+ dl-fini \
|
||||
+ dl-init \
|
||||
+ dl-load \
|
||||
+ dl-lookup \
|
||||
+ dl-lookup-direct \
|
||||
+ dl-misc \
|
||||
+ dl-object \
|
||||
+ dl-open \
|
||||
+ dl-origin \
|
||||
+ dl-profile \
|
||||
+ dl-reloc \
|
||||
+ dl-runtime \
|
||||
+ dl-scope \
|
||||
+ dl-sort-maps \
|
||||
+ dl-tls \
|
||||
+ dl-trampoline \
|
||||
+ dl-version \
|
||||
+ dl-write \
|
||||
+ # dl-routines
|
||||
+
|
||||
ifeq (yes,$(use-ldconfig))
|
||||
dl-routines += dl-cache
|
||||
endif
|
||||
@@ -57,15 +97,36 @@ endif
|
||||
|
||||
all-dl-routines = $(dl-routines) $(sysdep-dl-routines)
|
||||
# But they are absent from the shared libc, because that code is in ld.so.
|
||||
-elide-routines.os = $(all-dl-routines) dl-support enbl-secure dl-origin \
|
||||
- dl-sysdep dl-exception dl-reloc-static-pie
|
||||
+elide-routines.os = \
|
||||
+ $(all-dl-routines) \
|
||||
+ dl-exception \
|
||||
+ dl-origin \
|
||||
+ dl-reloc-static-pie \
|
||||
+ dl-support \
|
||||
+ dl-sysdep \
|
||||
+ enbl-secure \
|
||||
+ # elide-routines.os
|
||||
|
||||
# ld.so uses those routines, plus some special stuff for being the program
|
||||
# interpreter and operating independent of libc.
|
||||
-rtld-routines = rtld $(all-dl-routines) dl-sysdep dl-environ dl-minimal \
|
||||
- dl-error-minimal dl-conflict dl-hwcaps dl-hwcaps_split dl-hwcaps-subdirs \
|
||||
- dl-usage dl-diagnostics dl-diagnostics-kernel dl-diagnostics-cpu \
|
||||
- dl-audit
|
||||
+rtld-routines = \
|
||||
+ $(all-dl-routines) \
|
||||
+ dl-audit \
|
||||
+ dl-conflict \
|
||||
+ dl-diagnostics \
|
||||
+ dl-diagnostics-cpu \
|
||||
+ dl-diagnostics-kernel \
|
||||
+ dl-environ \
|
||||
+ dl-error-minimal \
|
||||
+ dl-hwcaps \
|
||||
+ dl-hwcaps-subdirs \
|
||||
+ dl-hwcaps_split \
|
||||
+ dl-minimal \
|
||||
+ dl-sysdep \
|
||||
+ dl-usage \
|
||||
+ rtld \
|
||||
+ # rtld-routines
|
||||
+
|
||||
all-rtld-routines = $(rtld-routines) $(sysdep-rtld-routines)
|
||||
|
||||
CFLAGS-dl-runtime.c += -fexceptions -fasynchronous-unwind-tables
|
||||
@@ -98,8 +159,18 @@ ld-map = $(common-objpfx)ld.map
|
||||
endif
|
||||
|
||||
ifeq (yes,$(build-shared))
|
||||
-extra-objs = $(all-rtld-routines:%=%.os) soinit.os sofini.os interp.os
|
||||
-generated += librtld.os dl-allobjs.os ld.so ldd
|
||||
+extra-objs = \
|
||||
+ $(all-rtld-routines:%=%.os) \
|
||||
+ sofini.os \
|
||||
+ soinit.os \
|
||||
+ interp.os \
|
||||
+ # extra-objs
|
||||
+generated += \
|
||||
+ dl-allobjs.os \
|
||||
+ ldd \
|
||||
+ ld.so \
|
||||
+ librtld.os \
|
||||
+ # generated
|
||||
install-others = $(inst_rtlddir)/$(rtld-installed-name) $(inst_bindir)/ld.so
|
||||
install-bin-script = ldd
|
||||
endif
|
||||
@@ -117,8 +188,15 @@ others-static += ldconfig
|
||||
others += ldconfig
|
||||
install-rootsbin += ldconfig
|
||||
|
||||
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs \
|
||||
- stringtable
|
||||
+ldconfig-modules := \
|
||||
+ cache \
|
||||
+ chroot_canon \
|
||||
+ readlib \
|
||||
+ static-stubs \
|
||||
+ stringtable \
|
||||
+ xmalloc \
|
||||
+ xstrdup \
|
||||
+ # ldconfig-modules
|
||||
extra-objs += $(ldconfig-modules:=.o)
|
||||
others-extras = $(ldconfig-modules)
|
||||
endif
|
||||
@@ -153,20 +231,34 @@ $(inst_auditdir)/sotruss-lib.so: $(objpfx)sotruss-lib.so $(+force)
|
||||
$(do-install-program)
|
||||
endif
|
||||
|
||||
-tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \
|
||||
- tst-dl-iter-static \
|
||||
- tst-tlsalign-static tst-tlsalign-extern-static \
|
||||
- tst-linkall-static tst-env-setuid tst-env-setuid-tunables \
|
||||
- tst-dst-static
|
||||
-tests-static-internal := tst-tls1-static tst-tls2-static \
|
||||
- tst-ptrguard1-static tst-stackguard1-static \
|
||||
- tst-tls1-static-non-pie tst-libc_dlvsym-static
|
||||
+tests-static-normal := \
|
||||
+ tst-array1-static \
|
||||
+ tst-array5-static \
|
||||
+ tst-dl-iter-static \
|
||||
+ tst-dst-static \
|
||||
+ tst-env-setuid \
|
||||
+ tst-env-setuid-tunables \
|
||||
+ tst-leaks1-static \
|
||||
+ tst-linkall-static \
|
||||
+ tst-tlsalign-extern-static \
|
||||
+ tst-tlsalign-static \
|
||||
+ # tests-static-normal
|
||||
+
|
||||
+tests-static-internal := \
|
||||
+ tst-libc_dlvsym-static \
|
||||
+ tst-ptrguard1-static \
|
||||
+ tst-stackguard1-static \
|
||||
+ tst-tls1-static \
|
||||
+ tst-tls1-static-non-pie \
|
||||
+ tst-tls2-static \
|
||||
+ # tests-static-internal
|
||||
|
||||
CRT-tst-tls1-static-non-pie := $(csu-objpfx)crt1.o
|
||||
tst-tls1-static-non-pie-no-pie = yes
|
||||
|
||||
tests-container = \
|
||||
- tst-ldconfig-bad-aux-cache
|
||||
+ tst-ldconfig-bad-aux-cache \
|
||||
+ # tests-container
|
||||
|
||||
ifeq (no,$(build-hardcoded-path-in-tests))
|
||||
# This is an ld.so.cache test, and RPATH/RUNPATH in the executable
|
||||
@@ -174,14 +266,31 @@ ifeq (no,$(build-hardcoded-path-in-tests))
|
||||
tests-container += tst-glibc-hwcaps-prepend-cache
|
||||
endif
|
||||
|
||||
-tests := tst-tls9 tst-leaks1 \
|
||||
- tst-array1 tst-array2 tst-array3 tst-array4 tst-array5 \
|
||||
- tst-auxv tst-stringtable
|
||||
-tests-internal := tst-tls1 tst-tls2 $(tests-static-internal)
|
||||
+tests := \
|
||||
+ tst-array1 \
|
||||
+ tst-array2 \
|
||||
+ tst-array3 \
|
||||
+ tst-array4 \
|
||||
+ tst-array5 \
|
||||
+ tst-auxv \
|
||||
+ tst-leaks1 \
|
||||
+ tst-stringtable \
|
||||
+ tst-tls9 \
|
||||
+ # tests
|
||||
+
|
||||
+tests-internal := \
|
||||
+ $(tests-static-internal) \
|
||||
+ tst-tls1 \
|
||||
+ tst-tls2 \
|
||||
+ # tests-internal
|
||||
+
|
||||
tests-static := $(tests-static-normal) $(tests-static-internal)
|
||||
|
||||
ifeq (yes,$(build-shared))
|
||||
-tests-static += tst-tls9-static
|
||||
+tests-static += \
|
||||
+ tst-tls9-static \
|
||||
+ # tests-static
|
||||
+
|
||||
tst-tls9-static-ENV = \
|
||||
LD_LIBRARY_PATH=$(objpfx):$(common-objpfx):$(common-objpfx)dlfcn
|
||||
|
||||
@@ -302,37 +411,71 @@ tests += \
|
||||
unload6 \
|
||||
unload7 \
|
||||
unload8 \
|
||||
-# reldep9
|
||||
+ # tests
|
||||
tests-cxx = \
|
||||
tst-dlopen-nodelete-reloc \
|
||||
tst-nodelete \
|
||||
tst-unique3 \
|
||||
tst-unique4 \
|
||||
-# tests-cxx
|
||||
+ # tests-cxx
|
||||
|
||||
tests += $(if $(CXX),$(tests-cxx))
|
||||
-tests-internal += loadtest unload unload2 circleload1 \
|
||||
- neededtest neededtest2 neededtest3 neededtest4 \
|
||||
- tst-tls3 tst-tls6 tst-tls7 tst-tls8 tst-dlmopen2 \
|
||||
- tst-ptrguard1 tst-stackguard1 tst-libc_dlvsym \
|
||||
- tst-create_format1 tst-tls-surplus tst-dl-hwcaps_split \
|
||||
- tst-audit19a
|
||||
-tests-container += tst-pldd tst-preload-pthread-libc
|
||||
+
|
||||
+tests-internal += \
|
||||
+ circleload1 \
|
||||
+ loadtest \
|
||||
+ neededtest \
|
||||
+ neededtest2 \
|
||||
+ neededtest3 \
|
||||
+ neededtest4 \
|
||||
+ tst-audit19a \
|
||||
+ tst-create_format1 \
|
||||
+ tst-dl-hwcaps_split \
|
||||
+ tst-dlmopen2 \
|
||||
+ tst-libc_dlvsym \
|
||||
+ tst-ptrguard1 \
|
||||
+ tst-stackguard1 \
|
||||
+ tst-tls-surplus \
|
||||
+ tst-tls3 \
|
||||
+ tst-tls6 \
|
||||
+ tst-tls7 \
|
||||
+ tst-tls8 \
|
||||
+ unload \
|
||||
+ unload2 \
|
||||
+ # tests-internal
|
||||
+
|
||||
+tests-container += \
|
||||
+ tst-pldd \
|
||||
+ tst-preload-pthread-libc
|
||||
+ # tests-container
|
||||
+
|
||||
ifeq ($(build-hardcoded-path-in-tests),yes)
|
||||
tests += tst-dlopen-aout
|
||||
tst-dlopen-aout-no-pie = yes
|
||||
endif
|
||||
-test-srcs = tst-pathopt
|
||||
+test-srcs = \
|
||||
+ tst-pathopt
|
||||
+ # tests-srcs
|
||||
+
|
||||
selinux-enabled := $(shell cat /selinux/enforce 2> /dev/null)
|
||||
+
|
||||
ifneq ($(selinux-enabled),1)
|
||||
-tests-execstack-yes = tst-execstack tst-execstack-needed tst-execstack-prog
|
||||
+tests-execstack-yes = \
|
||||
+ tst-execstack \
|
||||
+ tst-execstack-needed \
|
||||
+ tst-execstack-prog \
|
||||
+ # tests-execstack-yes
|
||||
endif
|
||||
endif
|
||||
tests += $(tests-execstack-$(have-z-execstack))
|
||||
ifeq ($(run-built-tests),yes)
|
||||
-tests-special += $(objpfx)tst-leaks1-mem.out \
|
||||
- $(objpfx)tst-leaks1-static-mem.out $(objpfx)noload-mem.out \
|
||||
- $(objpfx)tst-ldconfig-X.out $(objpfx)tst-rtld-help.out
|
||||
+tests-special += \
|
||||
+ $(objpfx)noload-mem.out \
|
||||
+ $(objpfx)tst-ldconfig-X.out \
|
||||
+ $(objpfx)tst-leaks1-mem.out \
|
||||
+ $(objpfx)tst-leaks1-static-mem.out \
|
||||
+ $(objpfx)tst-rtld-help.out \
|
||||
+ # tests-special
|
||||
endif
|
||||
tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||
tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||
@@ -349,9 +492,16 @@ tst-tls-many-dynamic-modules-dep = \
|
||||
tst-tls-many-dynamic-modules-dep-bad-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
||||
tst-tls-many-dynamic-modules-dep-bad = \
|
||||
$(foreach n,$(tst-tls-many-dynamic-modules-dep-bad-suffixes),tst-tls-manydynamic$(n)mod-dep-bad)
|
||||
-extra-test-objs += $(tlsmod17a-modules:=.os) $(tlsmod18a-modules:=.os) \
|
||||
- tst-tlsalign-vars.o
|
||||
-test-extras += tst-tlsmod17a tst-tlsmod18a tst-tlsalign-vars
|
||||
+extra-test-objs += \
|
||||
+ $(tlsmod17a-modules:=.os) \
|
||||
+ $(tlsmod18a-modules:=.os) \
|
||||
+ tst-tlsalign-vars.o \
|
||||
+ # extra-test-objs
|
||||
+test-extras += \
|
||||
+ tst-tlsalign-vars \
|
||||
+ tst-tlsmod17a \
|
||||
+ tst-tlsmod18a \
|
||||
+ # test-extras
|
||||
modules-names = \
|
||||
circlemod1 \
|
||||
circlemod1a \
|
||||
@@ -607,17 +757,17 @@ modules-names-cxx = \
|
||||
tst-unique3lib \
|
||||
tst-unique3lib2 \
|
||||
tst-unique4lib \
|
||||
-# modules-names-cxx
|
||||
+ # modules-names-cxx
|
||||
|
||||
modules-names += \
|
||||
$(if $(CXX),$(modules-names-cxx)) \
|
||||
$(modules-execstack-$(have-z-execstack)) \
|
||||
+ $(tlsmod17a-modules) \
|
||||
+ $(tlsmod18a-modules) \
|
||||
$(tst-tls-many-dynamic-modules) \
|
||||
$(tst-tls-many-dynamic-modules-dep) \
|
||||
$(tst-tls-many-dynamic-modules-dep-bad) \
|
||||
- $(tlsmod17a-modules) \
|
||||
- $(tlsmod18a-modules) \
|
||||
-# modules-names
|
||||
+ # modules-names
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -680,54 +830,103 @@ modules-names-nobuild := filtmod1
|
||||
tests += $(tests-static)
|
||||
|
||||
ifneq (no,$(multi-arch))
|
||||
-tests-ifuncstatic := ifuncmain1static ifuncmain1picstatic \
|
||||
- ifuncmain2static ifuncmain2picstatic \
|
||||
- ifuncmain4static ifuncmain4picstatic \
|
||||
- ifuncmain5static ifuncmain5picstatic \
|
||||
- ifuncmain7static ifuncmain7picstatic
|
||||
+tests-ifuncstatic := \
|
||||
+ ifuncmain1static \
|
||||
+ ifuncmain1picstatic \
|
||||
+ ifuncmain2static \
|
||||
+ ifuncmain2picstatic \
|
||||
+ ifuncmain4static \
|
||||
+ ifuncmain4picstatic \
|
||||
+ ifuncmain5static \
|
||||
+ ifuncmain5picstatic \
|
||||
+ ifuncmain7static \
|
||||
+ ifuncmain7picstatic \
|
||||
+ # tests-ifuncstatic
|
||||
tests-static += $(tests-ifuncstatic)
|
||||
tests-internal += $(tests-ifuncstatic)
|
||||
ifeq (yes,$(build-shared))
|
||||
tests-internal += \
|
||||
- ifuncmain1 ifuncmain1pic ifuncmain1vis ifuncmain1vispic \
|
||||
- ifuncmain1staticpic \
|
||||
- ifuncmain2 ifuncmain2pic ifuncmain3 ifuncmain4 \
|
||||
- ifuncmain5 ifuncmain5pic ifuncmain5staticpic \
|
||||
- ifuncmain7 ifuncmain7pic
|
||||
-ifunc-test-modules = ifuncdep1 ifuncdep1pic ifuncdep2 ifuncdep2pic \
|
||||
- ifuncdep5 ifuncdep5pic
|
||||
+ ifuncmain1 \
|
||||
+ ifuncmain1pic \
|
||||
+ ifuncmain1staticpic \
|
||||
+ ifuncmain1vis \
|
||||
+ ifuncmain1vispic \
|
||||
+ ifuncmain2 \
|
||||
+ ifuncmain2pic \
|
||||
+ ifuncmain3 \
|
||||
+ ifuncmain4 \
|
||||
+ ifuncmain5 \
|
||||
+ ifuncmain5pic \
|
||||
+ ifuncmain5staticpic \
|
||||
+ ifuncmain7 \
|
||||
+ ifuncmain7pic \
|
||||
+ # tests-internal
|
||||
+ifunc-test-modules = \
|
||||
+ ifuncdep1 \
|
||||
+ ifuncdep1pic \
|
||||
+ ifuncdep2 \
|
||||
+ ifuncdep2pic \
|
||||
+ ifuncdep5 \
|
||||
+ ifuncdep5pic \
|
||||
+ # ifunc-test-modules
|
||||
extra-test-objs += $(ifunc-test-modules:=.o)
|
||||
test-internal-extras += $(ifunc-test-modules)
|
||||
ifeq (yes,$(have-fpie))
|
||||
-ifunc-pie-tests = ifuncmain1pie ifuncmain1vispie ifuncmain1staticpie \
|
||||
- ifuncmain5pie ifuncmain6pie ifuncmain7pie
|
||||
+ifunc-pie-tests = \
|
||||
+ ifuncmain1pie \
|
||||
+ ifuncmain1staticpie \
|
||||
+ ifuncmain1vispie \
|
||||
+ ifuncmain5pie \
|
||||
+ ifuncmain6pie \
|
||||
+ ifuncmain7pie \
|
||||
+ # ifunc-pie-tests
|
||||
tests-internal += $(ifunc-pie-tests)
|
||||
tests-pie += $(ifunc-pie-tests)
|
||||
endif
|
||||
-modules-names += ifuncmod1 ifuncmod3 ifuncmod5 ifuncmod6
|
||||
+modules-names += \
|
||||
+ ifuncmod1 \
|
||||
+ ifuncmod3 \
|
||||
+ ifuncmod5 \
|
||||
+ ifuncmod6 \
|
||||
+ # modules-names
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq (yes,$(build-shared))
|
||||
ifeq ($(run-built-tests),yes)
|
||||
-tests-special += $(objpfx)tst-pathopt.out $(objpfx)tst-rtld-load-self.out \
|
||||
- $(objpfx)tst-rtld-preload.out $(objpfx)argv0test.out \
|
||||
- $(objpfx)tst-rtld-help.out
|
||||
+tests-special += \
|
||||
+ $(objpfx)argv0test.out \
|
||||
+ $(objpfx)tst-pathopt.out \
|
||||
+ $(objpfx)tst-rtld-help.out \
|
||||
+ $(objpfx)tst-rtld-load-self.out \
|
||||
+ $(objpfx)tst-rtld-preload.out \
|
||||
+ # tests-special
|
||||
endif
|
||||
-tests-special += $(objpfx)check-textrel.out $(objpfx)check-execstack.out \
|
||||
- $(objpfx)check-wx-segment.out \
|
||||
- $(objpfx)check-localplt.out $(objpfx)check-initfini.out
|
||||
+tests-special += \
|
||||
+ $(objpfx)check-execstack.out \
|
||||
+ $(objpfx)check-initfini.out \
|
||||
+ $(objpfx)check-localplt.out \
|
||||
+ $(objpfx)check-textrel.out \
|
||||
+ $(objpfx)check-wx-segment.out \
|
||||
+ # tests-special
|
||||
endif
|
||||
|
||||
ifeq ($(run-built-tests),yes)
|
||||
-tests-special += $(objpfx)order-cmp.out $(objpfx)tst-array1-cmp.out \
|
||||
- $(objpfx)tst-array1-static-cmp.out \
|
||||
- $(objpfx)tst-array2-cmp.out $(objpfx)tst-array3-cmp.out \
|
||||
- $(objpfx)tst-array4-cmp.out $(objpfx)tst-array5-cmp.out \
|
||||
- $(objpfx)tst-array5-static-cmp.out $(objpfx)order2-cmp.out \
|
||||
- $(objpfx)tst-initorder-cmp.out \
|
||||
- $(objpfx)tst-initorder2-cmp.out $(objpfx)tst-unused-dep.out \
|
||||
- $(objpfx)tst-unused-dep-cmp.out
|
||||
+tests-special += \
|
||||
+ $(objpfx)order-cmp.out \
|
||||
+ $(objpfx)order2-cmp.out \
|
||||
+ $(objpfx)tst-array1-cmp.out \
|
||||
+ $(objpfx)tst-array1-static-cmp.out \
|
||||
+ $(objpfx)tst-array2-cmp.out \
|
||||
+ $(objpfx)tst-array3-cmp.out \
|
||||
+ $(objpfx)tst-array4-cmp.out \
|
||||
+ $(objpfx)tst-array5-cmp.out \
|
||||
+ $(objpfx)tst-array5-static-cmp.out \
|
||||
+ $(objpfx)tst-initorder-cmp.out \
|
||||
+ $(objpfx)tst-initorder2-cmp.out \
|
||||
+ $(objpfx)tst-unused-dep-cmp.out \
|
||||
+ $(objpfx)tst-unused-dep.out \
|
||||
+ # tests-special
|
||||
endif
|
||||
|
||||
check-abi: $(objpfx)check-abi-ld.out
|
||||
@@ -807,6 +1006,7 @@ rtld-stubbed-symbols = \
|
||||
free \
|
||||
malloc \
|
||||
realloc \
|
||||
+ # rtld-stubbed-symbols
|
||||
|
||||
# The GCC arguments that implement $(rtld-stubbed-symbols).
|
||||
rtld-stubbed-symbols-args = \
|
440
SOURCES/glibc-rh2047981-31.patch
Normal file
440
SOURCES/glibc-rh2047981-31.patch
Normal file
@ -0,0 +1,440 @@
|
||||
Added $(objpfx)tst-audit23: $(libdl) to elf/Makefile since
|
||||
we still need $(libdl) in RHEL8.
|
||||
|
||||
commit 5fa11a2bc94c912c3b25860065086902674537ba
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Mon Jan 24 10:46:15 2022 -0300
|
||||
|
||||
elf: Add la_activity during application exit
|
||||
|
||||
la_activity is not called during application exit, even though
|
||||
la_objclose is.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Tested-by: Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 954cd08c199f5037..e4955c9f575f9015 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -345,6 +345,7 @@ tests += \
|
||||
tst-audit2 \
|
||||
tst-audit20 \
|
||||
tst-audit22 \
|
||||
+ tst-audit23 \
|
||||
tst-audit8 \
|
||||
tst-audit9 \
|
||||
tst-auditmany \
|
||||
@@ -608,6 +609,7 @@ modules-names = \
|
||||
tst-audit13mod1 \
|
||||
tst-audit18mod \
|
||||
tst-audit19bmod \
|
||||
+ tst-audit23mod \
|
||||
tst-auditlogmod-1 \
|
||||
tst-auditlogmod-2 \
|
||||
tst-auditlogmod-3 \
|
||||
@@ -630,6 +632,7 @@ modules-names = \
|
||||
tst-auditmod19b \
|
||||
tst-auditmod20 \
|
||||
tst-auditmod22 \
|
||||
+ tst-auditmod23 \
|
||||
tst-big-note-lib \
|
||||
tst-deep1mod1 \
|
||||
tst-deep1mod2 \
|
||||
@@ -2041,6 +2044,11 @@ $(objpfx)tst-auditmod20.so: $(libdl)
|
||||
$(objpfx)tst-audit22.out: $(objpfx)tst-auditmod22.so
|
||||
tst-audit22-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
+$(objpfx)tst-audit23: $(libdl)
|
||||
+$(objpfx)tst-audit23.out: $(objpfx)tst-auditmod23.so \
|
||||
+ $(objpfx)tst-audit23mod.so
|
||||
+tst-audit23-ARGS = -- $(host-test-program-cmd)
|
||||
+
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
-Wl,--version-script=tst-sonamemove-linkmod1.map \
|
||||
diff --git a/elf/dl-fini.c b/elf/dl-fini.c
|
||||
index e102d93647cb8c47..eea9d8aad736a99e 100644
|
||||
--- a/elf/dl-fini.c
|
||||
+++ b/elf/dl-fini.c
|
||||
@@ -63,6 +63,10 @@ _dl_fini (void)
|
||||
__rtld_lock_unlock_recursive (GL(dl_load_lock));
|
||||
else
|
||||
{
|
||||
+#ifdef SHARED
|
||||
+ _dl_audit_activity_nsid (ns, LA_ACT_DELETE);
|
||||
+#endif
|
||||
+
|
||||
/* Now we can allocate an array to hold all the pointers and
|
||||
copy the pointers in. */
|
||||
struct link_map *maps[nloaded];
|
||||
@@ -153,6 +157,10 @@ _dl_fini (void)
|
||||
/* Correct the previous increment. */
|
||||
--l->l_direct_opencount;
|
||||
}
|
||||
+
|
||||
+#ifdef SHARED
|
||||
+ _dl_audit_activity_nsid (ns, LA_ACT_CONSISTENT);
|
||||
+#endif
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..4904cf1340a97ee1
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit23.c
|
||||
@@ -0,0 +1,239 @@
|
||||
+/* Check for expected la_objopen and la_objeclose for all objects.
|
||||
+ Copyright (C) 2022 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 <array_length.h>
|
||||
+#include <errno.h>
|
||||
+#include <getopt.h>
|
||||
+#include <link.h>
|
||||
+#include <limits.h>
|
||||
+#include <inttypes.h>
|
||||
+#include <gnu/lib-names.h>
|
||||
+#include <string.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <support/capture_subprocess.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/xstdio.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+#include <support/support.h>
|
||||
+
|
||||
+static int restart;
|
||||
+#define CMDLINE_OPTIONS \
|
||||
+ { "restart", no_argument, &restart, 1 },
|
||||
+
|
||||
+static int
|
||||
+handle_restart (void)
|
||||
+{
|
||||
+ xdlopen ("tst-audit23mod.so", RTLD_NOW);
|
||||
+ xdlmopen (LM_ID_NEWLM, LIBC_SO, RTLD_NOW);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static inline bool
|
||||
+startswith (const char *str, const char *pre)
|
||||
+{
|
||||
+ size_t lenpre = strlen (pre);
|
||||
+ size_t lenstr = strlen (str);
|
||||
+ return lenstr >= lenpre && memcmp (pre, str, lenpre) == 0;
|
||||
+}
|
||||
+
|
||||
+static inline bool
|
||||
+is_vdso (const char *str)
|
||||
+{
|
||||
+ return startswith (str, "linux-gate")
|
||||
+ || startswith (str, "linux-vdso");
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (int argc, char *argv[])
|
||||
+{
|
||||
+ /* We must have either:
|
||||
+ - One or four parameters left if called initially:
|
||||
+ + path to ld.so optional
|
||||
+ + "--library-path" optional
|
||||
+ + the library path optional
|
||||
+ + the application name */
|
||||
+ if (restart)
|
||||
+ return handle_restart ();
|
||||
+
|
||||
+ char *spargv[9];
|
||||
+ TEST_VERIFY_EXIT (((argc - 1) + 3) < array_length (spargv));
|
||||
+ int i = 0;
|
||||
+ for (; i < argc - 1; i++)
|
||||
+ spargv[i] = argv[i + 1];
|
||||
+ spargv[i++] = (char *) "--direct";
|
||||
+ spargv[i++] = (char *) "--restart";
|
||||
+ spargv[i] = NULL;
|
||||
+
|
||||
+ setenv ("LD_AUDIT", "tst-auditmod23.so", 0);
|
||||
+ struct support_capture_subprocess result
|
||||
+ = support_capture_subprogram (spargv[0], spargv);
|
||||
+ support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
|
||||
+
|
||||
+ /* The expected la_objopen/la_objclose:
|
||||
+ 1. executable
|
||||
+ 2. loader
|
||||
+ 3. libc.so
|
||||
+ 4. tst-audit23mod.so
|
||||
+ 5. libc.so (LM_ID_NEWLM).
|
||||
+ 6. vdso (optional and ignored). */
|
||||
+ enum { max_objs = 6 };
|
||||
+ struct la_obj_t
|
||||
+ {
|
||||
+ char *lname;
|
||||
+ uintptr_t laddr;
|
||||
+ Lmid_t lmid;
|
||||
+ bool closed;
|
||||
+ } objs[max_objs] = { [0 ... max_objs-1] = { .closed = false } };
|
||||
+ size_t nobjs = 0;
|
||||
+
|
||||
+ /* The expected namespaces are one for the audit module, one for the
|
||||
+ application, and another for the dlmopen on handle_restart. */
|
||||
+ enum { max_ns = 3 };
|
||||
+ uintptr_t acts[max_ns] = { 0 };
|
||||
+ size_t nacts = 0;
|
||||
+ int last_act = -1;
|
||||
+ uintptr_t last_act_cookie = -1;
|
||||
+ bool seen_first_objclose = false;
|
||||
+
|
||||
+ FILE *out = fmemopen (result.err.buffer, result.err.length, "r");
|
||||
+ TEST_VERIFY (out != NULL);
|
||||
+ char *buffer = NULL;
|
||||
+ size_t buffer_length = 0;
|
||||
+ while (xgetline (&buffer, &buffer_length, out))
|
||||
+ {
|
||||
+ if (startswith (buffer, "la_activity: "))
|
||||
+ {
|
||||
+ uintptr_t cookie;
|
||||
+ int this_act;
|
||||
+ int r = sscanf (buffer, "la_activity: %d %"SCNxPTR"", &this_act,
|
||||
+ &cookie);
|
||||
+ TEST_COMPARE (r, 2);
|
||||
+
|
||||
+ /* The cookie identifies the object at the head of the link map,
|
||||
+ so we only add a new namespace if it changes from the previous
|
||||
+ one. This works since dlmopen is the last in the test body. */
|
||||
+ if (cookie != last_act_cookie && last_act_cookie != -1)
|
||||
+ TEST_COMPARE (last_act, LA_ACT_CONSISTENT);
|
||||
+
|
||||
+ if (this_act == LA_ACT_ADD && acts[nacts] != cookie)
|
||||
+ {
|
||||
+ acts[nacts++] = cookie;
|
||||
+ last_act_cookie = cookie;
|
||||
+ }
|
||||
+ /* The LA_ACT_DELETE is called in the reverse order of LA_ACT_ADD
|
||||
+ at program termination (if the tests adds a dlclose or a library
|
||||
+ with extra dependencies this will need to be adapted). */
|
||||
+ else if (this_act == LA_ACT_DELETE)
|
||||
+ {
|
||||
+ last_act_cookie = acts[--nacts];
|
||||
+ TEST_COMPARE (acts[nacts], cookie);
|
||||
+ acts[nacts] = 0;
|
||||
+ }
|
||||
+ else if (this_act == LA_ACT_CONSISTENT)
|
||||
+ {
|
||||
+ TEST_COMPARE (cookie, last_act_cookie);
|
||||
+
|
||||
+ /* LA_ACT_DELETE must always be followed by an la_objclose. */
|
||||
+ if (last_act == LA_ACT_DELETE)
|
||||
+ TEST_COMPARE (seen_first_objclose, true);
|
||||
+ else
|
||||
+ TEST_COMPARE (last_act, LA_ACT_ADD);
|
||||
+ }
|
||||
+
|
||||
+ last_act = this_act;
|
||||
+ seen_first_objclose = false;
|
||||
+ }
|
||||
+ else if (startswith (buffer, "la_objopen: "))
|
||||
+ {
|
||||
+ char *lname;
|
||||
+ uintptr_t laddr;
|
||||
+ Lmid_t lmid;
|
||||
+ uintptr_t cookie;
|
||||
+ int r = sscanf (buffer, "la_objopen: %"SCNxPTR" %ms %"SCNxPTR" %ld",
|
||||
+ &cookie, &lname, &laddr, &lmid);
|
||||
+ TEST_COMPARE (r, 4);
|
||||
+
|
||||
+ /* la_objclose is not triggered by vDSO because glibc does not
|
||||
+ unload it. */
|
||||
+ if (is_vdso (lname))
|
||||
+ continue;
|
||||
+ if (nobjs == max_objs)
|
||||
+ FAIL_EXIT1 ("non expected la_objopen: %s %"PRIxPTR" %ld",
|
||||
+ lname, laddr, lmid);
|
||||
+ objs[nobjs].lname = lname;
|
||||
+ objs[nobjs].laddr = laddr;
|
||||
+ objs[nobjs].lmid = lmid;
|
||||
+ objs[nobjs].closed = false;
|
||||
+ nobjs++;
|
||||
+
|
||||
+ /* This indirectly checks that la_objopen always comes before
|
||||
+ la_objclose btween la_activity calls. */
|
||||
+ seen_first_objclose = false;
|
||||
+ }
|
||||
+ else if (startswith (buffer, "la_objclose: "))
|
||||
+ {
|
||||
+ char *lname;
|
||||
+ uintptr_t laddr;
|
||||
+ Lmid_t lmid;
|
||||
+ uintptr_t cookie;
|
||||
+ int r = sscanf (buffer, "la_objclose: %"SCNxPTR" %ms %"SCNxPTR" %ld",
|
||||
+ &cookie, &lname, &laddr, &lmid);
|
||||
+ TEST_COMPARE (r, 4);
|
||||
+
|
||||
+ for (size_t i = 0; i < nobjs; i++)
|
||||
+ {
|
||||
+ if (strcmp (lname, objs[i].lname) == 0 && lmid == objs[i].lmid)
|
||||
+ {
|
||||
+ TEST_COMPARE (objs[i].closed, false);
|
||||
+ objs[i].closed = true;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* la_objclose should be called after la_activity(LA_ACT_DELETE) for
|
||||
+ the closed object's namespace. */
|
||||
+ TEST_COMPARE (last_act, LA_ACT_DELETE);
|
||||
+ if (!seen_first_objclose)
|
||||
+ {
|
||||
+ TEST_COMPARE (last_act_cookie, cookie);
|
||||
+ seen_first_objclose = true;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (size_t i = 0; i < nobjs; i++)
|
||||
+ {
|
||||
+ TEST_COMPARE (objs[i].closed, true);
|
||||
+ free (objs[i].lname);
|
||||
+ }
|
||||
+
|
||||
+ /* la_activity(LA_ACT_CONSISTENT) should be the last callback received.
|
||||
+ Since only one link map may be not-CONSISTENT at a time, this also
|
||||
+ ensures la_activity(LA_ACT_CONSISTENT) is the last callback received
|
||||
+ for every namespace. */
|
||||
+ TEST_COMPARE (last_act, LA_ACT_CONSISTENT);
|
||||
+
|
||||
+ free (buffer);
|
||||
+ xfclose (out);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define TEST_FUNCTION_ARGV do_test
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-audit23mod.c b/elf/tst-audit23mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..30315687037d25e8
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit23mod.c
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* Extra module for tst-audit23
|
||||
+ Copyright (C) 2022 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/>. */
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod23.c b/elf/tst-auditmod23.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..d7c60d7a5cbc4f8a
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod23.c
|
||||
@@ -0,0 +1,74 @@
|
||||
+/* Audit module loaded by tst-audit23.
|
||||
+ Copyright (C) 2022 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 <link.h>
|
||||
+#include <inttypes.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <sys/auxv.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+struct map_desc_t
|
||||
+{
|
||||
+ char *lname;
|
||||
+ uintptr_t laddr;
|
||||
+ Lmid_t lmid;
|
||||
+};
|
||||
+
|
||||
+void
|
||||
+la_activity (uintptr_t *cookie, unsigned int flag)
|
||||
+{
|
||||
+ fprintf (stderr, "%s: %d %"PRIxPTR"\n", __func__, flag, (uintptr_t) cookie);
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objopen (struct link_map *map, Lmid_t lmid, uintptr_t *cookie)
|
||||
+{
|
||||
+ const char *l_name = map->l_name[0] == '\0' ? "mainapp" : map->l_name;
|
||||
+ fprintf (stderr, "%s: %"PRIxPTR" %s %"PRIxPTR" %ld\n", __func__,
|
||||
+ (uintptr_t) cookie, l_name, map->l_addr, lmid);
|
||||
+
|
||||
+ struct map_desc_t *map_desc = malloc (sizeof (struct map_desc_t));
|
||||
+ if (map_desc == NULL)
|
||||
+ abort ();
|
||||
+
|
||||
+ map_desc->lname = strdup (l_name);
|
||||
+ map_desc->laddr = map->l_addr;
|
||||
+ map_desc->lmid = lmid;
|
||||
+
|
||||
+ *cookie = (uintptr_t) map_desc;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objclose (uintptr_t *cookie)
|
||||
+{
|
||||
+ struct map_desc_t *map_desc = (struct map_desc_t *) *cookie;
|
||||
+ fprintf (stderr, "%s: %"PRIxPTR" %s %"PRIxPTR" %ld\n", __func__,
|
||||
+ (uintptr_t) cookie, map_desc->lname, map_desc->laddr,
|
||||
+ map_desc->lmid);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
298
SOURCES/glibc-rh2047981-32.patch
Normal file
298
SOURCES/glibc-rh2047981-32.patch
Normal file
@ -0,0 +1,298 @@
|
||||
commit 254d3d5aef2fd8430c469e1938209ac100ebf132
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Mon Jan 24 10:46:16 2022 -0300
|
||||
|
||||
elf: Fix initial-exec TLS access on audit modules (BZ #28096)
|
||||
|
||||
For audit modules and dependencies with initial-exec TLS, we can not
|
||||
set the initial TLS image on default loader initialization because it
|
||||
would already be set by the audit setup. However, subsequent thread
|
||||
creation would need to follow the default behaviour.
|
||||
|
||||
This patch fixes it by setting l_auditing link_map field not only
|
||||
for the audit modules, but also for all its dependencies. This is
|
||||
used on _dl_allocate_tls_init to avoid the static TLS initialization
|
||||
at load time.
|
||||
|
||||
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Tested-by: Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index e4955c9f575f9015..3f5f72257a5fbea4 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -344,6 +344,7 @@ tests += \
|
||||
tst-audit19b \
|
||||
tst-audit2 \
|
||||
tst-audit20 \
|
||||
+ tst-audit21 \
|
||||
tst-audit22 \
|
||||
tst-audit23 \
|
||||
tst-audit8 \
|
||||
@@ -631,6 +632,8 @@ modules-names = \
|
||||
tst-auditmod19a \
|
||||
tst-auditmod19b \
|
||||
tst-auditmod20 \
|
||||
+ tst-auditmod21a \
|
||||
+ tst-auditmod21b \
|
||||
tst-auditmod22 \
|
||||
tst-auditmod23 \
|
||||
tst-big-note-lib \
|
||||
@@ -2041,6 +2044,11 @@ $(objpfx)tst-audit20.out: $(objpfx)tst-auditmod20.so
|
||||
tst-audit20-ENV = LD_AUDIT=$(objpfx)tst-auditmod20.so
|
||||
$(objpfx)tst-auditmod20.so: $(libdl)
|
||||
|
||||
+$(objpfx)tst-audit21: $(shared-thread-library)
|
||||
+$(objpfx)tst-audit21.out: $(objpfx)tst-auditmod21a.so
|
||||
+$(objpfx)tst-auditmod21a.so: $(objpfx)tst-auditmod21b.so
|
||||
+tst-audit21-ENV = LD_AUDIT=$(objpfx)tst-auditmod21a.so
|
||||
+
|
||||
$(objpfx)tst-audit22.out: $(objpfx)tst-auditmod22.so
|
||||
tst-audit22-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
|
||||
index 7865fc390c3f3f0a..a918e9a6f585eb72 100644
|
||||
--- a/elf/dl-tls.c
|
||||
+++ b/elf/dl-tls.c
|
||||
@@ -514,8 +514,12 @@ _dl_resize_dtv (dtv_t *dtv, size_t max_modid)
|
||||
}
|
||||
|
||||
|
||||
+/* Allocate initial TLS. RESULT should be a non-NULL pointer to storage
|
||||
+ for the TLS space. The DTV may be resized, and so this function may
|
||||
+ call malloc to allocate that space. The loader's GL(dl_load_tls_lock)
|
||||
+ is taken when manipulating global TLS-related data in the loader. */
|
||||
void *
|
||||
-_dl_allocate_tls_init (void *result)
|
||||
+_dl_allocate_tls_init (void *result, bool init_tls)
|
||||
{
|
||||
if (result == NULL)
|
||||
/* The memory allocation failed. */
|
||||
@@ -588,7 +592,14 @@ _dl_allocate_tls_init (void *result)
|
||||
some platforms use in static programs requires it. */
|
||||
dtv[map->l_tls_modid].pointer.val = dest;
|
||||
|
||||
- /* Copy the initialization image and clear the BSS part. */
|
||||
+ /* Copy the initialization image and clear the BSS part. For
|
||||
+ audit modules or dependencies with initial-exec TLS, we can not
|
||||
+ set the initial TLS image on default loader initialization
|
||||
+ because it would already be set by the audit setup. However,
|
||||
+ subsequent thread creation would need to follow the default
|
||||
+ behaviour. */
|
||||
+ if (map->l_ns != LM_ID_BASE && !init_tls)
|
||||
+ continue;
|
||||
memset (__mempcpy (dest, map->l_tls_initimage,
|
||||
map->l_tls_initimage_size), '\0',
|
||||
map->l_tls_blocksize - map->l_tls_initimage_size);
|
||||
@@ -615,7 +626,7 @@ _dl_allocate_tls (void *mem)
|
||||
{
|
||||
return _dl_allocate_tls_init (mem == NULL
|
||||
? _dl_allocate_tls_storage ()
|
||||
- : allocate_dtv (mem));
|
||||
+ : allocate_dtv (mem), true);
|
||||
}
|
||||
rtld_hidden_def (_dl_allocate_tls)
|
||||
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index efcbeac6c24c4b7b..caa980dbda3d1a72 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -2421,7 +2421,7 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
into the main thread's TLS area, which we allocated above.
|
||||
Note: thread-local variables must only be accessed after completing
|
||||
the next step. */
|
||||
- _dl_allocate_tls_init (tcbp);
|
||||
+ _dl_allocate_tls_init (tcbp, false);
|
||||
|
||||
/* And finally install it for the main thread. */
|
||||
if (! tls_init_tp_called)
|
||||
diff --git a/elf/tst-audit21.c b/elf/tst-audit21.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..3a47ab64d44421ee
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit21.c
|
||||
@@ -0,0 +1,42 @@
|
||||
+/* Check LD_AUDIT with static TLS.
|
||||
+ Copyright (C) 2022 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 <ctype.h>
|
||||
+#include <support/xthread.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+static volatile __thread int out __attribute__ ((tls_model ("initial-exec")));
|
||||
+
|
||||
+static void *
|
||||
+tf (void *arg)
|
||||
+{
|
||||
+ TEST_COMPARE (out, 0);
|
||||
+ out = isspace (' ');
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+int main (int argc, char *argv[])
|
||||
+{
|
||||
+ TEST_COMPARE (out, 0);
|
||||
+ out = isspace (' ');
|
||||
+
|
||||
+ pthread_t t = xpthread_create (NULL, tf, NULL);
|
||||
+ xpthread_join (t);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod21a.c b/elf/tst-auditmod21a.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..f6d51b5c0531c49d
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod21a.c
|
||||
@@ -0,0 +1,80 @@
|
||||
+/* Check LD_AUDIT with static TLS.
|
||||
+ Copyright (C) 2022 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 <ctype.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <link.h>
|
||||
+
|
||||
+#define tls_ie __attribute__ ((tls_model ("initial-exec")))
|
||||
+
|
||||
+__thread int tls_var0 tls_ie;
|
||||
+__thread int tls_var1 tls_ie = 0x10;
|
||||
+
|
||||
+/* Defined at tst-auditmod21b.so */
|
||||
+extern __thread int tls_var2;
|
||||
+extern __thread int tls_var3;
|
||||
+
|
||||
+static volatile int out;
|
||||
+
|
||||
+static void
|
||||
+call_libc (void)
|
||||
+{
|
||||
+ /* isspace accesses the initial-exec glibc TLS variables, which are
|
||||
+ setup in glibc initialization. */
|
||||
+ out = isspace (' ');
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int v)
|
||||
+{
|
||||
+ tls_var0 = 0x1;
|
||||
+ if (tls_var1 != 0x10)
|
||||
+ abort ();
|
||||
+ tls_var1 = 0x20;
|
||||
+
|
||||
+ tls_var2 = 0x2;
|
||||
+ if (tls_var3 != 0x20)
|
||||
+ abort ();
|
||||
+ tls_var3 = 0x40;
|
||||
+
|
||||
+ call_libc ();
|
||||
+
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+unsigned int
|
||||
+la_objopen (struct link_map* map, Lmid_t lmid, uintptr_t* cookie)
|
||||
+{
|
||||
+ call_libc ();
|
||||
+ *cookie = (uintptr_t) map;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_activity (uintptr_t* cookie, unsigned int flag)
|
||||
+{
|
||||
+ if (tls_var0 != 0x1 || tls_var1 != 0x20)
|
||||
+ abort ();
|
||||
+ call_libc ();
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+la_preinit (uintptr_t* cookie)
|
||||
+{
|
||||
+ call_libc ();
|
||||
+}
|
||||
diff --git a/elf/tst-auditmod21b.c b/elf/tst-auditmod21b.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..6ba5335b7514c674
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod21b.c
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* Check LD_AUDIT with static TLS.
|
||||
+ Copyright (C) 2022 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/>. */
|
||||
+
|
||||
+#define tls_ie __attribute__ ((tls_model ("initial-exec")))
|
||||
+
|
||||
+__thread int tls_var2 tls_ie;
|
||||
+__thread int tls_var3 tls_ie = 0x20;
|
||||
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
|
||||
index 5fa45b19987717e1..58170d9da2bf0fa6 100644
|
||||
--- a/nptl/allocatestack.c
|
||||
+++ b/nptl/allocatestack.c
|
||||
@@ -244,7 +244,7 @@ get_cached_stack (size_t *sizep, void **memp)
|
||||
memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
|
||||
|
||||
/* Re-initialize the TLS. */
|
||||
- _dl_allocate_tls_init (TLS_TPADJ (result));
|
||||
+ _dl_allocate_tls_init (TLS_TPADJ (result), true);
|
||||
|
||||
return result;
|
||||
}
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 29b77b35175c1116..73f4863fd43922b9 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -1182,7 +1182,7 @@ extern void _dl_allocate_static_tls (struct link_map *map) attribute_hidden;
|
||||
/* These are internal entry points to the two halves of _dl_allocate_tls,
|
||||
only used within rtld.c itself at startup time. */
|
||||
extern void *_dl_allocate_tls_storage (void) attribute_hidden;
|
||||
-extern void *_dl_allocate_tls_init (void *);
|
||||
+extern void *_dl_allocate_tls_init (void *, bool);
|
||||
rtld_hidden_proto (_dl_allocate_tls_init)
|
||||
|
||||
/* Deallocate memory allocated with _dl_allocate_tls. */
|
1777
SOURCES/glibc-rh2047981-33.patch
Normal file
1777
SOURCES/glibc-rh2047981-33.patch
Normal file
File diff suppressed because it is too large
Load Diff
1042
SOURCES/glibc-rh2047981-34.patch
Normal file
1042
SOURCES/glibc-rh2047981-34.patch
Normal file
File diff suppressed because it is too large
Load Diff
21
SOURCES/glibc-rh2047981-35.patch
Normal file
21
SOURCES/glibc-rh2047981-35.patch
Normal file
@ -0,0 +1,21 @@
|
||||
commit 80a08d0faa9b224019f895800c4d97de4e23e1aa
|
||||
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
Date: Wed Feb 2 14:03:58 2022 +0000
|
||||
|
||||
Fix elf/tst-audit25a with default bind now toolchains
|
||||
|
||||
This test relies on lazy binding for the executable so request that
|
||||
explicitly in case the toolchain defaults to bind now.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 78147ed2dbcaf4c0..4d16ed1637db8582 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -2130,6 +2130,7 @@ $(objpfx)tst-audit25a: $(objpfx)tst-audit25mod1.so \
|
||||
$(objpfx)tst-audit25mod2.so \
|
||||
$(objpfx)tst-audit25mod3.so \
|
||||
$(objpfx)tst-audit25mod4.so
|
||||
+LDFLAGS-tst-audit25a = -Wl,-z,lazy
|
||||
$(objpfx)tst-audit25mod1.so: $(objpfx)tst-audit25mod3.so
|
||||
LDFLAGS-tst-audit25mod1.so = -Wl,-z,now
|
||||
$(objpfx)tst-audit25mod2.so: $(objpfx)tst-audit25mod4.so
|
28
SOURCES/glibc-rh2047981-36.patch
Normal file
28
SOURCES/glibc-rh2047981-36.patch
Normal file
@ -0,0 +1,28 @@
|
||||
commit fa7ad1df1915c8a62f50e3a5b7e10f9c7118cd7f
|
||||
Author: H.J. Lu <hjl.tools@gmail.com>
|
||||
Date: Sun Feb 6 11:12:24 2022 -0800
|
||||
|
||||
elf: Replace tst-audit24bmod2.so with tst-audit24bmod2
|
||||
|
||||
Replace tst-audit24bmod2.so with tst-audit24bmod2 to silence:
|
||||
|
||||
make[2]: Entering directory '/export/gnu/import/git/gitlab/x86-glibc/elf'
|
||||
Makefile:2201: warning: overriding recipe for target '/export/build/gnu/tools-build/glibc-gitlab/build-x86_64-linux/elf/tst-audit24bmod2.so'
|
||||
../Makerules:765: warning: ignoring old recipe for target '/export/build/gnu/tools-build/glibc-gitlab/build-x86_64-linux/elf/tst-audit24bmod2.so'
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 4d16ed1637db8582..73d347339762fc9e 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -855,7 +855,7 @@ extra-test-objs += $(addsuffix .os,$(strip $(modules-names)))
|
||||
|
||||
# filtmod1.so has a special rule
|
||||
modules-names-nobuild := filtmod1 \
|
||||
- tst-audit24bmod1 tst-audit24bmod2.so
|
||||
+ tst-audit24bmod1 tst-audit24bmod2
|
||||
|
||||
tests += $(tests-static)
|
||||
|
112
SOURCES/glibc-rh2047981-37.patch
Normal file
112
SOURCES/glibc-rh2047981-37.patch
Normal file
@ -0,0 +1,112 @@
|
||||
commit 9e94f57484a2aba0fe67ea2059b5843f651887c2
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Fri Feb 4 15:54:59 2022 -0300
|
||||
|
||||
hppa: Fix bind-now audit (BZ #28857)
|
||||
|
||||
On hppa, a function pointer returned by la_symbind is actually a function
|
||||
descriptor has the plabel bit set (bit 30). This must be cleared to get
|
||||
the actual address of the descriptor. If the descriptor has been bound,
|
||||
the first word of the descriptor is the physical address of theA function,
|
||||
otherwise, the first word of the descriptor points to a trampoline in the
|
||||
PLT.
|
||||
|
||||
This patch also adds a workaround on tests because on hppa (and it seems
|
||||
to be the only ABI I have see it), some shared library adds a dynamic PLT
|
||||
relocation to am empty symbol name:
|
||||
|
||||
$ readelf -r elf/tst-audit25mod1.so
|
||||
[...]
|
||||
Relocation section '.rela.plt' at offset 0x464 contains 6 entries:
|
||||
Offset Info Type Sym.Value Sym. Name + Addend
|
||||
00002008 00000081 R_PARISC_IPLT 508
|
||||
[...]
|
||||
|
||||
It breaks some assumptions on the test, where a symbol with an empty
|
||||
name ("") is passed on la_symbind.
|
||||
|
||||
Checked on x86_64-linux-gnu and hppa-linux-gnu.
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 73d347339762fc9e..6d39b400060a73f3 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -2113,7 +2113,7 @@ $(objpfx)tst-audit24c.out: $(objpfx)tst-auditmod24c.so
|
||||
$(objpfx)tst-audit24c: $(objpfx)tst-audit24amod1.so \
|
||||
$(objpfx)tst-audit24amod2.so
|
||||
tst-audit24c-ENV = LD_BIND_NOW=1 LD_AUDIT=$(objpfx)tst-auditmod24c.so
|
||||
-LDFLAGS-tst-audit24b = -Wl,-z,lazy
|
||||
+LDFLAGS-tst-audit24c = -Wl,-z,lazy
|
||||
|
||||
$(objpfx)tst-audit24d.out: $(objpfx)tst-auditmod24d.so
|
||||
$(objpfx)tst-audit24d: $(objpfx)tst-audit24dmod1.so \
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index 72a50717ef60a357..ec9b032eae37c103 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -257,7 +257,8 @@ _dl_audit_symbind (struct link_map *l, struct reloc_result *reloc_result,
|
||||
reloc_result->flags = flags;
|
||||
}
|
||||
|
||||
- DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value);
|
||||
+ if (flags & LA_SYMB_ALTVALUE)
|
||||
+ DL_FIXUP_BINDNOW_RELOC (value, new_value, sym.st_value);
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/elf/tst-auditmod24a.c b/elf/tst-auditmod24a.c
|
||||
index d8e88f3984af1707..3075dfae2fd3d288 100644
|
||||
--- a/elf/tst-auditmod24a.c
|
||||
+++ b/elf/tst-auditmod24a.c
|
||||
@@ -110,5 +110,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
|
||||
return sym->st_value;
|
||||
}
|
||||
|
||||
- abort ();
|
||||
+ if (symname[0] != '\0')
|
||||
+ abort ();
|
||||
+ return sym->st_value;
|
||||
}
|
||||
diff --git a/elf/tst-auditmod24d.c b/elf/tst-auditmod24d.c
|
||||
index 8c803ecc0a48f21b..badc6be451ee0357 100644
|
||||
--- a/elf/tst-auditmod24d.c
|
||||
+++ b/elf/tst-auditmod24d.c
|
||||
@@ -116,5 +116,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
|
||||
}
|
||||
}
|
||||
|
||||
- abort ();
|
||||
+ if (symname[0] != '\0')
|
||||
+ abort ();
|
||||
+ return sym->st_value;
|
||||
}
|
||||
diff --git a/elf/tst-auditmod25.c b/elf/tst-auditmod25.c
|
||||
index 526f5c54bc2c3b8c..20640a8daf346b5f 100644
|
||||
--- a/elf/tst-auditmod25.c
|
||||
+++ b/elf/tst-auditmod25.c
|
||||
@@ -72,7 +72,7 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
|
||||
unsigned int *flags, const char *symname)
|
||||
#endif
|
||||
{
|
||||
- if (*refcook != -1 && *defcook != -1)
|
||||
+ if (*refcook != -1 && *defcook != -1 && symname[0] != '\0')
|
||||
fprintf (stderr, "la_symbind: %s %u\n", symname,
|
||||
*flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) ? 1 : 0);
|
||||
return sym->st_value;
|
||||
diff --git a/sysdeps/hppa/dl-lookupcfg.h b/sysdeps/hppa/dl-lookupcfg.h
|
||||
index c3fea1fe5776b17a..86f6a04af46c87ba 100644
|
||||
--- a/sysdeps/hppa/dl-lookupcfg.h
|
||||
+++ b/sysdeps/hppa/dl-lookupcfg.h
|
||||
@@ -79,7 +79,9 @@ void attribute_hidden _dl_unmap (struct link_map *map);
|
||||
/* Extract the code address from a fixup value */
|
||||
#define DL_FIXUP_VALUE_CODE_ADDR(value) ((value).ip)
|
||||
#define DL_FIXUP_VALUE_ADDR(value) ((uintptr_t) &(value))
|
||||
-#define DL_FIXUP_ADDR_VALUE(addr) (*(struct fdesc *) (addr))
|
||||
+/* Clear the plabel bit to get the actual address of the descriptor. */
|
||||
+#define DL_FIXUP_ADDR_VALUE(addr) \
|
||||
+ (*(DL_FIXUP_VALUE_TYPE *) ((uintptr_t) (addr) & ~2))
|
||||
#define DL_FIXUP_BINDNOW_ADDR_VALUE(addr) (addr)
|
||||
-#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value) \
|
||||
- (*value) = *(struct fdesc *) (st_value)
|
||||
+#define DL_FIXUP_BINDNOW_RELOC(value, new_value, st_value) \
|
||||
+ *(value) = *(DL_FIXUP_VALUE_TYPE *) ((uintptr_t) (new_value) & ~2)
|
44
SOURCES/glibc-rh2047981-38.patch
Normal file
44
SOURCES/glibc-rh2047981-38.patch
Normal file
@ -0,0 +1,44 @@
|
||||
commit bc02f1fa2fb302eb8a486794c6b7e4811229b81e
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Fri Mar 25 08:53:42 2022 -0300
|
||||
|
||||
elf: Remove unused functions from tst-audit25(a,b)
|
||||
|
||||
diff --git a/elf/tst-audit25a.c b/elf/tst-audit25a.c
|
||||
index 49173e862516e876..c2cff8541b3741c3 100644
|
||||
--- a/elf/tst-audit25a.c
|
||||
+++ b/elf/tst-audit25a.c
|
||||
@@ -49,14 +49,6 @@ handle_restart (void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static inline bool
|
||||
-startswith (const char *str, const char *pre)
|
||||
-{
|
||||
- size_t lenpre = strlen (pre);
|
||||
- size_t lenstr = strlen (str);
|
||||
- return lenstr < lenpre ? false : memcmp (pre, str, lenpre) == 0;
|
||||
-}
|
||||
-
|
||||
static int
|
||||
do_test (int argc, char *argv[])
|
||||
{
|
||||
diff --git a/elf/tst-audit25b.c b/elf/tst-audit25b.c
|
||||
index a56638d501f9bff5..46391770fdfc1796 100644
|
||||
--- a/elf/tst-audit25b.c
|
||||
+++ b/elf/tst-audit25b.c
|
||||
@@ -48,14 +48,6 @@ handle_restart (void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static inline bool
|
||||
-startswith (const char *str, const char *pre)
|
||||
-{
|
||||
- size_t lenpre = strlen (pre);
|
||||
- size_t lenstr = strlen (str);
|
||||
- return lenstr >= lenpre && memcmp (pre, str, lenpre) == 0;
|
||||
-}
|
||||
-
|
||||
static int
|
||||
do_test (int argc, char *argv[])
|
||||
{
|
42
SOURCES/glibc-rh2047981-39.patch
Normal file
42
SOURCES/glibc-rh2047981-39.patch
Normal file
@ -0,0 +1,42 @@
|
||||
commit 5325233313c66aea13e86f5dd59618e9dd74b510
|
||||
Author: Stefan Liebler <stli@linux.ibm.com>
|
||||
Date: Thu Apr 7 13:59:48 2022 +0200
|
||||
|
||||
S390: Fix elf/tst-audit25[ab]
|
||||
|
||||
If glibc is configured with --disable-default-pie and build on
|
||||
s390 with -O3, the tests elf/tst-audit25a and elf/tst-audit25b are
|
||||
failing as there are additional la_symbind lines for free and malloc.
|
||||
It turns out that those belong to the executable. In fact those are
|
||||
the PLT-stubs. Furthermore la_symbind is also called for calloc and
|
||||
realloc symbols, but those belong to libc.
|
||||
|
||||
Those functions are not called at all, but dlsym'ed in
|
||||
elf/dl-minimal.c:
|
||||
__rtld_malloc_init_real (struct link_map *main_map)
|
||||
{
|
||||
...
|
||||
void *new_calloc = lookup_malloc_symbol (main_map, "calloc", &version);
|
||||
void *new_free = lookup_malloc_symbol (main_map, "free", &version);
|
||||
void *new_malloc = lookup_malloc_symbol (main_map, "malloc", &version);
|
||||
void *new_realloc = lookup_malloc_symbol (main_map, "realloc", &version);
|
||||
...
|
||||
}
|
||||
|
||||
Therefore, this commit just ignored symbols with LA_SYMB_DLSYM flag.
|
||||
Reviewed-by: Adheemrval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/tst-auditmod25.c b/elf/tst-auditmod25.c
|
||||
index 20640a8daf346b5f..0524c5aab17fabba 100644
|
||||
--- a/elf/tst-auditmod25.c
|
||||
+++ b/elf/tst-auditmod25.c
|
||||
@@ -72,7 +72,8 @@ la_symbind32 (Elf32_Sym *sym, unsigned int ndx,
|
||||
unsigned int *flags, const char *symname)
|
||||
#endif
|
||||
{
|
||||
- if (*refcook != -1 && *defcook != -1 && symname[0] != '\0')
|
||||
+ if (*refcook != -1 && *defcook != -1 && symname[0] != '\0'
|
||||
+ && (*flags & LA_SYMB_DLSYM) == 0)
|
||||
fprintf (stderr, "la_symbind: %s %u\n", symname,
|
||||
*flags & (LA_SYMB_NOPLTENTER | LA_SYMB_NOPLTEXIT) ? 1 : 0);
|
||||
return sym->st_value;
|
34
SOURCES/glibc-rh2047981-4.patch
Normal file
34
SOURCES/glibc-rh2047981-4.patch
Normal file
@ -0,0 +1,34 @@
|
||||
commit 3ad5dab476205d6e16156cf0511fa6884b3b0fc4
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Tue Jul 7 09:58:45 2020 +0200
|
||||
|
||||
elf: Do not signal LA_ACT_CONSISTENT for an empty namespace [BZ #26076]
|
||||
|
||||
The auditing interface identifies namespaces by their first loaded
|
||||
module. Once the namespace is empty, it is no longer possible to signal
|
||||
LA_ACT_CONSISTENT for it because the first loaded module is already gone
|
||||
at that point.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
diff --git a/elf/dl-close.c b/elf/dl-close.c
|
||||
index 7fe91bdd9aaf694e..698bda929c0eab6c 100644
|
||||
--- a/elf/dl-close.c
|
||||
+++ b/elf/dl-close.c
|
||||
@@ -795,8 +795,14 @@ _dl_close_worker (struct link_map *map, bool force)
|
||||
if (__glibc_unlikely (do_audit))
|
||||
{
|
||||
struct link_map *head = ns->_ns_loaded;
|
||||
- /* Do not call the functions for any auditing object. */
|
||||
- if (head->l_auditing == 0)
|
||||
+ /* If head is NULL, the namespace has become empty, and the
|
||||
+ audit interface does not give us a way to signal
|
||||
+ LA_ACT_CONSISTENT for it because the first loaded module is
|
||||
+ used to identify the namespace.
|
||||
+
|
||||
+ Furthermore, do not notify auditors of the cleanup of a
|
||||
+ failed audit module loading attempt. */
|
||||
+ if (head != NULL && head->l_auditing == 0)
|
||||
{
|
||||
struct audit_ifaces *afct = GLRO(dl_audit);
|
||||
for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt)
|
170
SOURCES/glibc-rh2047981-40.patch
Normal file
170
SOURCES/glibc-rh2047981-40.patch
Normal file
@ -0,0 +1,170 @@
|
||||
commit e4a2fb76efb45210c541ee3f8ef32f317783c3a8
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed May 11 20:30:49 2022 +0200
|
||||
|
||||
manual: Document the dlinfo function
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Tested-by: Carlos O'Donell <carlos@rehdat.com>
|
||||
(cherry picked from commit 93804a1ee084d4bdc620b2b9f91615c7da0fabe1)
|
||||
|
||||
Also includes partial backport of commit 5d28a8962dcb6ec056b81d730e
|
||||
(the addition of manual/dynlink.texi).
|
||||
|
||||
diff --git a/manual/Makefile b/manual/Makefile
|
||||
index c2756640a785afe1..4c835e568f3bab67 100644
|
||||
--- a/manual/Makefile
|
||||
+++ b/manual/Makefile
|
||||
@@ -39,7 +39,7 @@ chapters = $(addsuffix .texi, \
|
||||
pipe socket terminal syslog math arith time \
|
||||
resource setjmp signal startup process ipc job \
|
||||
nss users sysinfo conf crypt debug threads \
|
||||
- probes tunables)
|
||||
+ dynlink probes tunables)
|
||||
appendices = lang.texi header.texi install.texi maint.texi platform.texi \
|
||||
contrib.texi
|
||||
licenses = freemanuals.texi lgpl-2.1.texi fdl-1.3.texi
|
||||
diff --git a/manual/dynlink.texi b/manual/dynlink.texi
|
||||
new file mode 100644
|
||||
index 0000000000000000..dbf3de11769d8e57
|
||||
--- /dev/null
|
||||
+++ b/manual/dynlink.texi
|
||||
@@ -0,0 +1,100 @@
|
||||
+@node Dynamic Linker
|
||||
+@c @node Dynamic Linker, Internal Probes, Threads, Top
|
||||
+@c %MENU% Loading programs and shared objects.
|
||||
+@chapter Dynamic Linker
|
||||
+@cindex dynamic linker
|
||||
+@cindex dynamic loader
|
||||
+
|
||||
+The @dfn{dynamic linker} is responsible for loading dynamically linked
|
||||
+programs and their dependencies (in the form of shared objects). The
|
||||
+dynamic linker in @theglibc{} also supports loading shared objects (such
|
||||
+as plugins) later at run time.
|
||||
+
|
||||
+Dynamic linkers are sometimes called @dfn{dynamic loaders}.
|
||||
+
|
||||
+@menu
|
||||
+* Dynamic Linker Introspection:: Interfaces for querying mapping information.
|
||||
+@end menu
|
||||
+
|
||||
+@node Dynamic Linker Introspection
|
||||
+@section Dynamic Linker Introspection
|
||||
+
|
||||
+@Theglibc{} provides various functions for querying information from the
|
||||
+dynamic linker.
|
||||
+
|
||||
+@deftypefun {int} dlinfo (void *@var{handle}, int @var{request}, void *@var{arg})
|
||||
+@safety{@mtsafe{}@asunsafe{@asucorrupt{}}@acunsafe{@acucorrupt{}}}
|
||||
+@standards{GNU, dlfcn.h}
|
||||
+This function returns information about @var{handle} in the memory
|
||||
+location @var{arg}, based on @var{request}. The @var{handle} argument
|
||||
+must be a pointer returned by @code{dlopen} or @code{dlmopen}; it must
|
||||
+not have been closed by @code{dlclose}.
|
||||
+
|
||||
+On success, @code{dlinfo} returns 0. If there is an error, the function
|
||||
+returns @math{-1}, and @code{dlerror} can be used to obtain a
|
||||
+corresponding error message.
|
||||
+
|
||||
+The following operations are defined for use with @var{request}:
|
||||
+
|
||||
+@vtable @code
|
||||
+@item RTLD_DI_LINKMAP
|
||||
+The corresponding @code{struct link_map} pointer for @var{handle} is
|
||||
+written to @code{*@var{arg}}. The @var{arg} argument must be the
|
||||
+address of an object of type @code{struct link_map *}.
|
||||
+
|
||||
+@item RTLD_DI_LMID
|
||||
+The namespace identifier of @var{handle} is written to
|
||||
+@code{*@var{arg}}. The @var{arg} argument must be the address of an
|
||||
+object of type @code{Lmid_t}.
|
||||
+
|
||||
+@item RTLD_DI_ORIGIN
|
||||
+The value of the @code{$ORIGIN} dynamic string token for @var{handle} is
|
||||
+written to the character array starting at @var{arg} as a
|
||||
+null-terminated string.
|
||||
+
|
||||
+This request type should not be used because it is prone to buffer
|
||||
+overflows.
|
||||
+
|
||||
+@item RTLD_DI_SERINFO
|
||||
+@itemx RTLD_DI_SERINFOSIZE
|
||||
+These requests can be used to obtain search path information for
|
||||
+@var{handle}. For both requests, @var{arg} must point to a
|
||||
+@code{Dl_serinfo} object. The @code{RTLD_DI_SERINFOSIZE} request must
|
||||
+be made first; it updates the @code{dls_size} and @code{dls_cnt} members
|
||||
+of the @code{Dl_serinfo} object. The caller should then allocate memory
|
||||
+to store at least @code{dls_size} bytes and pass that buffer to a
|
||||
+@code{RTLD_DI_SERINFO} request. This second request fills the
|
||||
+@code{dls_serpath} array. The number of array elements was returned in
|
||||
+the @code{dls_cnt} member in the initial @code{RTLD_DI_SERINFOSIZE}
|
||||
+request. The caller is responsible for freeing the allocated buffer.
|
||||
+
|
||||
+This interface is prone to buffer overflows in multi-threaded processes
|
||||
+because the required size can change between the
|
||||
+@code{RTLD_DI_SERINFOSIZE} and @code{RTLD_DI_SERINFO} requests.
|
||||
+
|
||||
+@item RTLD_DI_TLS_DATA
|
||||
+This request writes the address of the TLS block (in the current thread)
|
||||
+for the shared object identified by @var{handle} to @code{*@var{arg}}.
|
||||
+The argument @var{arg} must be the address of an object of type
|
||||
+@code{void *}. A null pointer is written if the object does not have
|
||||
+any associated TLS block.
|
||||
+
|
||||
+@item RTLD_DI_TLS_MODID
|
||||
+This request writes the TLS module ID for the shared object @var{handle}
|
||||
+to @code{*@var{arg}}. The argument @var{arg} must be the address of an
|
||||
+object of type @code{size_t}. The module ID is zero if the object
|
||||
+does not have an associated TLS block.
|
||||
+@end vtable
|
||||
+
|
||||
+The @code{dlinfo} function is a GNU extension.
|
||||
+@end deftypefun
|
||||
+
|
||||
+@c FIXME these are undocumented:
|
||||
+@c dladdr
|
||||
+@c dladdr1
|
||||
+@c dlclose
|
||||
+@c dlerror
|
||||
+@c dlmopen
|
||||
+@c dlopen
|
||||
+@c dlsym
|
||||
+@c dlvsym
|
||||
diff --git a/manual/libdl.texi b/manual/libdl.texi
|
||||
deleted file mode 100644
|
||||
index e3fe0452d9f41d47..0000000000000000
|
||||
--- a/manual/libdl.texi
|
||||
+++ /dev/null
|
||||
@@ -1,10 +0,0 @@
|
||||
-@c FIXME these are undocumented:
|
||||
-@c dladdr
|
||||
-@c dladdr1
|
||||
-@c dlclose
|
||||
-@c dlerror
|
||||
-@c dlinfo
|
||||
-@c dlmopen
|
||||
-@c dlopen
|
||||
-@c dlsym
|
||||
-@c dlvsym
|
||||
diff --git a/manual/probes.texi b/manual/probes.texi
|
||||
index 0ea560ed78bcfd7e..892d2451938eb379 100644
|
||||
--- a/manual/probes.texi
|
||||
+++ b/manual/probes.texi
|
||||
@@ -1,5 +1,5 @@
|
||||
@node Internal Probes
|
||||
-@c @node Internal Probes, Tunables, Threads, Top
|
||||
+@c @node Internal Probes, Tunables, Dynamic Linker, Top
|
||||
@c %MENU% Probes to monitor libc internal behavior
|
||||
@chapter Internal probes
|
||||
|
||||
diff --git a/manual/threads.texi b/manual/threads.texi
|
||||
index 87fda7d8e716e08c..1c26c57540746e3b 100644
|
||||
--- a/manual/threads.texi
|
||||
+++ b/manual/threads.texi
|
||||
@@ -1,5 +1,5 @@
|
||||
@node Threads
|
||||
-@c @node Threads, Internal Probes, Debugging Support, Top
|
||||
+@c @node Threads, Dynamic Linker, Debugging Support, Top
|
||||
@c %MENU% Functions, constants, and data types for working with threads
|
||||
@chapter Threads
|
||||
@cindex threads
|
268
SOURCES/glibc-rh2047981-41.patch
Normal file
268
SOURCES/glibc-rh2047981-41.patch
Normal file
@ -0,0 +1,268 @@
|
||||
Added $(objpfx)tst-dlinfo-phdr: $(libdl) to dlfcn/Makefile since
|
||||
we still need $(libdl) in RHEL8.
|
||||
|
||||
commit d056c212130280c0a54d9a4f72170ec621b70ce5
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri Apr 29 17:00:53 2022 +0200
|
||||
|
||||
dlfcn: Implement the RTLD_DI_PHDR request type for dlinfo
|
||||
|
||||
The information is theoretically available via dl_iterate_phdr as
|
||||
well, but that approach is very slow if there are many shared
|
||||
objects.
|
||||
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Tested-by: Carlos O'Donell <carlos@rehdat.com>
|
||||
|
||||
Conflicts:
|
||||
dlfcn/dlinfo.c
|
||||
(missing move into libc)
|
||||
|
||||
diff --git a/dlfcn/Makefile b/dlfcn/Makefile
|
||||
index 0b213b7d9fefcdc9..65cee5b54d891a24 100644
|
||||
--- a/dlfcn/Makefile
|
||||
+++ b/dlfcn/Makefile
|
||||
@@ -59,6 +59,10 @@ tststatic3-ENV = $(tststatic-ENV)
|
||||
tststatic4-ENV = $(tststatic-ENV)
|
||||
tststatic5-ENV = $(tststatic-ENV)
|
||||
|
||||
+tests-internal += \
|
||||
+ tst-dlinfo-phdr \
|
||||
+ # tests-internal
|
||||
+
|
||||
ifneq (,$(CXX))
|
||||
modules-names += bug-atexit3-lib
|
||||
else
|
||||
@@ -152,3 +156,5 @@ $(objpfx)bug-dl-leaf-lib-cb.so: $(objpfx)bug-dl-leaf-lib.so
|
||||
|
||||
$(objpfx)tst-rec-dlopen: $(libdl)
|
||||
$(objpfx)tst-rec-dlopen.out: $(objpfx)moddummy1.so $(objpfx)moddummy2.so
|
||||
+
|
||||
+$(objpfx)tst-dlinfo-phdr: $(libdl)
|
||||
diff --git a/dlfcn/dlfcn.h b/dlfcn/dlfcn.h
|
||||
index 0921fd724cf7b785..61c4f59bea4eb7ac 100644
|
||||
--- a/dlfcn/dlfcn.h
|
||||
+++ b/dlfcn/dlfcn.h
|
||||
@@ -162,7 +162,12 @@ enum
|
||||
segment, or if the calling thread has not allocated a block for it. */
|
||||
RTLD_DI_TLS_DATA = 10,
|
||||
|
||||
- RTLD_DI_MAX = 10
|
||||
+ /* Treat ARG as const ElfW(Phdr) **, and store the address of the
|
||||
+ program header array at that location. The dlinfo call returns
|
||||
+ the number of program headers in the array. */
|
||||
+ RTLD_DI_PHDR = 11,
|
||||
+
|
||||
+ RTLD_DI_MAX = 11
|
||||
};
|
||||
|
||||
|
||||
diff --git a/dlfcn/dlinfo.c b/dlfcn/dlinfo.c
|
||||
index 23ef3f57ca41afdf..50cd9af17a56f990 100644
|
||||
--- a/dlfcn/dlinfo.c
|
||||
+++ b/dlfcn/dlinfo.c
|
||||
@@ -38,6 +38,10 @@ struct dlinfo_args
|
||||
void *handle;
|
||||
int request;
|
||||
void *arg;
|
||||
+
|
||||
+ /* This is the value that is returned from dlinfo if no error is
|
||||
+ signaled. */
|
||||
+ int result;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -50,6 +54,7 @@ dlinfo_doit (void *argsblock)
|
||||
{
|
||||
case RTLD_DI_CONFIGADDR:
|
||||
default:
|
||||
+ args->result = -1;
|
||||
_dl_signal_error (0, NULL, NULL, N_("unsupported dlinfo request"));
|
||||
break;
|
||||
|
||||
@@ -85,6 +90,11 @@ dlinfo_doit (void *argsblock)
|
||||
*(void **) args->arg = data;
|
||||
break;
|
||||
}
|
||||
+
|
||||
+ case RTLD_DI_PHDR:
|
||||
+ *(const ElfW(Phdr) **) args->arg = l->l_phdr;
|
||||
+ args->result = l->l_phnum;
|
||||
+ break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +107,8 @@ __dlinfo (void *handle, int request, void *arg)
|
||||
# endif
|
||||
|
||||
struct dlinfo_args args = { handle, request, arg };
|
||||
- return _dlerror_run (&dlinfo_doit, &args) ? -1 : 0;
|
||||
+ _dlerror_run (&dlinfo_doit, &args);
|
||||
+ return args.result;
|
||||
}
|
||||
# ifdef SHARED
|
||||
strong_alias (__dlinfo, dlinfo)
|
||||
diff --git a/dlfcn/tst-dlinfo-phdr.c b/dlfcn/tst-dlinfo-phdr.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..a15a7d48ebd3b976
|
||||
--- /dev/null
|
||||
+++ b/dlfcn/tst-dlinfo-phdr.c
|
||||
@@ -0,0 +1,125 @@
|
||||
+/* Test for dlinfo (RTLD_DI_PHDR).
|
||||
+ Copyright (C) 2022 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 <dlfcn.h>
|
||||
+#include <link.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <sys/auxv.h>
|
||||
+
|
||||
+#include <support/check.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+
|
||||
+/* Used to verify that the program header array appears as expected
|
||||
+ among the dl_iterate_phdr callback invocations. */
|
||||
+
|
||||
+struct dlip_callback_args
|
||||
+{
|
||||
+ struct link_map *l; /* l->l_addr is used to find the object. */
|
||||
+ const ElfW(Phdr) *phdr; /* Expected program header pointed. */
|
||||
+ int phnum; /* Expected program header count. */
|
||||
+ bool found; /* True if l->l_addr has been found. */
|
||||
+};
|
||||
+
|
||||
+static int
|
||||
+dlip_callback (struct dl_phdr_info *dlpi, size_t size, void *closure)
|
||||
+{
|
||||
+ TEST_COMPARE (sizeof (*dlpi), size);
|
||||
+ struct dlip_callback_args *args = closure;
|
||||
+
|
||||
+ if (dlpi->dlpi_addr == args->l->l_addr)
|
||||
+ {
|
||||
+ TEST_VERIFY (!args->found);
|
||||
+ args->found = true;
|
||||
+ TEST_VERIFY (args->phdr == dlpi->dlpi_phdr);
|
||||
+ TEST_COMPARE (args->phnum, dlpi->dlpi_phnum);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ /* Avoid a copy relocation. */
|
||||
+ struct r_debug *debug = xdlsym (RTLD_DEFAULT, "_r_debug");
|
||||
+ struct link_map *l = (struct link_map *) debug->r_map;
|
||||
+ TEST_VERIFY_EXIT (l != NULL);
|
||||
+
|
||||
+ do
|
||||
+ {
|
||||
+ printf ("info: checking link map %p (%p) for \"%s\"\n",
|
||||
+ l, l->l_phdr, l->l_name);
|
||||
+
|
||||
+ /* Cause dlerror () to return an error message. */
|
||||
+ dlsym (RTLD_DEFAULT, "does-not-exist");
|
||||
+
|
||||
+ /* Use the extension that link maps are valid dlopen handles. */
|
||||
+ const ElfW(Phdr) *phdr;
|
||||
+ int phnum = dlinfo (l, RTLD_DI_PHDR, &phdr);
|
||||
+ TEST_VERIFY (phnum >= 0);
|
||||
+ /* Verify that the error message has been cleared. */
|
||||
+ TEST_COMPARE_STRING (dlerror (), NULL);
|
||||
+
|
||||
+ TEST_VERIFY (phdr == l->l_phdr);
|
||||
+ TEST_COMPARE (phnum, l->l_phnum);
|
||||
+
|
||||
+ /* Check that we can find PT_DYNAMIC among the array. */
|
||||
+ {
|
||||
+ bool dynamic_found = false;
|
||||
+ for (int i = 0; i < phnum; ++i)
|
||||
+ if (phdr[i].p_type == PT_DYNAMIC)
|
||||
+ {
|
||||
+ dynamic_found = true;
|
||||
+ TEST_COMPARE ((ElfW(Addr)) l->l_ld, l->l_addr + phdr[i].p_vaddr);
|
||||
+ }
|
||||
+ TEST_VERIFY (dynamic_found);
|
||||
+ }
|
||||
+
|
||||
+ /* Check that dl_iterate_phdr finds the link map with the same
|
||||
+ program headers. */
|
||||
+ {
|
||||
+ struct dlip_callback_args args =
|
||||
+ {
|
||||
+ .l = l,
|
||||
+ .phdr = phdr,
|
||||
+ .phnum = phnum,
|
||||
+ .found = false,
|
||||
+ };
|
||||
+ TEST_COMPARE (dl_iterate_phdr (dlip_callback, &args), 0);
|
||||
+ TEST_VERIFY (args.found);
|
||||
+ }
|
||||
+
|
||||
+ if (l->l_prev == NULL)
|
||||
+ {
|
||||
+ /* This is the executable, so the information is also
|
||||
+ available via getauxval. */
|
||||
+ TEST_COMPARE_STRING (l->l_name, "");
|
||||
+ TEST_VERIFY (phdr == (const ElfW(Phdr) *) getauxval (AT_PHDR));
|
||||
+ TEST_COMPARE (phnum, getauxval (AT_PHNUM));
|
||||
+ }
|
||||
+
|
||||
+ l = l->l_next;
|
||||
+ }
|
||||
+ while (l != NULL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/manual/dynlink.texi b/manual/dynlink.texi
|
||||
index dbf3de11769d8e57..7dcac64889e389fd 100644
|
||||
--- a/manual/dynlink.texi
|
||||
+++ b/manual/dynlink.texi
|
||||
@@ -30,9 +30,9 @@ location @var{arg}, based on @var{request}. The @var{handle} argument
|
||||
must be a pointer returned by @code{dlopen} or @code{dlmopen}; it must
|
||||
not have been closed by @code{dlclose}.
|
||||
|
||||
-On success, @code{dlinfo} returns 0. If there is an error, the function
|
||||
-returns @math{-1}, and @code{dlerror} can be used to obtain a
|
||||
-corresponding error message.
|
||||
+On success, @code{dlinfo} returns 0 for most request types; exceptions
|
||||
+are noted below. If there is an error, the function returns @math{-1},
|
||||
+and @code{dlerror} can be used to obtain a corresponding error message.
|
||||
|
||||
The following operations are defined for use with @var{request}:
|
||||
|
||||
@@ -84,6 +84,15 @@ This request writes the TLS module ID for the shared object @var{handle}
|
||||
to @code{*@var{arg}}. The argument @var{arg} must be the address of an
|
||||
object of type @code{size_t}. The module ID is zero if the object
|
||||
does not have an associated TLS block.
|
||||
+
|
||||
+@item RTLD_DI_PHDR
|
||||
+This request writes the address of the program header array to
|
||||
+@code{*@var{arg}}. The argument @var{arg} must be the address of an
|
||||
+object of type @code{const ElfW(Phdr) *} (that is,
|
||||
+@code{const Elf32_Phdr *} or @code{const Elf64_Phdr *}, as appropriate
|
||||
+for the current architecture). For this request, the value returned by
|
||||
+@code{dlinfo} is the number of program headers in the program header
|
||||
+array.
|
||||
@end vtable
|
||||
|
||||
The @code{dlinfo} function is a GNU extension.
|
296
SOURCES/glibc-rh2047981-42.patch
Normal file
296
SOURCES/glibc-rh2047981-42.patch
Normal file
@ -0,0 +1,296 @@
|
||||
commit ad43cac44a6860eaefcadadfb2acb349921e96bf
|
||||
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
Date: Fri Jun 15 16:14:58 2018 +0100
|
||||
|
||||
rtld: Use generic argv adjustment in ld.so [BZ #23293]
|
||||
|
||||
When an executable is invoked as
|
||||
|
||||
./ld.so [ld.so-args] ./exe [exe-args]
|
||||
|
||||
then the argv is adujusted in ld.so before calling the entry point of
|
||||
the executable so ld.so args are not visible to it. On most targets
|
||||
this requires moving argv, env and auxv on the stack to ensure correct
|
||||
stack alignment at the entry point. This had several issues:
|
||||
|
||||
- The code for this adjustment on the stack is written in asm as part
|
||||
of the target specific ld.so _start code which is hard to maintain.
|
||||
|
||||
- The adjustment is done after _dl_start returns, where it's too late
|
||||
to update GLRO(dl_auxv), as it is already readonly, so it points to
|
||||
memory that was clobbered by the adjustment. This is bug 23293.
|
||||
|
||||
- _environ is also wrong in ld.so after the adjustment, but it is
|
||||
likely not used after _dl_start returns so this is not user visible.
|
||||
|
||||
- _dl_argv was updated, but for this it was moved out of relro, which
|
||||
changes security properties across targets unnecessarily.
|
||||
|
||||
This patch introduces a generic _dl_start_args_adjust function that
|
||||
handles the argument adjustments after ld.so processed its own args
|
||||
and before relro protection is applied.
|
||||
|
||||
The same algorithm is used on all targets, _dl_skip_args is now 0, so
|
||||
existing target specific adjustment code is no longer used. The bug
|
||||
affects aarch64, alpha, arc, arm, csky, ia64, nios2, s390-32 and sparc,
|
||||
other targets don't need the change in principle, only for consistency.
|
||||
|
||||
The GNU Hurd start code relied on _dl_skip_args after dl_main returned,
|
||||
now it checks directly if args were adjusted and fixes the Hurd startup
|
||||
data accordingly.
|
||||
|
||||
Follow up patches can remove _dl_skip_args and DL_ARGV_NOT_RELRO.
|
||||
|
||||
Tested on aarch64-linux-gnu and cross tested on i686-gnu.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index aee5ca357f66121e..22cceeab40319582 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -1127,6 +1127,62 @@ rtld_chain_load (struct link_map *main_map, char *argv0)
|
||||
rtld_soname, pathname, errcode);
|
||||
}
|
||||
|
||||
+/* Adjusts the contents of the stack and related globals for the user
|
||||
+ entry point. The ld.so processed skip_args arguments and bumped
|
||||
+ _dl_argv and _dl_argc accordingly. Those arguments are removed from
|
||||
+ argv here. */
|
||||
+static void
|
||||
+_dl_start_args_adjust (int skip_args)
|
||||
+{
|
||||
+ void **sp = (void **) (_dl_argv - skip_args - 1);
|
||||
+ void **p = sp + skip_args;
|
||||
+
|
||||
+ if (skip_args == 0)
|
||||
+ return;
|
||||
+
|
||||
+ /* Sanity check. */
|
||||
+ intptr_t argc = (intptr_t) sp[0] - skip_args;
|
||||
+ assert (argc == _dl_argc);
|
||||
+
|
||||
+ /* Adjust argc on stack. */
|
||||
+ sp[0] = (void *) (intptr_t) _dl_argc;
|
||||
+
|
||||
+ /* Update globals in rtld. */
|
||||
+ _dl_argv -= skip_args;
|
||||
+ _environ -= skip_args;
|
||||
+
|
||||
+ /* Shuffle argv down. */
|
||||
+ do
|
||||
+ *++sp = *++p;
|
||||
+ while (*p != NULL);
|
||||
+
|
||||
+ assert (_environ == (char **) (sp + 1));
|
||||
+
|
||||
+ /* Shuffle envp down. */
|
||||
+ do
|
||||
+ *++sp = *++p;
|
||||
+ while (*p != NULL);
|
||||
+
|
||||
+#ifdef HAVE_AUX_VECTOR
|
||||
+ void **auxv = (void **) GLRO(dl_auxv) - skip_args;
|
||||
+ GLRO(dl_auxv) = (ElfW(auxv_t) *) auxv; /* Aliasing violation. */
|
||||
+ assert (auxv == sp + 1);
|
||||
+
|
||||
+ /* Shuffle auxv down. */
|
||||
+ ElfW(auxv_t) ax;
|
||||
+ char *oldp = (char *) (p + 1);
|
||||
+ char *newp = (char *) (sp + 1);
|
||||
+ do
|
||||
+ {
|
||||
+ memcpy (&ax, oldp, sizeof (ax));
|
||||
+ memcpy (newp, &ax, sizeof (ax));
|
||||
+ oldp += sizeof (ax);
|
||||
+ newp += sizeof (ax);
|
||||
+ }
|
||||
+ while (ax.a_type != AT_NULL);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
static void
|
||||
dl_main (const ElfW(Phdr) *phdr,
|
||||
ElfW(Word) phnum,
|
||||
@@ -1185,6 +1241,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
rtld_is_main = true;
|
||||
|
||||
char *argv0 = NULL;
|
||||
+ char **orig_argv = _dl_argv;
|
||||
|
||||
/* Note the place where the dynamic linker actually came from. */
|
||||
GL(dl_rtld_map).l_name = rtld_progname;
|
||||
@@ -1199,7 +1256,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
GLRO(dl_lazy) = -1;
|
||||
}
|
||||
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
}
|
||||
@@ -1208,14 +1264,12 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
if (state.mode != rtld_mode_help)
|
||||
state.mode = rtld_mode_verify;
|
||||
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
}
|
||||
else if (! strcmp (_dl_argv[1], "--inhibit-cache"))
|
||||
{
|
||||
GLRO(dl_inhibit_cache) = 1;
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
}
|
||||
@@ -1225,7 +1279,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
state.library_path = _dl_argv[2];
|
||||
state.library_path_source = "--library-path";
|
||||
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1234,7 +1287,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
{
|
||||
GLRO(dl_inhibit_rpath) = _dl_argv[2];
|
||||
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1242,14 +1294,12 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
{
|
||||
audit_list_add_string (&state.audit_list, _dl_argv[2]);
|
||||
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
else if (! strcmp (_dl_argv[1], "--preload") && _dl_argc > 2)
|
||||
{
|
||||
state.preloadarg = _dl_argv[2];
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1257,7 +1307,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
{
|
||||
argv0 = _dl_argv[2];
|
||||
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1265,7 +1314,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
&& _dl_argc > 2)
|
||||
{
|
||||
state.glibc_hwcaps_prepend = _dl_argv[2];
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1273,7 +1321,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
&& _dl_argc > 2)
|
||||
{
|
||||
state.glibc_hwcaps_mask = _dl_argv[2];
|
||||
- _dl_skip_args += 2;
|
||||
_dl_argc -= 2;
|
||||
_dl_argv += 2;
|
||||
}
|
||||
@@ -1282,7 +1329,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
{
|
||||
state.mode = rtld_mode_list_tunables;
|
||||
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
}
|
||||
@@ -1291,7 +1337,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
{
|
||||
state.mode = rtld_mode_list_diagnostics;
|
||||
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
}
|
||||
@@ -1337,7 +1382,6 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
_dl_usage (ld_so_name, NULL);
|
||||
}
|
||||
|
||||
- ++_dl_skip_args;
|
||||
--_dl_argc;
|
||||
++_dl_argv;
|
||||
|
||||
@@ -1433,6 +1477,9 @@ dl_main (const ElfW(Phdr) *phdr,
|
||||
/* Set the argv[0] string now that we've processed the executable. */
|
||||
if (argv0 != NULL)
|
||||
_dl_argv[0] = argv0;
|
||||
+
|
||||
+ /* Adjust arguments for the application entry point. */
|
||||
+ _dl_start_args_adjust (_dl_argv - orig_argv);
|
||||
}
|
||||
else
|
||||
{
|
||||
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
|
||||
index 7bd1d70c96c229e0..8aab46bf6396c8d4 100644
|
||||
--- a/sysdeps/mach/hurd/dl-sysdep.c
|
||||
+++ b/sysdeps/mach/hurd/dl-sysdep.c
|
||||
@@ -107,6 +107,7 @@ _dl_sysdep_start (void **start_argptr,
|
||||
{
|
||||
void go (intptr_t *argdata)
|
||||
{
|
||||
+ char *orig_argv0;
|
||||
char **p;
|
||||
|
||||
/* Cache the information in various global variables. */
|
||||
@@ -115,6 +116,8 @@ _dl_sysdep_start (void **start_argptr,
|
||||
_environ = &_dl_argv[_dl_argc + 1];
|
||||
for (p = _environ; *p++;); /* Skip environ pointers and terminator. */
|
||||
|
||||
+ orig_argv0 = _dl_argv[0];
|
||||
+
|
||||
if ((void *) p == _dl_argv[0])
|
||||
{
|
||||
static struct hurd_startup_data nodata;
|
||||
@@ -189,30 +192,23 @@ unfmh(); /* XXX */
|
||||
|
||||
/* The call above might screw a few things up.
|
||||
|
||||
- First of all, if _dl_skip_args is nonzero, we are ignoring
|
||||
- the first few arguments. However, if we have no Hurd startup
|
||||
- data, it is the magical convention that ARGV[0] == P. The
|
||||
+ P is the location after the terminating NULL of the list of
|
||||
+ environment variables. It has to point to the Hurd startup
|
||||
+ data or if that's missing then P == ARGV[0] must hold. The
|
||||
startup code in init-first.c will get confused if this is not
|
||||
the case, so we must rearrange things to make it so. We'll
|
||||
- overwrite the origional ARGV[0] at P with ARGV[_dl_skip_args].
|
||||
+ recompute P and move the Hurd data or the new ARGV[0] there.
|
||||
|
||||
- Secondly, if we need to be secure, it removes some dangerous
|
||||
- environment variables. If we have no Hurd startup date this
|
||||
- changes P (since that's the location after the terminating
|
||||
- NULL in the list of environment variables). We do the same
|
||||
- thing as in the first case but make sure we recalculate P.
|
||||
- If we do have Hurd startup data, we have to move the data
|
||||
- such that it starts just after the terminating NULL in the
|
||||
- environment list.
|
||||
+ Note: directly invoked ld.so can move arguments and env vars.
|
||||
|
||||
We use memmove, since the locations might overlap. */
|
||||
- if (__libc_enable_secure || _dl_skip_args)
|
||||
- {
|
||||
- char **newp;
|
||||
|
||||
- for (newp = _environ; *newp++;);
|
||||
+ char **newp;
|
||||
+ for (newp = _environ; *newp++;);
|
||||
|
||||
- if (_dl_argv[-_dl_skip_args] == (char *) p)
|
||||
+ if (newp != p || _dl_argv[0] != orig_argv0)
|
||||
+ {
|
||||
+ if (orig_argv0 == (char *) p)
|
||||
{
|
||||
if ((char *) newp != _dl_argv[0])
|
||||
{
|
22
SOURCES/glibc-rh2047981-43.patch
Normal file
22
SOURCES/glibc-rh2047981-43.patch
Normal file
@ -0,0 +1,22 @@
|
||||
commit 62c888b3375f82a659a55ec66b1315efa2ed026a
|
||||
Author: Carlos O'Donell <carlos@redhat.com>
|
||||
Date: Thu Jun 2 10:59:14 2022 -0400
|
||||
|
||||
elf: Add #include <sys/param.h> for MAX usage.
|
||||
|
||||
In _dl_audit_pltenter we use MAX and so need to include param.h.
|
||||
|
||||
Tested on x86_64 and i686 without regression.
|
||||
|
||||
diff --git a/elf/dl-audit.c b/elf/dl-audit.c
|
||||
index ec9b032eae37c103..e20b7b40e08d79e7 100644
|
||||
--- a/elf/dl-audit.c
|
||||
+++ b/elf/dl-audit.c
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <dl-machine.h>
|
||||
#include <dl-runtime.h>
|
||||
#include <dl-fixup-attribute.h>
|
||||
+#include <sys/param.h>
|
||||
|
||||
void
|
||||
_dl_audit_activity_map (struct link_map *l, int action)
|
98
SOURCES/glibc-rh2047981-44.patch
Normal file
98
SOURCES/glibc-rh2047981-44.patch
Normal file
@ -0,0 +1,98 @@
|
||||
Downstream-only patch to change rtld_active () to return true during
|
||||
early audit operations. GLRO (_dl_profile_output) is initialized much
|
||||
earlier than GLRO (dl_init_all_dirs), before auditors run, so it is a
|
||||
good replacement.
|
||||
|
||||
This is addressed downstream very differently, in this commit:
|
||||
|
||||
commit 8dcb6d0af07fda3607b541857e4f3970a74ed55b
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Tue Apr 26 14:23:02 2022 +0200
|
||||
|
||||
dlfcn: Do not use rtld_active () to determine ld.so state (bug 29078)
|
||||
|
||||
When audit modules are loaded, ld.so initialization is not yet
|
||||
complete, and rtld_active () returns false even though ld.so is
|
||||
mostly working. Instead, the static dlopen hook is used, but that
|
||||
does not work at all because this is not a static dlopen situation.
|
||||
|
||||
Commit 466c1ea15f461edb8e3ffaf5d86d708876343bbf ("dlfcn: Rework
|
||||
static dlopen hooks") moved the hook pointer into _rtld_global_ro,
|
||||
which means that separate protection is not needed anymore and the
|
||||
hook pointer can be checked directly.
|
||||
|
||||
The guard for disabling libio vtable hardening in _IO_vtable_check
|
||||
should stay for now.
|
||||
|
||||
Fixes commit 8e1472d2c1e25e6eabc2059170731365f6d5b3d1 ("ld.so:
|
||||
Examine GLRO to detect inactive loader [BZ #20204]").
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 22cceeab40319582..b47e84ca2fb6f03c 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -2352,9 +2352,7 @@ ERROR: '%s': cannot process note segment.\n", _dl_argv[0]);
|
||||
GLRO(dl_initial_searchlist) = *GL(dl_ns)[LM_ID_BASE]._ns_main_searchlist;
|
||||
|
||||
/* Remember the last search directory added at startup, now that
|
||||
- malloc will no longer be the one from dl-minimal.c. As a side
|
||||
- effect, this marks ld.so as initialized, so that the rtld_active
|
||||
- function returns true from now on. */
|
||||
+ malloc will no longer be the one from dl-minimal.c. */
|
||||
GLRO(dl_init_all_dirs) = GL(dl_all_dirs);
|
||||
|
||||
/* Print scope information. */
|
||||
@@ -2675,7 +2673,9 @@ process_envvars (struct dl_main_state *state)
|
||||
char *envline;
|
||||
char *debug_output = NULL;
|
||||
|
||||
- /* This is the default place for profiling data file. */
|
||||
+ /* This is the default place for profiling data file. As a side
|
||||
+ effect, this marks ld.so as initialized, so that the rtld_active
|
||||
+ function returns true from now on. */
|
||||
GLRO(dl_profile_output)
|
||||
= &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
|
||||
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index d4f70211c34d1c59..9dec9e3d3b6d6aa2 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -600,18 +600,18 @@ struct rtld_global_ro
|
||||
|
||||
/* Name of the shared object to be profiled (if any). */
|
||||
EXTERN const char *_dl_profile;
|
||||
- /* Filename of the output file. */
|
||||
+ /* Filename of the output file. This is assigned a
|
||||
+ non-NULL pointer by the ld.so startup code (after initialization
|
||||
+ to NULL), so this can also serve as an indicator whether a copy
|
||||
+ of ld.so is initialized and active. See the rtld_active function
|
||||
+ below. */
|
||||
EXTERN const char *_dl_profile_output;
|
||||
/* Name of the object we want to trace the prelinking. */
|
||||
EXTERN const char *_dl_trace_prelink;
|
||||
/* Map of shared object to be prelink traced. */
|
||||
EXTERN struct link_map *_dl_trace_prelink_map;
|
||||
|
||||
- /* All search directories defined at startup. This is assigned a
|
||||
- non-NULL pointer by the ld.so startup code (after initialization
|
||||
- to NULL), so this can also serve as an indicator whether a copy
|
||||
- of ld.so is initialized and active. See the rtld_active function
|
||||
- below. */
|
||||
+ /* All search directories defined at startup. */
|
||||
EXTERN struct r_search_path_elem *_dl_init_all_dirs;
|
||||
|
||||
#ifdef NEED_DL_SYSINFO
|
||||
@@ -1259,9 +1259,9 @@ static inline bool
|
||||
rtld_active (void)
|
||||
{
|
||||
/* The default-initialized variable does not have a non-zero
|
||||
- dl_init_all_dirs member, so this allows us to recognize an
|
||||
+ dl_profile_output member, so this allows us to recognize an
|
||||
initialized and active ld.so copy. */
|
||||
- return GLRO(dl_init_all_dirs) != NULL;
|
||||
+ return GLRO(dl_profile_output) != NULL;
|
||||
}
|
||||
|
||||
static inline struct auditstate *
|
74
SOURCES/glibc-rh2047981-45.patch
Normal file
74
SOURCES/glibc-rh2047981-45.patch
Normal file
@ -0,0 +1,74 @@
|
||||
commit a64af8c9b6598f6d2685227f64f5ccb9b48c663c
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Mon May 10 10:31:41 2021 +0200
|
||||
|
||||
scripts/versions.awk: Add strings and hashes to <first-versions.h>
|
||||
|
||||
This generates new macros of this from:
|
||||
|
||||
They are useful for symbol lookups using _dl_lookup_direct.
|
||||
|
||||
Tested-by: Carlos O'Donell <carlos@redhat.com>
|
||||
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
|
||||
|
||||
diff --git a/scripts/versions.awk b/scripts/versions.awk
|
||||
index a3df316c703ea98b..0c900b83347ce8f9 100644
|
||||
--- a/scripts/versions.awk
|
||||
+++ b/scripts/versions.awk
|
||||
@@ -32,6 +32,29 @@ BEGIN {
|
||||
sort = "sort -t. -k 1,1 -k 2n,2n -k 3 > " tmpfile;
|
||||
}
|
||||
|
||||
+# GNU awk does not implement the ord and chr functions.
|
||||
+# <https://www.gnu.org/software/gawk/manual/html_node/Ordinal-Functions.html>
|
||||
+# says that they are "written very nicely", using code similar to what
|
||||
+# is included here.
|
||||
+function chr(c) {
|
||||
+ return sprintf("%c", c)
|
||||
+}
|
||||
+
|
||||
+BEGIN {
|
||||
+ for (c = 1; c < 127; c++) {
|
||||
+ ord_table[chr(c)] = c;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+function ord(c) {
|
||||
+ if (ord_table[c]) {
|
||||
+ return ord_table[c];
|
||||
+ } else {
|
||||
+ printf("Invalid character reference: '%c'\n", c) > "/dev/stderr";
|
||||
+ ++lossage;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
# Remove comment lines.
|
||||
/^ *#/ {
|
||||
next;
|
||||
@@ -90,6 +113,17 @@ function close_and_move(name, real_name) {
|
||||
system(move_if_change " " name " " real_name " >&2");
|
||||
}
|
||||
|
||||
+# ELF hash, for use with symbol versions.
|
||||
+function elf_hash(s, i, acc) {
|
||||
+ acc = 0;
|
||||
+ for (i = 1; i <= length(s); ++i) {
|
||||
+ acc = and(lshift(acc, 4) + ord(substr(s, i, 1)), 0xffffffff);
|
||||
+ top = and(acc, 0xf0000000);
|
||||
+ acc = and(xor(acc, rshift(top, 24)), compl(top));
|
||||
+ }
|
||||
+ return acc;
|
||||
+}
|
||||
+
|
||||
# Now print the accumulated information.
|
||||
END {
|
||||
close(sort);
|
||||
@@ -145,6 +179,8 @@ END {
|
||||
&& oldver ~ "^GLIBC_[0-9]" \
|
||||
&& sym ~ "^[A-Za-z0-9_]*$") {
|
||||
ver_val = oldver;
|
||||
+ printf("#define %s_STRING \"%s\"\n", first_ver_macro, ver_val) > first_ver_header;
|
||||
+ printf("#define %s_HASH 0x%x\n", first_ver_macro, elf_hash(ver_val)) > first_ver_header;
|
||||
gsub("\\.", "_", ver_val);
|
||||
printf("#define %s %s\n", first_ver_macro, ver_val) > first_ver_header;
|
||||
first_ver_seen[first_ver_macro] = 1;
|
227
SOURCES/glibc-rh2047981-46.patch
Normal file
227
SOURCES/glibc-rh2047981-46.patch
Normal file
@ -0,0 +1,227 @@
|
||||
Backport of the new test from this upstream commit:
|
||||
|
||||
commit 8dcb6d0af07fda3607b541857e4f3970a74ed55b
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Tue Apr 26 14:23:02 2022 +0200
|
||||
|
||||
dlfcn: Do not use rtld_active () to determine ld.so state (bug 29078)
|
||||
|
||||
When audit modules are loaded, ld.so initialization is not yet
|
||||
complete, and rtld_active () returns false even though ld.so is
|
||||
mostly working. Instead, the static dlopen hook is used, but that
|
||||
does not work at all because this is not a static dlopen situation.
|
||||
|
||||
Commit 466c1ea15f461edb8e3ffaf5d86d708876343bbf ("dlfcn: Rework
|
||||
static dlopen hooks") moved the hook pointer into _rtld_global_ro,
|
||||
which means that separate protection is not needed anymore and the
|
||||
hook pointer can be checked directly.
|
||||
|
||||
The guard for disabling libio vtable hardening in _IO_vtable_check
|
||||
should stay for now.
|
||||
|
||||
Fixes commit 8e1472d2c1e25e6eabc2059170731365f6d5b3d1 ("ld.so:
|
||||
Examine GLRO to detect inactive loader [BZ #20204]").
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
Conflicts:
|
||||
dlfcn/dladdr.c
|
||||
dlfcn/dladdr1.c
|
||||
dlfcn/dlclose.c
|
||||
dlfcn/dlerror.c
|
||||
dlfcn/dlinfo.c
|
||||
dlfcn/dlmopen.c
|
||||
dlfcn/dlopen.c
|
||||
dlfcn/dlopenold.c
|
||||
dlfcn/dlsym.c
|
||||
dlfcn/dlvsym.c
|
||||
elf/dl-libc.c
|
||||
(Code changes not needed.)
|
||||
elf/Makefile
|
||||
(Usual test list conflicts. Also added $(libdl).)
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 6d39b400060a73f3..3fae27d32676caf9 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -353,8 +353,7 @@ tests += \
|
||||
tst-audit24d \
|
||||
tst-audit25a \
|
||||
tst-audit25b \
|
||||
- tst-audit8 \
|
||||
- tst-audit9 \
|
||||
+ tst-audit26 \
|
||||
tst-auditmany \
|
||||
tst-auxobj \
|
||||
tst-auxobj-dlopen \
|
||||
@@ -659,6 +658,7 @@ modules-names = \
|
||||
tst-auditmod24c \
|
||||
tst-auditmod24d \
|
||||
tst-auditmod25 \
|
||||
+ tst-auditmod26 \
|
||||
tst-big-note-lib \
|
||||
tst-deep1mod1 \
|
||||
tst-deep1mod2 \
|
||||
@@ -2145,6 +2145,11 @@ $(objpfx)tst-audit25b: $(objpfx)tst-audit25mod1.so \
|
||||
LDFLAGS-tst-audit25b = -Wl,-z,now
|
||||
tst-audit25b-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
+$(objpfx)tst-audit26: $(libdl)
|
||||
+$(objpfx)tst-audit26.out: $(objpfx)tst-auditmod26.so
|
||||
+$(objpfx)tst-auditmod26.so: $(libsupport) $(libdl)
|
||||
+tst-audit26-ENV = LD_AUDIT=$(objpfx)tst-auditmod26.so
|
||||
+
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
-Wl,--version-script=tst-sonamemove-linkmod1.map \
|
||||
diff --git a/elf/tst-audit26.c b/elf/tst-audit26.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..3f920e83bac247a5
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit26.c
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* Check the usability of <dlfcn.h> functions in audit modules.
|
||||
+ Copyright (C) 2022 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 <gnu/lib-names.h>
|
||||
+
|
||||
+#include <support/check.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ /* Check that the audit module has been loaded. */
|
||||
+ void *handle = xdlopen ("mapped to libc", RTLD_LOCAL | RTLD_NOW);
|
||||
+ TEST_VERIFY (handle
|
||||
+ == xdlopen (LIBC_SO, RTLD_LOCAL | RTLD_NOW | RTLD_NOLOAD));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod26.c b/elf/tst-auditmod26.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..db7ba95abec20f53
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod26.c
|
||||
@@ -0,0 +1,104 @@
|
||||
+/* Check the usability of <dlfcn.h> functions in audit modules. Audit module.
|
||||
+ Copyright (C) 2022 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 <dlfcn.h>
|
||||
+#include <first-versions.h>
|
||||
+#include <gnu/lib-names.h>
|
||||
+#include <link.h>
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+#include <support/check.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int current)
|
||||
+{
|
||||
+ /* Exercise various <dlfcn.h> functions. */
|
||||
+
|
||||
+ /* Check dlopen, dlsym, dlclose. */
|
||||
+ void *handle = xdlopen (LIBM_SO, RTLD_LOCAL | RTLD_NOW);
|
||||
+ void *ptr = xdlsym (handle, "sincos");
|
||||
+ TEST_VERIFY (ptr != NULL);
|
||||
+ ptr = dlsym (handle, "SINCOS");
|
||||
+ TEST_VERIFY (ptr == NULL);
|
||||
+ const char *message = dlerror ();
|
||||
+ TEST_VERIFY (strstr (message, ": undefined symbol: SINCOS") != NULL);
|
||||
+ ptr = dlsym (handle, "SINCOS");
|
||||
+ TEST_VERIFY (ptr == NULL);
|
||||
+ xdlclose (handle);
|
||||
+ TEST_COMPARE_STRING (dlerror (), NULL);
|
||||
+
|
||||
+ handle = xdlopen (LIBC_SO, RTLD_LOCAL | RTLD_NOW | RTLD_NOLOAD);
|
||||
+
|
||||
+ /* Check dlvsym. _exit is unlikely to gain another symbol
|
||||
+ version. */
|
||||
+ TEST_VERIFY (xdlsym (handle, "_exit")
|
||||
+ == xdlvsym (handle, "_exit", FIRST_VERSION_libc__exit_STRING));
|
||||
+
|
||||
+ /* Check dlinfo. */
|
||||
+ {
|
||||
+ void *handle2 = NULL;
|
||||
+ TEST_COMPARE (dlinfo (handle, RTLD_DI_LINKMAP, &handle2), 0);
|
||||
+ TEST_VERIFY (handle2 == handle);
|
||||
+ }
|
||||
+
|
||||
+ /* Check dladdr and dladdr1. */
|
||||
+ Dl_info info = { };
|
||||
+ TEST_VERIFY (dladdr (&_exit, &info) != 0);
|
||||
+ if (strcmp (info.dli_sname, "_Exit") != 0) /* _Exit is an alias. */
|
||||
+ TEST_COMPARE_STRING (info.dli_sname, "_exit");
|
||||
+ TEST_VERIFY (info.dli_saddr == &_exit);
|
||||
+ TEST_VERIFY (strstr (info.dli_fname, LIBC_SO));
|
||||
+ void *extra_info;
|
||||
+ memset (&info, 0, sizeof (info));
|
||||
+ TEST_VERIFY (dladdr1 (&_exit, &info, &extra_info, RTLD_DL_LINKMAP) != 0);
|
||||
+ TEST_VERIFY (extra_info == handle);
|
||||
+
|
||||
+ /* Verify that dlmopen creates a new namespace. */
|
||||
+ void *dlmopen_handle = xdlmopen (LM_ID_NEWLM, LIBC_SO, RTLD_NOW);
|
||||
+ TEST_VERIFY (dlmopen_handle != handle);
|
||||
+ memset (&info, 0, sizeof (info));
|
||||
+ extra_info = NULL;
|
||||
+ ptr = xdlsym (dlmopen_handle, "_exit");
|
||||
+ TEST_VERIFY (dladdr1 (ptr, &info, &extra_info, RTLD_DL_LINKMAP) != 0);
|
||||
+ TEST_VERIFY (extra_info == dlmopen_handle);
|
||||
+ xdlclose (dlmopen_handle);
|
||||
+
|
||||
+ /* Terminate the process with an error state. This does not happen
|
||||
+ automatically because the audit module state is not shared with
|
||||
+ the main program. */
|
||||
+ if (support_record_failure_is_failed ())
|
||||
+ {
|
||||
+ fflush (stdout);
|
||||
+ fflush (stderr);
|
||||
+ _exit (1);
|
||||
+ }
|
||||
+
|
||||
+ return LAV_CURRENT;
|
||||
+}
|
||||
+
|
||||
+char *
|
||||
+la_objsearch (const char *name, uintptr_t *cookie, unsigned int flag)
|
||||
+{
|
||||
+ if (strcmp (name, "mapped to libc") == 0)
|
||||
+ return (char *) LIBC_SO;
|
||||
+ else
|
||||
+ return (char *) name;
|
||||
+}
|
59
SOURCES/glibc-rh2047981-47.patch
Normal file
59
SOURCES/glibc-rh2047981-47.patch
Normal file
@ -0,0 +1,59 @@
|
||||
commit 2a5b4f7a715921a232f67f6810268c6cd6aa0af2
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Fri Jul 8 12:08:48 2022 +0200
|
||||
|
||||
elf: Rename tst-audit26 to tst-audit28
|
||||
|
||||
tst-audit26 and tst-audit27 are already used by aarch64.
|
||||
|
||||
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
(Usual test backport differences.)
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 3fae27d32676caf9..9e721d5d4e0a1cd9 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -353,7 +353,7 @@ tests += \
|
||||
tst-audit24d \
|
||||
tst-audit25a \
|
||||
tst-audit25b \
|
||||
- tst-audit26 \
|
||||
+ tst-audit28 \
|
||||
tst-auditmany \
|
||||
tst-auxobj \
|
||||
tst-auxobj-dlopen \
|
||||
@@ -658,7 +658,7 @@ modules-names = \
|
||||
tst-auditmod24c \
|
||||
tst-auditmod24d \
|
||||
tst-auditmod25 \
|
||||
- tst-auditmod26 \
|
||||
+ tst-auditmod28 \
|
||||
tst-big-note-lib \
|
||||
tst-deep1mod1 \
|
||||
tst-deep1mod2 \
|
||||
@@ -2145,10 +2145,10 @@ $(objpfx)tst-audit25b: $(objpfx)tst-audit25mod1.so \
|
||||
LDFLAGS-tst-audit25b = -Wl,-z,now
|
||||
tst-audit25b-ARGS = -- $(host-test-program-cmd)
|
||||
|
||||
-$(objpfx)tst-audit26: $(libdl)
|
||||
-$(objpfx)tst-audit26.out: $(objpfx)tst-auditmod26.so
|
||||
-$(objpfx)tst-auditmod26.so: $(libsupport) $(libdl)
|
||||
-tst-audit26-ENV = LD_AUDIT=$(objpfx)tst-auditmod26.so
|
||||
+$(objpfx)tst-audit28: $(libdl)
|
||||
+$(objpfx)tst-audit28.out: $(objpfx)tst-auditmod28.so
|
||||
+$(objpfx)tst-auditmod28.so: $(libsupport) $(libdl)
|
||||
+tst-audit28-ENV = LD_AUDIT=$(objpfx)tst-auditmod28.so
|
||||
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
diff --git a/elf/tst-audit26.c b/elf/tst-audit28.c
|
||||
similarity index 100%
|
||||
rename from elf/tst-audit26.c
|
||||
rename to elf/tst-audit28.c
|
||||
diff --git a/elf/tst-auditmod26.c b/elf/tst-auditmod28.c
|
||||
similarity index 100%
|
||||
rename from elf/tst-auditmod26.c
|
||||
rename to elf/tst-auditmod28.c
|
224
SOURCES/glibc-rh2047981-5.patch
Normal file
224
SOURCES/glibc-rh2047981-5.patch
Normal file
@ -0,0 +1,224 @@
|
||||
commit b2964eb1d9a6b8ab1250e8a881cf406182da5875
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed Apr 21 19:49:51 2021 +0200
|
||||
|
||||
dlfcn: Failures after dlmopen should not terminate process [BZ #24772]
|
||||
|
||||
Commit 9e78f6f6e7134a5f299cc8de77370218f8019237 ("Implement
|
||||
_dl_catch_error, _dl_signal_error in libc.so [BZ #16628]") has the
|
||||
side effect that distinct namespaces, as created by dlmopen, now have
|
||||
separate implementations of the rtld exception mechanism. This means
|
||||
that the call to _dl_catch_error from libdl in a secondary namespace
|
||||
does not actually install an exception handler because the
|
||||
thread-local variable catch_hook in the libc.so copy in the secondary
|
||||
namespace is distinct from that of the base namepace. As a result, a
|
||||
dlsym/dlopen/... failure in a secondary namespace terminates the process
|
||||
with a dynamic linker error because it looks to the exception handler
|
||||
mechanism as if no handler has been installed.
|
||||
|
||||
This commit restores GLRO (dl_catch_error) and uses it to set the
|
||||
handler in the base namespace.
|
||||
|
||||
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c
|
||||
index 06732460ea1512cd..e08ac3afef302817 100644
|
||||
--- a/dlfcn/dlerror.c
|
||||
+++ b/dlfcn/dlerror.c
|
||||
@@ -167,8 +167,10 @@ _dlerror_run (void (*operate) (void *), void *args)
|
||||
result->errstring = NULL;
|
||||
}
|
||||
|
||||
- result->errcode = _dl_catch_error (&result->objname, &result->errstring,
|
||||
- &result->malloced, operate, args);
|
||||
+ result->errcode = GLRO (dl_catch_error) (&result->objname,
|
||||
+ &result->errstring,
|
||||
+ &result->malloced,
|
||||
+ operate, args);
|
||||
|
||||
/* If no error we mark that no error string is available. */
|
||||
result->returned = result->errstring == NULL;
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index a811919ba4568d64..e0919486a14cab1a 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -216,6 +216,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-glibc-hwcaps tst-glibc-hwcaps-prepend tst-glibc-hwcaps-mask \
|
||||
tst-tls20 tst-tls21 \
|
||||
tst-rtld-run-static \
|
||||
+ tst-dlmopen-dlerror \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -349,6 +350,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
libmarkermod4-1 libmarkermod4-2 libmarkermod4-3 libmarkermod4-4 \
|
||||
libmarkermod5-1 libmarkermod5-2 libmarkermod5-3 libmarkermod5-4 \
|
||||
libmarkermod5-5 tst-tls20mod-bad tst-tls21mod \
|
||||
+ tst-dlmopen-dlerror-mod \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1546,6 +1548,10 @@ $(objpfx)tst-sonamemove-dlopen.out: \
|
||||
$(objpfx)tst-sonamemove-runmod1.so \
|
||||
$(objpfx)tst-sonamemove-runmod2.so
|
||||
|
||||
+$(objpfx)tst-dlmopen-dlerror: $(libdl)
|
||||
+$(objpfx)tst-dlmopen-dlerror-mod.so: $(libdl) $(libsupport)
|
||||
+$(objpfx)tst-dlmopen-dlerror.out: $(objpfx)tst-dlmopen-dlerror-mod.so
|
||||
+
|
||||
# Override -z defs, so that we can reference an undefined symbol.
|
||||
# Force lazy binding for the same reason.
|
||||
LDFLAGS-tst-latepthreadmod.so = \
|
||||
diff --git a/elf/dl-error-skeleton.c b/elf/dl-error-skeleton.c
|
||||
index 9cb002ccfed2c7b4..7801aa433b12275f 100644
|
||||
--- a/elf/dl-error-skeleton.c
|
||||
+++ b/elf/dl-error-skeleton.c
|
||||
@@ -248,4 +248,16 @@ _dl_receive_error (receiver_fct fct, void (*operate) (void *), void *args)
|
||||
catch_hook = old_catch;
|
||||
receiver = old_receiver;
|
||||
}
|
||||
+
|
||||
+/* Forwarder used for initializing GLRO (_dl_catch_error). */
|
||||
+int
|
||||
+_rtld_catch_error (const char **objname, const char **errstring,
|
||||
+ bool *mallocedp, void (*operate) (void *),
|
||||
+ void *args)
|
||||
+{
|
||||
+ /* The reference to _dl_catch_error will eventually be relocated to
|
||||
+ point to the implementation in libc.so. */
|
||||
+ return _dl_catch_error (objname, errstring, mallocedp, operate, args);
|
||||
+}
|
||||
+
|
||||
#endif /* DL_ERROR_BOOTSTRAP */
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index 461d8c114a875a9b..c445b5ca25dea193 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -365,6 +365,7 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
|
||||
._dl_lookup_symbol_x = _dl_lookup_symbol_x,
|
||||
._dl_open = _dl_open,
|
||||
._dl_close = _dl_close,
|
||||
+ ._dl_catch_error = _rtld_catch_error,
|
||||
._dl_tls_get_addr_soft = _dl_tls_get_addr_soft,
|
||||
#ifdef HAVE_DL_DISCOVER_OSVERSION
|
||||
._dl_discover_osversion = _dl_discover_osversion
|
||||
diff --git a/elf/tst-dlmopen-dlerror-mod.c b/elf/tst-dlmopen-dlerror-mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..7e95dcdeacf005be
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlmopen-dlerror-mod.c
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* Check that dlfcn errors are reported properly after dlmopen. Test module.
|
||||
+ Copyright (C) 2021 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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+#include <stddef.h>
|
||||
+#include <support/check.h>
|
||||
+
|
||||
+/* Note: This object is not linked into the main program, so we cannot
|
||||
+ use delayed test failure reporting via TEST_VERIFY etc., and have
|
||||
+ to use FAIL_EXIT1 (or something else that calls exit). */
|
||||
+
|
||||
+void
|
||||
+call_dlsym (void)
|
||||
+{
|
||||
+ void *ptr = dlsym (NULL, "does not exist");
|
||||
+ if (ptr != NULL)
|
||||
+ FAIL_EXIT1 ("dlsym did not fail as expected");
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+call_dlopen (void)
|
||||
+{
|
||||
+ void *handle = dlopen ("tst-dlmopen-dlerror does not exist", RTLD_NOW);
|
||||
+ if (handle != NULL)
|
||||
+ FAIL_EXIT1 ("dlopen did not fail as expected");
|
||||
+}
|
||||
diff --git a/elf/tst-dlmopen-dlerror.c b/elf/tst-dlmopen-dlerror.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..e864d2fe4c3484ab
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlmopen-dlerror.c
|
||||
@@ -0,0 +1,37 @@
|
||||
+/* Check that dlfcn errors are reported properly after dlmopen.
|
||||
+ Copyright (C) 2021 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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <stddef.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/xdlfcn.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ void *handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-dlerror-mod.so",
|
||||
+ RTLD_NOW);
|
||||
+ void (*call_dlsym) (void) = xdlsym (handle, "call_dlsym");
|
||||
+ void (*call_dlopen) (void) = xdlsym (handle, "call_dlopen");
|
||||
+
|
||||
+ call_dlsym ();
|
||||
+ call_dlopen ();
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index 7b0a667629ddc06a..d6d02aa3ccffba33 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -647,6 +647,12 @@ struct rtld_global_ro
|
||||
void *(*_dl_open) (const char *file, int mode, const void *caller_dlopen,
|
||||
Lmid_t nsid, int argc, char *argv[], char *env[]);
|
||||
void (*_dl_close) (void *map);
|
||||
+ /* libdl in a secondary namespace (after dlopen) must use
|
||||
+ _dl_catch_error from the main namespace, so it has to be
|
||||
+ exported in some way. */
|
||||
+ int (*_dl_catch_error) (const char **objname, const char **errstring,
|
||||
+ bool *mallocedp, void (*operate) (void *),
|
||||
+ void *args);
|
||||
void *(*_dl_tls_get_addr_soft) (struct link_map *);
|
||||
#ifdef HAVE_DL_DISCOVER_OSVERSION
|
||||
int (*_dl_discover_osversion) (void);
|
||||
@@ -889,6 +895,9 @@ extern int _dl_catch_error (const char **objname, const char **errstring,
|
||||
void *args);
|
||||
libc_hidden_proto (_dl_catch_error)
|
||||
|
||||
+/* Used for initializing GLRO (_dl_catch_error). */
|
||||
+extern __typeof__ (_dl_catch_error) _rtld_catch_error attribute_hidden;
|
||||
+
|
||||
/* Call OPERATE (ARGS). If no error occurs, set *EXCEPTION to zero.
|
||||
Otherwise, store a copy of the raised exception in *EXCEPTION,
|
||||
which has to be freed by _dl_exception_free. As a special case, if
|
822
SOURCES/glibc-rh2047981-6.patch
Normal file
822
SOURCES/glibc-rh2047981-6.patch
Normal file
@ -0,0 +1,822 @@
|
||||
commit fada9018199c21c469ff0e731ef75c6020074ac9
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Wed Apr 21 19:49:51 2021 +0200
|
||||
|
||||
dlfcn: dlerror needs to call free from the base namespace [BZ #24773]
|
||||
|
||||
Calling free directly may end up freeing a pointer allocated by the
|
||||
dynamic loader using malloc from libc.so in the base namespace using
|
||||
the allocator from libc.so in a secondary namespace, which results in
|
||||
crashes.
|
||||
|
||||
This commit redirects the free call through GLRO and the dynamic
|
||||
linker, to reach the correct namespace. It also cleans up the dlerror
|
||||
handling along the way, so that pthread_setspecific is no longer
|
||||
needed (which avoids triggering bug 24774).
|
||||
|
||||
Conflicts:
|
||||
dlfcn/dlfreeres.c - Remove.
|
||||
malloc/set-freeres.c
|
||||
Manual merge against disinct set of resources.
|
||||
malloc/thread-freeres.c
|
||||
Manual merge against disinct set of resources.
|
||||
|
||||
diff --git a/dlfcn/Makefile b/dlfcn/Makefile
|
||||
index 34f9923334f42edf..0b213b7d9fefcdc9 100644
|
||||
--- a/dlfcn/Makefile
|
||||
+++ b/dlfcn/Makefile
|
||||
@@ -22,9 +22,10 @@ include ../Makeconfig
|
||||
headers := bits/dlfcn.h dlfcn.h
|
||||
extra-libs := libdl
|
||||
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dladdr1 dlinfo \
|
||||
- dlmopen dlfcn dlfreeres
|
||||
+ dlmopen dlfcn
|
||||
routines := $(patsubst %,s%,$(filter-out dlfcn,$(libdl-routines)))
|
||||
elide-routines.os := $(routines)
|
||||
+routines += libc_dlerror_result
|
||||
|
||||
extra-libs-others := libdl
|
||||
|
||||
diff --git a/dlfcn/Versions b/dlfcn/Versions
|
||||
index 1df6925a92ff8b36..f07cb929aa13eaf2 100644
|
||||
--- a/dlfcn/Versions
|
||||
+++ b/dlfcn/Versions
|
||||
@@ -1,3 +1,8 @@
|
||||
+libc {
|
||||
+ GLIBC_PRIVATE {
|
||||
+ __libc_dlerror_result;
|
||||
+ }
|
||||
+}
|
||||
libdl {
|
||||
GLIBC_2.0 {
|
||||
dladdr; dlclose; dlerror; dlopen; dlsym;
|
||||
@@ -13,6 +18,5 @@ libdl {
|
||||
}
|
||||
GLIBC_PRIVATE {
|
||||
_dlfcn_hook;
|
||||
- __libdl_freeres;
|
||||
}
|
||||
}
|
||||
diff --git a/dlfcn/dlerror.c b/dlfcn/dlerror.c
|
||||
index e08ac3afef302817..070eadbf7c1c0b1c 100644
|
||||
--- a/dlfcn/dlerror.c
|
||||
+++ b/dlfcn/dlerror.c
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <libc-lock.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <libc-symbols.h>
|
||||
+#include <assert.h>
|
||||
+#include <dlerror.h>
|
||||
|
||||
#if !defined SHARED && IS_IN (libdl)
|
||||
|
||||
@@ -36,92 +38,75 @@ dlerror (void)
|
||||
|
||||
#else
|
||||
|
||||
-/* Type for storing results of dynamic loading actions. */
|
||||
-struct dl_action_result
|
||||
- {
|
||||
- int errcode;
|
||||
- int returned;
|
||||
- bool malloced;
|
||||
- const char *objname;
|
||||
- const char *errstring;
|
||||
- };
|
||||
-static struct dl_action_result last_result;
|
||||
-static struct dl_action_result *static_buf;
|
||||
-
|
||||
-/* This is the key for the thread specific memory. */
|
||||
-static __libc_key_t key;
|
||||
-__libc_once_define (static, once);
|
||||
-
|
||||
-/* Destructor for the thread-specific data. */
|
||||
-static void init (void);
|
||||
-static void free_key_mem (void *mem);
|
||||
-
|
||||
-
|
||||
char *
|
||||
__dlerror (void)
|
||||
{
|
||||
- char *buf = NULL;
|
||||
- struct dl_action_result *result;
|
||||
-
|
||||
# ifdef SHARED
|
||||
if (!rtld_active ())
|
||||
return _dlfcn_hook->dlerror ();
|
||||
# endif
|
||||
|
||||
- /* If we have not yet initialized the buffer do it now. */
|
||||
- __libc_once (once, init);
|
||||
+ struct dl_action_result *result = __libc_dlerror_result;
|
||||
|
||||
- /* Get error string. */
|
||||
- if (static_buf != NULL)
|
||||
- result = static_buf;
|
||||
- else
|
||||
+ /* No libdl function has been called. No error is possible. */
|
||||
+ if (result == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* For an early malloc failure, clear the error flag and return the
|
||||
+ error message. This marks the error as delivered. */
|
||||
+ if (result == dl_action_result_malloc_failed)
|
||||
{
|
||||
- /* init () has been run and we don't use the static buffer.
|
||||
- So we have a valid key. */
|
||||
- result = (struct dl_action_result *) __libc_getspecific (key);
|
||||
- if (result == NULL)
|
||||
- result = &last_result;
|
||||
+ __libc_dlerror_result = NULL;
|
||||
+ return (char *) "out of memory";
|
||||
}
|
||||
|
||||
- /* Test whether we already returned the string. */
|
||||
- if (result->returned != 0)
|
||||
+ /* Placeholder object. This can be observed in a recursive call,
|
||||
+ e.g. from an ELF constructor. */
|
||||
+ if (result->errstring == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* If we have already reported the error, we can free the result and
|
||||
+ return NULL. See __libc_dlerror_result_free. */
|
||||
+ if (result->returned)
|
||||
{
|
||||
- /* We can now free the string. */
|
||||
- if (result->errstring != NULL)
|
||||
- {
|
||||
- if (strcmp (result->errstring, "out of memory") != 0)
|
||||
- free ((char *) result->errstring);
|
||||
- result->errstring = NULL;
|
||||
- }
|
||||
+ __libc_dlerror_result = NULL;
|
||||
+ dl_action_result_errstring_free (result);
|
||||
+ free (result);
|
||||
+ return NULL;
|
||||
}
|
||||
- else if (result->errstring != NULL)
|
||||
- {
|
||||
- buf = (char *) result->errstring;
|
||||
- int n;
|
||||
- if (result->errcode == 0)
|
||||
- n = __asprintf (&buf, "%s%s%s",
|
||||
- result->objname,
|
||||
- result->objname[0] == '\0' ? "" : ": ",
|
||||
- _(result->errstring));
|
||||
- else
|
||||
- n = __asprintf (&buf, "%s%s%s: %s",
|
||||
- result->objname,
|
||||
- result->objname[0] == '\0' ? "" : ": ",
|
||||
- _(result->errstring),
|
||||
- strerror (result->errcode));
|
||||
- if (n != -1)
|
||||
- {
|
||||
- /* We don't need the error string anymore. */
|
||||
- if (strcmp (result->errstring, "out of memory") != 0)
|
||||
- free ((char *) result->errstring);
|
||||
- result->errstring = buf;
|
||||
- }
|
||||
|
||||
- /* Mark the error as returned. */
|
||||
- result->returned = 1;
|
||||
- }
|
||||
+ assert (result->errstring != NULL);
|
||||
+
|
||||
+ /* Create the combined error message. */
|
||||
+ char *buf;
|
||||
+ int n;
|
||||
+ if (result->errcode == 0)
|
||||
+ n = __asprintf (&buf, "%s%s%s",
|
||||
+ result->objname,
|
||||
+ result->objname[0] == '\0' ? "" : ": ",
|
||||
+ _(result->errstring));
|
||||
+ else
|
||||
+ n = __asprintf (&buf, "%s%s%s: %s",
|
||||
+ result->objname,
|
||||
+ result->objname[0] == '\0' ? "" : ": ",
|
||||
+ _(result->errstring),
|
||||
+ strerror (result->errcode));
|
||||
|
||||
- return buf;
|
||||
+ /* Mark the error as delivered. */
|
||||
+ result->returned = true;
|
||||
+
|
||||
+ if (n >= 0)
|
||||
+ {
|
||||
+ /* Replace the error string with the newly allocated one. */
|
||||
+ dl_action_result_errstring_free (result);
|
||||
+ result->errstring = buf;
|
||||
+ result->errstring_source = dl_action_result_errstring_local;
|
||||
+ return buf;
|
||||
+ }
|
||||
+ else
|
||||
+ /* We could not create the combined error message, so use the
|
||||
+ existing string as a fallback. */
|
||||
+ return result->errstring;
|
||||
}
|
||||
# ifdef SHARED
|
||||
strong_alias (__dlerror, dlerror)
|
||||
@@ -130,130 +115,94 @@ strong_alias (__dlerror, dlerror)
|
||||
int
|
||||
_dlerror_run (void (*operate) (void *), void *args)
|
||||
{
|
||||
- struct dl_action_result *result;
|
||||
-
|
||||
- /* If we have not yet initialized the buffer do it now. */
|
||||
- __libc_once (once, init);
|
||||
-
|
||||
- /* Get error string and number. */
|
||||
- if (static_buf != NULL)
|
||||
- result = static_buf;
|
||||
- else
|
||||
+ struct dl_action_result *result = __libc_dlerror_result;
|
||||
+ if (result != NULL)
|
||||
{
|
||||
- /* We don't use the static buffer and so we have a key. Use it
|
||||
- to get the thread-specific buffer. */
|
||||
- result = __libc_getspecific (key);
|
||||
- if (result == NULL)
|
||||
+ if (result == dl_action_result_malloc_failed)
|
||||
{
|
||||
- result = (struct dl_action_result *) calloc (1, sizeof (*result));
|
||||
- if (result == NULL)
|
||||
- /* We are out of memory. Since this is no really critical
|
||||
- situation we carry on by using the global variable.
|
||||
- This might lead to conflicts between the threads but
|
||||
- they soon all will have memory problems. */
|
||||
- result = &last_result;
|
||||
- else
|
||||
- /* Set the tsd. */
|
||||
- __libc_setspecific (key, result);
|
||||
+ /* Clear the previous error. */
|
||||
+ __libc_dlerror_result = NULL;
|
||||
+ result = NULL;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ /* There is an existing object. Free its error string, but
|
||||
+ keep the object. */
|
||||
+ dl_action_result_errstring_free (result);
|
||||
+ /* Mark the object as not containing an error. This ensures
|
||||
+ that call to dlerror from, for example, an ELF
|
||||
+ constructor will not notice this result object. */
|
||||
+ result->errstring = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
- if (result->errstring != NULL)
|
||||
- {
|
||||
- /* Free the error string from the last failed command. This can
|
||||
- happen if `dlerror' was not run after an error was found. */
|
||||
- if (result->malloced)
|
||||
- free ((char *) result->errstring);
|
||||
- result->errstring = NULL;
|
||||
- }
|
||||
-
|
||||
- result->errcode = GLRO (dl_catch_error) (&result->objname,
|
||||
- &result->errstring,
|
||||
- &result->malloced,
|
||||
- operate, args);
|
||||
-
|
||||
- /* If no error we mark that no error string is available. */
|
||||
- result->returned = result->errstring == NULL;
|
||||
+ const char *objname;
|
||||
+ const char *errstring;
|
||||
+ bool malloced;
|
||||
+ int errcode = GLRO (dl_catch_error) (&objname, &errstring, &malloced,
|
||||
+ operate, args);
|
||||
|
||||
- return result->errstring != NULL;
|
||||
-}
|
||||
+ /* ELF constructors or destructors may have indirectly altered the
|
||||
+ value of __libc_dlerror_result, therefore reload it. */
|
||||
+ result = __libc_dlerror_result;
|
||||
|
||||
-
|
||||
-/* Initialize buffers for results. */
|
||||
-static void
|
||||
-init (void)
|
||||
-{
|
||||
- if (__libc_key_create (&key, free_key_mem))
|
||||
- /* Creating the key failed. This means something really went
|
||||
- wrong. In any case use a static buffer which is better than
|
||||
- nothing. */
|
||||
- static_buf = &last_result;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static void
|
||||
-check_free (struct dl_action_result *rec)
|
||||
-{
|
||||
- if (rec->errstring != NULL
|
||||
- && strcmp (rec->errstring, "out of memory") != 0)
|
||||
+ if (errstring == NULL)
|
||||
{
|
||||
- /* We can free the string only if the allocation happened in the
|
||||
- C library used by the dynamic linker. This means, it is
|
||||
- always the C library in the base namespace. When we're statically
|
||||
- linked, the dynamic linker is part of the program and so always
|
||||
- uses the same C library we use here. */
|
||||
-#ifdef SHARED
|
||||
- struct link_map *map = NULL;
|
||||
- Dl_info info;
|
||||
- if (_dl_addr (check_free, &info, &map, NULL) != 0 && map->l_ns == 0)
|
||||
-#endif
|
||||
+ /* There is no error. We no longer need the result object if it
|
||||
+ does not contain an error. However, a recursive call may
|
||||
+ have added an error even if this call did not cause it. Keep
|
||||
+ the other error. */
|
||||
+ if (result != NULL && result->errstring == NULL)
|
||||
{
|
||||
- free ((char *) rec->errstring);
|
||||
- rec->errstring = NULL;
|
||||
+ __libc_dlerror_result = NULL;
|
||||
+ free (result);
|
||||
}
|
||||
+ return 0;
|
||||
}
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static void
|
||||
-__attribute__ ((destructor))
|
||||
-fini (void)
|
||||
-{
|
||||
- check_free (&last_result);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* Free the thread specific data, this is done if a thread terminates. */
|
||||
-static void
|
||||
-free_key_mem (void *mem)
|
||||
-{
|
||||
- check_free ((struct dl_action_result *) mem);
|
||||
+ else
|
||||
+ {
|
||||
+ /* A new error occurred. Check if a result object has to be
|
||||
+ allocated. */
|
||||
+ if (result == NULL || result == dl_action_result_malloc_failed)
|
||||
+ {
|
||||
+ /* Allocating storage for the error message after the fact
|
||||
+ is not ideal. But this avoids an infinite recursion in
|
||||
+ case malloc itself calls libdl functions (without
|
||||
+ triggering errors). */
|
||||
+ result = malloc (sizeof (*result));
|
||||
+ if (result == NULL)
|
||||
+ {
|
||||
+ /* Assume that the dlfcn failure was due to a malloc
|
||||
+ failure, too. */
|
||||
+ if (malloced)
|
||||
+ dl_error_free ((char *) errstring);
|
||||
+ __libc_dlerror_result = dl_action_result_malloc_failed;
|
||||
+ return 1;
|
||||
+ }
|
||||
+ __libc_dlerror_result = result;
|
||||
+ }
|
||||
+ else
|
||||
+ /* Deallocate the existing error message from a recursive
|
||||
+ call, but reuse the result object. */
|
||||
+ dl_action_result_errstring_free (result);
|
||||
+
|
||||
+ result->errcode = errcode;
|
||||
+ result->objname = objname;
|
||||
+ result->errstring = (char *) errstring;
|
||||
+ result->returned = false;
|
||||
+ /* In case of an error, the malloced flag indicates whether the
|
||||
+ error string is constant or not. */
|
||||
+ if (malloced)
|
||||
+ result->errstring_source = dl_action_result_errstring_rtld;
|
||||
+ else
|
||||
+ result->errstring_source = dl_action_result_errstring_constant;
|
||||
|
||||
- free (mem);
|
||||
- __libc_setspecific (key, NULL);
|
||||
+ return 1;
|
||||
+ }
|
||||
}
|
||||
|
||||
# ifdef SHARED
|
||||
|
||||
-/* Free the dlerror-related resources. */
|
||||
-void
|
||||
-__dlerror_main_freeres (void)
|
||||
-{
|
||||
- /* Free the global memory if used. */
|
||||
- check_free (&last_result);
|
||||
-
|
||||
- if (__libc_once_get (once) && static_buf == NULL)
|
||||
- {
|
||||
- /* init () has been run and we don't use the static buffer.
|
||||
- So we have a valid key. */
|
||||
- void *mem;
|
||||
- /* Free the TSD memory if used. */
|
||||
- mem = __libc_getspecific (key);
|
||||
- if (mem != NULL)
|
||||
- free_key_mem (mem);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
struct dlfcn_hook *_dlfcn_hook __attribute__((nocommon));
|
||||
libdl_hidden_data_def (_dlfcn_hook)
|
||||
|
||||
diff --git a/dlfcn/dlerror.h b/dlfcn/dlerror.h
|
||||
new file mode 100644
|
||||
index 0000000000000000..cb9a9cea4c009452
|
||||
--- /dev/null
|
||||
+++ b/dlfcn/dlerror.h
|
||||
@@ -0,0 +1,92 @@
|
||||
+/* Memory management for dlerror messages.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+#ifndef _DLERROR_H
|
||||
+#define _DLERROR_H
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+#include <ldsodefs.h>
|
||||
+#include <stdbool.h>
|
||||
+#include <stdint.h>
|
||||
+#include <stdlib.h>
|
||||
+
|
||||
+/* Source of the errstring member in struct dl_action_result, for
|
||||
+ finding the right deallocation routine. */
|
||||
+enum dl_action_result_errstring_source
|
||||
+ {
|
||||
+ dl_action_result_errstring_constant, /* String literal, no deallocation. */
|
||||
+ dl_action_result_errstring_rtld, /* libc in the primary namespace. */
|
||||
+ dl_action_result_errstring_local, /* libc in the current namespace. */
|
||||
+ };
|
||||
+
|
||||
+struct dl_action_result
|
||||
+{
|
||||
+ int errcode;
|
||||
+ char errstring_source;
|
||||
+ bool returned;
|
||||
+ const char *objname;
|
||||
+ char *errstring;
|
||||
+};
|
||||
+
|
||||
+/* Used to free the errstring member of struct dl_action_result in the
|
||||
+ dl_action_result_errstring_rtld case. */
|
||||
+static inline void
|
||||
+dl_error_free (void *ptr)
|
||||
+{
|
||||
+#ifdef SHARED
|
||||
+ /* In the shared case, ld.so may use a different malloc than this
|
||||
+ namespace. */
|
||||
+ GLRO (dl_error_free (ptr));
|
||||
+#else
|
||||
+ /* Call the implementation directly. It still has to check for
|
||||
+ pointers which cannot be freed, so do not call free directly
|
||||
+ here. */
|
||||
+ _dl_error_free (ptr);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/* Deallocate RESULT->errstring, leaving *RESULT itself allocated. */
|
||||
+static inline void
|
||||
+dl_action_result_errstring_free (struct dl_action_result *result)
|
||||
+{
|
||||
+ switch (result->errstring_source)
|
||||
+ {
|
||||
+ case dl_action_result_errstring_constant:
|
||||
+ break;
|
||||
+ case dl_action_result_errstring_rtld:
|
||||
+ dl_error_free (result->errstring);
|
||||
+ break;
|
||||
+ case dl_action_result_errstring_local:
|
||||
+ free (result->errstring);
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Stand-in for an error result object whose allocation failed. No
|
||||
+ precise message can be reported for this, but an error must still
|
||||
+ be signaled. */
|
||||
+static struct dl_action_result *const dl_action_result_malloc_failed
|
||||
+ __attribute__ ((unused)) = (struct dl_action_result *) (intptr_t) -1;
|
||||
+
|
||||
+/* Thread-local variable for storing dlfcn failures for subsequent
|
||||
+ reporting via dlerror. */
|
||||
+extern __thread struct dl_action_result *__libc_dlerror_result
|
||||
+ attribute_tls_model_ie;
|
||||
+void __libc_dlerror_result_free (void) attribute_hidden;
|
||||
+
|
||||
+#endif /* _DLERROR_H */
|
||||
diff --git a/dlfcn/dlfreeres.c b/dlfcn/dlfreeres.c
|
||||
deleted file mode 100644
|
||||
index 4004db0edbe0c028..0000000000000000
|
||||
--- a/dlfcn/dlfreeres.c
|
||||
+++ /dev/null
|
||||
@@ -1,29 +0,0 @@
|
||||
-/* Clean up allocated libdl memory on demand.
|
||||
- Copyright (C) 2018 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
|
||||
- <http://www.gnu.org/licenses/>. */
|
||||
-
|
||||
-#include <set-hooks.h>
|
||||
-#include <libc-symbols.h>
|
||||
-#include <dlfcn.h>
|
||||
-
|
||||
-/* Free libdl.so resources.
|
||||
- Note: Caller ensures we are called only once. */
|
||||
-void
|
||||
-__libdl_freeres (void)
|
||||
-{
|
||||
- call_function_static_weak (__dlerror_main_freeres);
|
||||
-}
|
||||
diff --git a/dlfcn/libc_dlerror_result.c b/dlfcn/libc_dlerror_result.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..99747186b9218680
|
||||
--- /dev/null
|
||||
+++ b/dlfcn/libc_dlerror_result.c
|
||||
@@ -0,0 +1,39 @@
|
||||
+/* Thread-local variable holding the dlerror result.
|
||||
+ Copyright (C) 2021 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
|
||||
+ <http://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <dlerror.h>
|
||||
+
|
||||
+/* This pointer is either NULL, dl_action_result_malloc_failed (), or
|
||||
+ has been allocated using malloc by the namespace that also contains
|
||||
+ this instance of the thread-local variable. */
|
||||
+__thread struct dl_action_result *__libc_dlerror_result attribute_tls_model_ie;
|
||||
+
|
||||
+/* Called during thread shutdown to free resources. */
|
||||
+void
|
||||
+__libc_dlerror_result_free (void)
|
||||
+{
|
||||
+ if (__libc_dlerror_result != NULL)
|
||||
+ {
|
||||
+ if (__libc_dlerror_result != dl_action_result_malloc_failed)
|
||||
+ {
|
||||
+ dl_action_result_errstring_free (__libc_dlerror_result);
|
||||
+ free (__libc_dlerror_result);
|
||||
+ }
|
||||
+ __libc_dlerror_result = NULL;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/elf/dl-exception.c b/elf/dl-exception.c
|
||||
index d24bf30a5cf39bc2..f474daf97ae76308 100644
|
||||
--- a/elf/dl-exception.c
|
||||
+++ b/elf/dl-exception.c
|
||||
@@ -30,6 +30,17 @@
|
||||
a pointer comparison. See below and in dlfcn/dlerror.c. */
|
||||
static const char _dl_out_of_memory[] = "out of memory";
|
||||
|
||||
+/* Call free in the main libc.so. This allows other namespaces to
|
||||
+ free pointers on the main libc heap, via GLRO (dl_error_free). It
|
||||
+ also avoids calling free on the special, pre-allocated
|
||||
+ out-of-memory error message. */
|
||||
+void
|
||||
+_dl_error_free (void *ptr)
|
||||
+{
|
||||
+ if (ptr != _dl_out_of_memory)
|
||||
+ free (ptr);
|
||||
+}
|
||||
+
|
||||
/* Dummy allocation object used if allocating the message buffer
|
||||
fails. */
|
||||
static void
|
||||
diff --git a/elf/rtld.c b/elf/rtld.c
|
||||
index c445b5ca25dea193..e107af4014d43777 100644
|
||||
--- a/elf/rtld.c
|
||||
+++ b/elf/rtld.c
|
||||
@@ -366,6 +366,7 @@ struct rtld_global_ro _rtld_global_ro attribute_relro =
|
||||
._dl_open = _dl_open,
|
||||
._dl_close = _dl_close,
|
||||
._dl_catch_error = _rtld_catch_error,
|
||||
+ ._dl_error_free = _dl_error_free,
|
||||
._dl_tls_get_addr_soft = _dl_tls_get_addr_soft,
|
||||
#ifdef HAVE_DL_DISCOVER_OSVERSION
|
||||
._dl_discover_osversion = _dl_discover_osversion
|
||||
diff --git a/elf/tst-dlmopen-dlerror-mod.c b/elf/tst-dlmopen-dlerror-mod.c
|
||||
index 7e95dcdeacf005be..051025d3fa7a4d6a 100644
|
||||
--- a/elf/tst-dlmopen-dlerror-mod.c
|
||||
+++ b/elf/tst-dlmopen-dlerror-mod.c
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <stddef.h>
|
||||
+#include <stdio.h>
|
||||
+#include <string.h>
|
||||
#include <support/check.h>
|
||||
|
||||
/* Note: This object is not linked into the main program, so we cannot
|
||||
@@ -25,17 +27,32 @@
|
||||
to use FAIL_EXIT1 (or something else that calls exit). */
|
||||
|
||||
void
|
||||
-call_dlsym (void)
|
||||
+call_dlsym (const char *name)
|
||||
{
|
||||
- void *ptr = dlsym (NULL, "does not exist");
|
||||
+ void *ptr = dlsym (NULL, name);
|
||||
if (ptr != NULL)
|
||||
- FAIL_EXIT1 ("dlsym did not fail as expected");
|
||||
+ FAIL_EXIT1 ("dlsym did not fail as expected for: %s", name);
|
||||
+ const char *message = dlerror ();
|
||||
+ if (strstr (message, ": undefined symbol: does not exist X") == NULL)
|
||||
+ FAIL_EXIT1 ("invalid dlsym error message for [[%s]]: %s", name, message);
|
||||
+ message = dlerror ();
|
||||
+ if (message != NULL)
|
||||
+ FAIL_EXIT1 ("second dlsym for [[%s]]: %s", name, message);
|
||||
}
|
||||
|
||||
void
|
||||
-call_dlopen (void)
|
||||
+call_dlopen (const char *name)
|
||||
{
|
||||
- void *handle = dlopen ("tst-dlmopen-dlerror does not exist", RTLD_NOW);
|
||||
+ void *handle = dlopen (name, RTLD_NOW);
|
||||
if (handle != NULL)
|
||||
- FAIL_EXIT1 ("dlopen did not fail as expected");
|
||||
+ FAIL_EXIT1 ("dlopen did not fail as expected for: %s", name);
|
||||
+ const char *message = dlerror ();
|
||||
+ if (strstr (message, "X: cannot open shared object file:"
|
||||
+ " No such file or directory") == NULL
|
||||
+ && strstr (message, "X: cannot open shared object file:"
|
||||
+ " File name too long") == NULL)
|
||||
+ FAIL_EXIT1 ("invalid dlopen error message for [[%s]]: %s", name, message);
|
||||
+ message = dlerror ();
|
||||
+ if (message != NULL)
|
||||
+ FAIL_EXIT1 ("second dlopen for [[%s]]: %s", name, message);
|
||||
}
|
||||
diff --git a/elf/tst-dlmopen-dlerror.c b/elf/tst-dlmopen-dlerror.c
|
||||
index e864d2fe4c3484ab..aa3d6598df119ce0 100644
|
||||
--- a/elf/tst-dlmopen-dlerror.c
|
||||
+++ b/elf/tst-dlmopen-dlerror.c
|
||||
@@ -17,6 +17,7 @@
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <stddef.h>
|
||||
+#include <string.h>
|
||||
#include <support/check.h>
|
||||
#include <support/xdlfcn.h>
|
||||
|
||||
@@ -25,11 +26,22 @@ do_test (void)
|
||||
{
|
||||
void *handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-dlerror-mod.so",
|
||||
RTLD_NOW);
|
||||
- void (*call_dlsym) (void) = xdlsym (handle, "call_dlsym");
|
||||
- void (*call_dlopen) (void) = xdlsym (handle, "call_dlopen");
|
||||
-
|
||||
- call_dlsym ();
|
||||
- call_dlopen ();
|
||||
+ void (*call_dlsym) (const char *name) = xdlsym (handle, "call_dlsym");
|
||||
+ void (*call_dlopen) (const char *name) = xdlsym (handle, "call_dlopen");
|
||||
+
|
||||
+ /* Iterate over various name lengths. This changes the size of
|
||||
+ error messages allocated by ld.so and has been shown to trigger
|
||||
+ detectable heap corruption if malloc/free calls in different
|
||||
+ namespaces are mixed. */
|
||||
+ char buffer[2048];
|
||||
+ char *buffer_end = &buffer[sizeof (buffer) - 2];
|
||||
+ for (char *p = stpcpy (buffer, "does not exist "); p < buffer_end; ++p)
|
||||
+ {
|
||||
+ p[0] = 'X';
|
||||
+ p[1] = '\0';
|
||||
+ call_dlsym (buffer);
|
||||
+ call_dlopen (buffer);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/include/dlfcn.h b/include/dlfcn.h
|
||||
index 0dc57dbe2217cfe7..109586a1d968b630 100644
|
||||
--- a/include/dlfcn.h
|
||||
+++ b/include/dlfcn.h
|
||||
@@ -156,7 +156,5 @@ extern void __libc_register_dlfcn_hook (struct link_map *map)
|
||||
attribute_hidden;
|
||||
#endif
|
||||
|
||||
-extern void __dlerror_main_freeres (void) attribute_hidden;
|
||||
-
|
||||
#endif
|
||||
#endif
|
||||
diff --git a/malloc/set-freeres.c b/malloc/set-freeres.c
|
||||
index cda368479f910149..43b6a2cd9da49aa9 100644
|
||||
--- a/malloc/set-freeres.c
|
||||
+++ b/malloc/set-freeres.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <set-hooks.h>
|
||||
#include <libc-internal.h>
|
||||
+#include <dlfcn/dlerror.h>
|
||||
|
||||
#include "../libio/libioP.h"
|
||||
|
||||
@@ -26,8 +27,6 @@ DEFINE_HOOK (__libc_subfreeres, (void));
|
||||
|
||||
symbol_set_define (__libc_freeres_ptrs);
|
||||
|
||||
-extern __attribute__ ((weak)) void __libdl_freeres (void);
|
||||
-
|
||||
extern __attribute__ ((weak)) void __libpthread_freeres (void);
|
||||
|
||||
void __libc_freeres_fn_section
|
||||
@@ -46,16 +45,13 @@ __libc_freeres (void)
|
||||
/* We run the resource freeing after IO cleanup. */
|
||||
RUN_HOOK (__libc_subfreeres, ());
|
||||
|
||||
- /* Call the libdl list of cleanup functions
|
||||
- (weak-ref-and-check). */
|
||||
- if (&__libdl_freeres != NULL)
|
||||
- __libdl_freeres ();
|
||||
-
|
||||
/* Call the libpthread list of cleanup functions
|
||||
(weak-ref-and-check). */
|
||||
if (&__libpthread_freeres != NULL)
|
||||
__libpthread_freeres ();
|
||||
|
||||
+ call_function_static_weak (__libc_dlerror_result_free);
|
||||
+
|
||||
for (p = symbol_set_first_element (__libc_freeres_ptrs);
|
||||
!symbol_set_end_p (__libc_freeres_ptrs, p); ++p)
|
||||
free (*p);
|
||||
diff --git a/malloc/thread-freeres.c b/malloc/thread-freeres.c
|
||||
index a63b6c93f3114284..1e37a72c1f4a9c43 100644
|
||||
--- a/malloc/thread-freeres.c
|
||||
+++ b/malloc/thread-freeres.c
|
||||
@@ -16,6 +16,7 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
+#include <dlfcn/dlerror.h>
|
||||
#include <libc-internal.h>
|
||||
#include <malloc-internal.h>
|
||||
#include <resolv/resolv-internal.h>
|
||||
@@ -32,6 +33,7 @@ __libc_thread_freeres (void)
|
||||
call_function_static_weak (__rpc_thread_destroy);
|
||||
call_function_static_weak (__res_thread_freeres);
|
||||
call_function_static_weak (__strerror_thread_freeres);
|
||||
+ call_function_static_weak (__libc_dlerror_result_free);
|
||||
|
||||
/* This should come last because it shuts down malloc for this
|
||||
thread and the other shutdown functions might well call free. */
|
||||
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
|
||||
index d6d02aa3ccffba33..2dd6f0c3c4aaaef5 100644
|
||||
--- a/sysdeps/generic/ldsodefs.h
|
||||
+++ b/sysdeps/generic/ldsodefs.h
|
||||
@@ -653,6 +653,9 @@ struct rtld_global_ro
|
||||
int (*_dl_catch_error) (const char **objname, const char **errstring,
|
||||
bool *mallocedp, void (*operate) (void *),
|
||||
void *args);
|
||||
+ /* libdl in a secondary namespace must use free from the base
|
||||
+ namespace. */
|
||||
+ void (*_dl_error_free) (void *);
|
||||
void *(*_dl_tls_get_addr_soft) (struct link_map *);
|
||||
#ifdef HAVE_DL_DISCOVER_OSVERSION
|
||||
int (*_dl_discover_osversion) (void);
|
||||
@@ -812,6 +815,10 @@ void _dl_exception_create (struct dl_exception *, const char *object,
|
||||
__attribute__ ((nonnull (1, 3)));
|
||||
rtld_hidden_proto (_dl_exception_create)
|
||||
|
||||
+/* Used internally to implement dlerror message freeing. See
|
||||
+ include/dlfcn.h and dlfcn/dlerror.c. */
|
||||
+void _dl_error_free (void *ptr) attribute_hidden;
|
||||
+
|
||||
/* Like _dl_exception_create, but create errstring from a format
|
||||
string FMT. Currently, only "%s" and "%%" are supported as format
|
||||
directives. */
|
134
SOURCES/glibc-rh2047981-7.patch
Normal file
134
SOURCES/glibc-rh2047981-7.patch
Normal file
@ -0,0 +1,134 @@
|
||||
Added $(objpfx)tst-dlmopen-gethostbyname: $(libdl) in elf/Makefile since
|
||||
we still have $(libdl) in RHEL8.
|
||||
|
||||
commit c2059edce20c124d1a99f1a94cc52e83b77a917a
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Thu Jun 17 15:06:43 2021 +0200
|
||||
|
||||
elf: Use _dl_catch_error from base namespace in dl-libc.c [BZ #27646]
|
||||
|
||||
dlerrror_run in elf/dl-libc.c needs to call GLRO (dl_catch_error)
|
||||
from the base namespace, just like the exported dlerror
|
||||
implementation.
|
||||
|
||||
Fixes commit b2964eb1d9a6b8ab1250e8a881cf406182da5875 ("dlfcn:
|
||||
Failures after dlmopen should not terminate process [BZ #24772]").
|
||||
|
||||
Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index e0919486a14cab1a..30417c3ce15abcb4 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -217,6 +217,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-tls20 tst-tls21 \
|
||||
tst-rtld-run-static \
|
||||
tst-dlmopen-dlerror \
|
||||
+ tst-dlmopen-gethostbyname \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -351,6 +352,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
|
||||
libmarkermod5-1 libmarkermod5-2 libmarkermod5-3 libmarkermod5-4 \
|
||||
libmarkermod5-5 tst-tls20mod-bad tst-tls21mod \
|
||||
tst-dlmopen-dlerror-mod \
|
||||
+ tst-dlmopen-gethostbyname-mod \
|
||||
|
||||
# Most modules build with _ISOMAC defined, but those filtered out
|
||||
# depend on internal headers.
|
||||
@@ -1935,3 +1937,5 @@ $(objpfx)tst-tls21.out: $(objpfx)tst-tls21mod.so
|
||||
$(objpfx)tst-tls21mod.so: $(tst-tls-many-dynamic-modules:%=$(objpfx)%.so)
|
||||
|
||||
$(objpfx)tst-rtld-run-static.out: $(objpfx)/ldconfig
|
||||
+$(objpfx)tst-dlmopen-gethostbyname: $(libdl)
|
||||
+$(objpfx)tst-dlmopen-gethostbyname.out: $(objpfx)tst-dlmopen-gethostbyname-mod.so
|
||||
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
|
||||
index fc01f5514d4f656c..3a242d219756dac6 100644
|
||||
--- a/elf/dl-libc.c
|
||||
+++ b/elf/dl-libc.c
|
||||
@@ -43,8 +43,8 @@ dlerror_run (void (*operate) (void *), void *args)
|
||||
const char *last_errstring = NULL;
|
||||
bool malloced;
|
||||
|
||||
- int result = (_dl_catch_error (&objname, &last_errstring, &malloced,
|
||||
- operate, args)
|
||||
+ int result = (GLRO (dl_catch_error) (&objname, &last_errstring, &malloced,
|
||||
+ operate, args)
|
||||
?: last_errstring != NULL);
|
||||
|
||||
if (result && malloced)
|
||||
diff --git a/elf/tst-dlmopen-gethostbyname-mod.c b/elf/tst-dlmopen-gethostbyname-mod.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..9a68ea5050c3060b
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlmopen-gethostbyname-mod.c
|
||||
@@ -0,0 +1,29 @@
|
||||
+/* Exercise dlerror_run in elf/dl-libc.c after dlmopen, via NSS. Helper module.
|
||||
+ Copyright (C) 2021 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 <netdb.h>
|
||||
+#include <nss.h>
|
||||
+
|
||||
+void
|
||||
+call_gethostbyname (void)
|
||||
+{
|
||||
+ __nss_configure_lookup ("hosts", "files");
|
||||
+ /* This should not terminate the process due to a missing
|
||||
+ _nss_files_getcanonname_r symbol. */
|
||||
+ gethostbyname ("localhost");
|
||||
+}
|
||||
diff --git a/elf/tst-dlmopen-gethostbyname.c b/elf/tst-dlmopen-gethostbyname.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..12deb29900731c20
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlmopen-gethostbyname.c
|
||||
@@ -0,0 +1,31 @@
|
||||
+/* Exercise dlerror_run in elf/dl-libc.c after dlmopen, via NSS (bug 27646).
|
||||
+ Copyright (C) 2021 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 <support/xdlfcn.h>
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ void *handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-gethostbyname-mod.so",
|
||||
+ RTLD_NOW);
|
||||
+ void (*call_gethostbyname) (void) = xdlsym (handle, "call_gethostbyname");
|
||||
+ call_gethostbyname ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
29
SOURCES/glibc-rh2047981-8.patch
Normal file
29
SOURCES/glibc-rh2047981-8.patch
Normal file
@ -0,0 +1,29 @@
|
||||
commit 832f50be6c9c010e46180d14126bbb81f35e808c
|
||||
Author: Florian Weimer <fweimer@redhat.com>
|
||||
Date: Tue Jul 6 13:22:01 2021 +0200
|
||||
|
||||
elf: Call free from base namespace on error in dl-libc.c [BZ #27646]
|
||||
|
||||
In dlerror_run, free corresponds to the local malloc in the
|
||||
namespace, but GLRO (dl_catch_error) uses the malloc from the base
|
||||
namespace. elf/tst-dlmopen-gethostbyname triggers this mismatch,
|
||||
but it does not crash, presumably because of a fastbin deallocation.
|
||||
|
||||
Fixes commit c2059edce20c124d1a99f1a94cc52e83b77a917a ("elf: Use
|
||||
_dl_catch_error from base namespace in dl-libc.c [BZ #27646]") and
|
||||
commit b2964eb1d9a6b8ab1250e8a881cf406182da5875 ("dlfcn: Failures
|
||||
after dlmopen should not terminate process [BZ #24772]").
|
||||
|
||||
diff --git a/elf/dl-libc.c b/elf/dl-libc.c
|
||||
index 3a242d219756dac6..bb6e3378d546b234 100644
|
||||
--- a/elf/dl-libc.c
|
||||
+++ b/elf/dl-libc.c
|
||||
@@ -48,7 +48,7 @@ dlerror_run (void (*operate) (void *), void *args)
|
||||
?: last_errstring != NULL);
|
||||
|
||||
if (result && malloced)
|
||||
- free ((char *) last_errstring);
|
||||
+ GLRO (dl_error_free) ((char *) last_errstring);
|
||||
|
||||
return result;
|
||||
}
|
126
SOURCES/glibc-rh2047981-9.patch
Normal file
126
SOURCES/glibc-rh2047981-9.patch
Normal file
@ -0,0 +1,126 @@
|
||||
commit 3908fa933a4354309225af616d9242f595e11ccf
|
||||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed Jun 30 00:21:18 2021 -0300
|
||||
|
||||
elf: Fix audit regression
|
||||
|
||||
Commit 03e187a41d9 added a regression when an audit module does not have
|
||||
libc as DT_NEEDED (although unusual it is possible).
|
||||
|
||||
Checked on x86_64-linux-gnu.
|
||||
|
||||
Conflicts:
|
||||
elf/Makefile
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 30417c3ce15abcb4..6262a4a65cfd2148 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -218,6 +218,7 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
|
||||
tst-rtld-run-static \
|
||||
tst-dlmopen-dlerror \
|
||||
tst-dlmopen-gethostbyname \
|
||||
+ tst-audit17 \
|
||||
# reldep9
|
||||
tests-internal += loadtest unload unload2 circleload1 \
|
||||
neededtest neededtest2 neededtest3 neededtest4 \
|
||||
@@ -1527,6 +1528,16 @@ $(objpfx)tst-auditlogmod-3.so: $(libsupport)
|
||||
$(objpfx)tst-audit16.out: \
|
||||
$(objpfx)tst-auditlogmod-1.so $(objpfx)tst-auditlogmod-2.so \
|
||||
$(objpfx)tst-auditlogmod-3.so
|
||||
+$(objpfx)tst-audit17.out: $(objpfx)tst-auditmod17.so
|
||||
+# The test check if a audit library without libc.so on DT_NEEDED works as
|
||||
+# intended, so it uses an explicit link rule.
|
||||
+$(objpfx)tst-auditmod17.so: $(objpfx)tst-auditmod17.os
|
||||
+ $(CC) -nostdlib -nostartfiles -shared -o $@.new \
|
||||
+ $(filter-out $(map-file),$^)
|
||||
+ $(call after-link,$@.new)
|
||||
+ mv -f $@.new $@
|
||||
+CFLAGS-.os += $(call elide-stack-protector,.os,tst-auditmod17)
|
||||
+tst-audit17-ENV = LD_AUDIT=$(objpfx)tst-auditmod17.so
|
||||
|
||||
# tst-sonamemove links against an older implementation of the library.
|
||||
LDFLAGS-tst-sonamemove-linkmod1.so = \
|
||||
diff --git a/elf/dl-open.c b/elf/dl-open.c
|
||||
index 736df62ce6e46d34..661a2172d1789b26 100644
|
||||
--- a/elf/dl-open.c
|
||||
+++ b/elf/dl-open.c
|
||||
@@ -759,16 +759,9 @@ dl_open_worker_begin (void *a)
|
||||
namespace. */
|
||||
if (!args->libc_already_loaded)
|
||||
{
|
||||
+ /* dlopen cannot be used to load an initial libc by design. */
|
||||
struct link_map *libc_map = GL(dl_ns)[args->nsid].libc_map;
|
||||
-#ifdef SHARED
|
||||
- bool initial = libc_map->l_ns == LM_ID_BASE;
|
||||
-#else
|
||||
- /* In the static case, there is only one namespace, but it
|
||||
- contains a secondary libc (the primary libc is statically
|
||||
- linked). */
|
||||
- bool initial = false;
|
||||
-#endif
|
||||
- _dl_call_libc_early_init (libc_map, initial);
|
||||
+ _dl_call_libc_early_init (libc_map, false);
|
||||
}
|
||||
|
||||
#ifndef SHARED
|
||||
diff --git a/elf/tst-audit17.c b/elf/tst-audit17.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..92986699d497845f
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-audit17.c
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* Check DT_AUDIT with audit not linked against libc.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#include <support/test-driver.c>
|
||||
diff --git a/elf/tst-auditmod17.c b/elf/tst-auditmod17.c
|
||||
new file mode 100644
|
||||
index 0000000000000000..7a4467f597b56cf4
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-auditmod17.c
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* Check DT_AUDIT with audit not linked against libc.
|
||||
+ Copyright (C) 2021 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/>. */
|
||||
+
|
||||
+unsigned int
|
||||
+la_version (unsigned int version)
|
||||
+{
|
||||
+ return version;
|
||||
+}
|
@ -1,6 +1,6 @@
|
||||
%define glibcsrcdir glibc-2.28
|
||||
%define glibcversion 2.28
|
||||
%define glibcrelease 208%{?dist}
|
||||
%define glibcrelease 209%{?dist}
|
||||
# Pre-release tarballs are pulled in from git using a command that is
|
||||
# effectively:
|
||||
#
|
||||
@ -917,6 +917,53 @@ Patch722: glibc-rh2080349-6.patch
|
||||
Patch723: glibc-rh2080349-7.patch
|
||||
Patch724: glibc-rh2080349-8.patch
|
||||
Patch725: glibc-rh2080349-9.patch
|
||||
Patch727: glibc-rh2047981-1.patch
|
||||
Patch728: glibc-rh2047981-2.patch
|
||||
Patch729: glibc-rh2047981-3.patch
|
||||
Patch730: glibc-rh2047981-4.patch
|
||||
Patch731: glibc-rh2047981-5.patch
|
||||
Patch732: glibc-rh2047981-6.patch
|
||||
Patch733: glibc-rh2047981-7.patch
|
||||
Patch734: glibc-rh2047981-8.patch
|
||||
Patch735: glibc-rh2047981-9.patch
|
||||
Patch736: glibc-rh2047981-10.patch
|
||||
Patch737: glibc-rh2047981-11.patch
|
||||
Patch738: glibc-rh2047981-12.patch
|
||||
Patch739: glibc-rh2047981-13.patch
|
||||
Patch740: glibc-rh2047981-14.patch
|
||||
Patch741: glibc-rh2047981-15.patch
|
||||
Patch742: glibc-rh2047981-16.patch
|
||||
Patch743: glibc-rh2047981-17.patch
|
||||
Patch744: glibc-rh2047981-18.patch
|
||||
Patch745: glibc-rh2047981-19.patch
|
||||
Patch746: glibc-rh2047981-20.patch
|
||||
Patch747: glibc-rh2047981-21.patch
|
||||
Patch748: glibc-rh2047981-22.patch
|
||||
Patch749: glibc-rh2047981-23.patch
|
||||
Patch750: glibc-rh2047981-24.patch
|
||||
Patch751: glibc-rh2047981-25.patch
|
||||
Patch752: glibc-rh2047981-26.patch
|
||||
Patch753: glibc-rh2047981-27.patch
|
||||
Patch754: glibc-rh2047981-28.patch
|
||||
Patch755: glibc-rh2047981-29.patch
|
||||
Patch756: glibc-rh2047981-30.patch
|
||||
Patch757: glibc-rh2047981-31.patch
|
||||
Patch758: glibc-rh2047981-32.patch
|
||||
Patch759: glibc-rh2047981-33.patch
|
||||
Patch760: glibc-rh2047981-34.patch
|
||||
Patch761: glibc-rh2047981-35.patch
|
||||
Patch762: glibc-rh2047981-36.patch
|
||||
Patch763: glibc-rh2047981-37.patch
|
||||
Patch764: glibc-rh2047981-38.patch
|
||||
Patch766: glibc-rh2047981-39.patch
|
||||
Patch767: glibc-rh2047981-40.patch
|
||||
Patch768: glibc-rh2047981-41.patch
|
||||
Patch769: glibc-rh2047981-42.patch
|
||||
Patch770: glibc-rh2047981-43.patch
|
||||
Patch771: glibc-rh2047981-44.patch
|
||||
Patch772: glibc-rh2047981-45.patch
|
||||
Patch773: glibc-rh2047981-46.patch
|
||||
Patch774: glibc-rh2047981-47.patch
|
||||
|
||||
##############################################################################
|
||||
# Continued list of core "glibc" package information:
|
||||
@ -2747,8 +2794,12 @@ fi
|
||||
%files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared
|
||||
|
||||
%changelog
|
||||
* Fri Jul 22 2022 Carlos O'Donell <carlos@redhat.com> - 2.28-209
|
||||
- Improve dynamic loader auditing interface (LD_AUDIT) (#2047981)
|
||||
- Add dlinfo() API support for RTLD_DI_PHDR (#2097898)
|
||||
|
||||
* Fri Jul 15 2022 Patsy Griffin <patsy@redhat.com> - 2.28-208
|
||||
- Update syscall-names.list to Linuz 5.18. (#2080349)
|
||||
- Update syscall-names.list to Linux 5.18. (#2080349)
|
||||
|
||||
* Fri Jun 24 2022 Florian Weimer <fweimer@redhat.com> - 2.28-207
|
||||
- Add the no-aaaa DNS stub resolver option (#2096189)
|
||||
|
Loading…
Reference in New Issue
Block a user