diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-10-13 09:49:34 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-10-14 14:52:07 -0300 |
commit | d6d89608ac8cf2b37c75debad1fff653f6939f90 (patch) | |
tree | 963c9d77032467e0b4af4f274979de09bd5c054e /sysdeps/powerpc/powerpc64 | |
parent | e59ced238482fd71f3e493717f14f6507346741e (diff) | |
download | glibc-d6d89608ac8cf2b37c75debad1fff653f6939f90.tar glibc-d6d89608ac8cf2b37c75debad1fff653f6939f90.tar.gz glibc-d6d89608ac8cf2b37c75debad1fff653f6939f90.tar.bz2 glibc-d6d89608ac8cf2b37c75debad1fff653f6939f90.zip |
elf: Fix dynamic-link.h usage on rtld.c
The 4af6982e4c fix does not fully handle RTLD_BOOTSTRAP usage on
rtld.c due two issues:
1. RTLD_BOOTSTRAP is also used on dl-machine.h on various
architectures and it changes the semantics of various machine
relocation functions.
2. The elf_get_dynamic_info() change was done sideways, previously
to 490e6c62aa get-dynamic-info.h was included by the first
dynamic-link.h include *without* RTLD_BOOTSTRAP being defined.
It means that the code within elf_get_dynamic_info() that uses
RTLD_BOOTSTRAP is in fact unused.
To fix 1. this patch now includes dynamic-link.h only once with
RTLD_BOOTSTRAP defined. The ELF_DYNAMIC_RELOCATE call will now have
the relocation fnctions with the expected semantics for the loader.
And to fix 2. part of 4af6982e4c is reverted (the check argument
elf_get_dynamic_info() is not required) and the RTLD_BOOTSTRAP
pieces are removed.
To reorganize the includes the static TLS definition is moved to
its own header to avoid a circular dependency (it is defined on
dynamic-link.h and dl-machine.h requires it at same time other
dynamic-link.h definition requires dl-machine.h defitions).
Also ELF_MACHINE_NO_REL, ELF_MACHINE_NO_RELA, and ELF_MACHINE_PLT_REL
are moved to its own header. Only ancient ABIs need special values
(arm, i386, and mips), so a generic one is used as default.
The powerpc Elf64_FuncDesc is also moved to its own header, since
csu code required its definition (which would require either include
elf/ folder or add a full path with elf/).
Checked on x86_64, i686, aarch64, armhf, powerpc64, powerpc32,
and powerpc64le.
Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Diffstat (limited to 'sysdeps/powerpc/powerpc64')
-rw-r--r-- | sysdeps/powerpc/powerpc64/dl-funcdesc.h | 34 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/dl-irel.h | 2 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/dl-machine.h | 19 |
3 files changed, 38 insertions, 17 deletions
diff --git a/sysdeps/powerpc/powerpc64/dl-funcdesc.h b/sysdeps/powerpc/powerpc64/dl-funcdesc.h new file mode 100644 index 0000000000..b2d1f76ce0 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/dl-funcdesc.h @@ -0,0 +1,34 @@ +/* PowerPC ELFv1 function descriptor definition. + Copyright (C) 2009-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_FUNCDESC_H +#define _DL_FUNCDESC_H + +#if _CALL_ELF != 2 +/* A PowerPC64 function descriptor. The .plt (procedure linkage + table) and .opd (official procedure descriptor) sections are + arrays of these. */ +typedef struct +{ + Elf64_Addr fd_func; + Elf64_Addr fd_toc; + Elf64_Addr fd_aux; +} Elf64_FuncDesc; +#endif + +#endif diff --git a/sysdeps/powerpc/powerpc64/dl-irel.h b/sysdeps/powerpc/powerpc64/dl-irel.h index 0e11b7ff64..aa9a2dca71 100644 --- a/sysdeps/powerpc/powerpc64/dl-irel.h +++ b/sysdeps/powerpc/powerpc64/dl-irel.h @@ -23,7 +23,7 @@ #include <stdio.h> #include <unistd.h> #include <ldsodefs.h> -#include <dl-machine.h> +#include <dl-funcdesc.h> #define ELF_MACHINE_IRELA 1 diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 3f92fbb369..3a4a21a412 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -28,23 +28,14 @@ #include <sysdep.h> #include <hwcapinfo.h> #include <cpu-features.c> +#include <dl-static-tls.h> +#include <dl-funcdesc.h> +#include <dl-machine-rel.h> /* Translate a processor specific dynamic tag to the index in l_info array. */ #define DT_PPC64(x) (DT_PPC64_##x - DT_LOPROC + DT_NUM) -#if _CALL_ELF != 2 -/* A PowerPC64 function descriptor. The .plt (procedure linkage - table) and .opd (official procedure descriptor) sections are - arrays of these. */ -typedef struct -{ - Elf64_Addr fd_func; - Elf64_Addr fd_toc; - Elf64_Addr fd_aux; -} Elf64_FuncDesc; -#endif - #define ELF_MULT_MACHINES_SUPPORTED /* Return nonzero iff ELF header is compatible with the running host. */ @@ -292,10 +283,6 @@ BODY_PREFIX "_dl_start_user:\n" \ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_PPC64_JMP_SLOT -/* The PowerPC never uses REL relocations. */ -#define ELF_MACHINE_NO_REL 1 -#define ELF_MACHINE_NO_RELA 0 - /* We define an initialization function to initialize HWCAP/HWCAP2 and platform data so it can be copied into the TCB later. This is called very early in _dl_sysdep_start for dynamically linked binaries. */ |