2009-10-30 07:39:38 +00:00
|
|
|
/* Machine-dependent ELF indirect relocation inline functions.
|
|
|
|
PowerPC64 version.
|
2023-01-06 21:08:04 +00:00
|
|
|
Copyright (C) 2009-2023 Free Software Foundation, Inc.
|
2009-10-30 07:39:38 +00:00
|
|
|
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
|
2012-02-09 23:18:22 +00:00
|
|
|
License along with the GNU C Library; if not, see
|
Prefer https to http for gnu.org and fsf.org URLs
Also, change sources.redhat.com to sourceware.org.
This patch was automatically generated by running the following shell
script, which uses GNU sed, and which avoids modifying files imported
from upstream:
sed -ri '
s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g
s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g
' \
$(find $(git ls-files) -prune -type f \
! -name '*.po' \
! -name 'ChangeLog*' \
! -path COPYING ! -path COPYING.LIB \
! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \
! -path manual/texinfo.tex ! -path scripts/config.guess \
! -path scripts/config.sub ! -path scripts/install-sh \
! -path scripts/mkinstalldirs ! -path scripts/move-if-change \
! -path INSTALL ! -path locale/programs/charmap-kw.h \
! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \
! '(' -name configure \
-execdir test -f configure.ac -o -f configure.in ';' ')' \
! '(' -name preconfigure \
-execdir test -f preconfigure.ac ';' ')' \
-print)
and then by running 'make dist-prepare' to regenerate files built
from the altered files, and then executing the following to cleanup:
chmod a+x sysdeps/unix/sysv/linux/riscv/configure
# Omit irrelevant whitespace and comment-only changes,
# perhaps from a slightly-different Autoconf version.
git checkout -f \
sysdeps/csky/configure \
sysdeps/hppa/configure \
sysdeps/riscv/configure \
sysdeps/unix/sysv/linux/csky/configure
# Omit changes that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines
git checkout -f \
sysdeps/powerpc/powerpc64/ppc-mcount.S \
sysdeps/unix/sysv/linux/s390/s390-64/syscall.S
# Omit change that caused a pre-commit check to fail like this:
# remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline
git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
|
|
|
<https://www.gnu.org/licenses/>. */
|
2009-10-30 07:39:38 +00:00
|
|
|
|
|
|
|
#ifndef _DL_IREL_H
|
|
|
|
#define _DL_IREL_H
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <unistd.h>
|
2011-07-03 23:45:03 +00:00
|
|
|
#include <ldsodefs.h>
|
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>
2021-10-13 12:49:34 +00:00
|
|
|
#include <dl-funcdesc.h>
|
2009-10-30 07:39:38 +00:00
|
|
|
|
|
|
|
#define ELF_MACHINE_IRELA 1
|
|
|
|
|
2011-06-21 02:56:40 +00:00
|
|
|
static inline Elf64_Addr
|
|
|
|
__attribute ((always_inline))
|
|
|
|
elf_ifunc_invoke (Elf64_Addr addr)
|
|
|
|
{
|
2012-05-25 17:30:42 +00:00
|
|
|
return ((Elf64_Addr (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap));
|
2011-06-21 02:56:40 +00:00
|
|
|
}
|
|
|
|
|
2009-10-30 07:39:38 +00:00
|
|
|
static inline void
|
|
|
|
__attribute ((always_inline))
|
|
|
|
elf_irela (const Elf64_Rela *reloc)
|
|
|
|
{
|
|
|
|
unsigned int r_type = ELF64_R_TYPE (reloc->r_info);
|
|
|
|
|
2014-02-10 13:45:42 +00:00
|
|
|
if (__glibc_likely (r_type == R_PPC64_IRELATIVE))
|
2009-10-30 07:39:38 +00:00
|
|
|
{
|
|
|
|
Elf64_Addr *const reloc_addr = (void *) reloc->r_offset;
|
2011-06-21 02:56:40 +00:00
|
|
|
Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend);
|
2009-10-30 07:39:38 +00:00
|
|
|
*reloc_addr = value;
|
|
|
|
}
|
2014-02-10 13:45:42 +00:00
|
|
|
else if (__glibc_likely (r_type == R_PPC64_JMP_IREL))
|
2009-10-30 07:39:38 +00:00
|
|
|
{
|
|
|
|
Elf64_Addr *const reloc_addr = (void *) reloc->r_offset;
|
2011-06-21 02:56:40 +00:00
|
|
|
Elf64_Addr value = elf_ifunc_invoke(reloc->r_addend);
|
2013-12-04 12:51:11 +00:00
|
|
|
#if _CALL_ELF != 2
|
2009-10-30 07:39:38 +00:00
|
|
|
*(Elf64_FuncDesc *) reloc_addr = *(Elf64_FuncDesc *) value;
|
2013-12-04 12:51:11 +00:00
|
|
|
#else
|
|
|
|
*reloc_addr = value;
|
|
|
|
#endif
|
2009-10-30 07:39:38 +00:00
|
|
|
}
|
|
|
|
else
|
2018-09-01 01:04:32 +00:00
|
|
|
__libc_fatal ("Unexpected reloc type in static binary.\n");
|
2009-10-30 07:39:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* dl-irel.h */
|