]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/generic/dl-machine.h
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / generic / dl-machine.h
CommitLineData
d66e34cd 1/* Machine-dependent ELF dynamic relocation inline functions. Stub version.
6d7e8eda 2 Copyright (C) 1995-2023 Free Software Foundation, Inc.
47707456 3 This file is part of the GNU C Library.
d66e34cd 4
47707456 5 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
d66e34cd 9
47707456
UD
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 13 Lesser General Public License for more details.
d66e34cd 14
41bdb6e2 15 You should have received a copy of the GNU Lesser General Public
59ba27a6 16 License along with the GNU C Library; if not, see
5a82c748 17 <https://www.gnu.org/licenses/>. */
d66e34cd
RM
18
19#define ELF_MACHINE_NAME "stub"
20
d66e34cd
RM
21#include <string.h>
22#include <link.h>
d6d89608
AZ
23#include <dl-static-tls.h>
24#include <dl-machine-rel.h>
d66e34cd
RM
25
26
ceb579a3 27/* Return nonzero iff ELF header is compatible with the running host. */
d66e34cd 28static inline int
ceb579a3 29elf_machine_matches_host (const Elf32_Ehdr *ehdr)
d66e34cd 30{
ceb579a3 31 switch (ehdr->e_machine)
d66e34cd
RM
32 {
33 default:
34 return 0;
35 }
36}
37
38
47707456
UD
39/* Return the link-time address of _DYNAMIC. */
40static inline Elf32_Addr
41elf_machine_dynamic (void)
d66e34cd 42{
47707456 43#error "Damn, no _DYNAMIC"
d66e34cd
RM
44}
45
46
47/* Return the run-time load address of the shared object. */
48static inline Elf32_Addr
49elf_machine_load_address (void)
50{
51#error "Where am I?"
52}
53
a2b08ee5
UD
54/* Fixup a PLT entry to bounce directly to the function at VALUE. */
55
0572433b 56static inline ElfW(Addr)
c0282c06 57elf_machine_fixup_plt (struct link_map *map, lookup_t t,
0572433b
AM
58 const ElfW(Sym) *refsym, const ElfW(Sym) *sym,
59 const ElfW(Rel) *reloc,
60 ElfW(Addr) *reloc_addr, ElfW(Addr) value)
a2b08ee5 61{
c0282c06 62 return *reloc_addr = value;
a2b08ee5 63}
d66e34cd
RM
64
65/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
66 LOADADDR is the load address of the object; INFO is an array indexed
67 by DT_* of the .dynamic section info. */
68
1b243ca9
RM
69auto inline void
70__attribute__ ((always_inline))
d66e34cd 71elf_machine_rel (Elf32_Addr loadaddr, Elf32_Dyn *info[DT_NUM],
710f7bab
RM
72 const Elf32_Rel *reloc, const Elf32_Sym *sym,
73 Elf32_Addr (*resolve) (const Elf32_Sym **ref,
74 Elf32_Addr reloc_addr,
75 int noplt))
d66e34cd
RM
76{
77 Elf32_Addr *const reloc_addr = (Elf32_Addr *) reloc->r_offset;
710f7bab 78 Elf32_Addr loadbase;
d66e34cd
RM
79
80 switch (ELF32_R_TYPE (reloc->r_info))
81 {
82 case R_MACHINE_COPY:
710f7bab
RM
83 loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
84 memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
d66e34cd
RM
85 break;
86 default:
421c80d2 87 _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
d66e34cd
RM
88 break;
89 }
90}
91
92
1b243ca9
RM
93auto inline Elf32_Addr
94__attribute__ ((always_inline))
d66e34cd 95elf_machine_rela (Elf32_Addr loadaddr, Elf32_Dyn *info[DT_NUM],
710f7bab
RM
96 const Elf32_Rel *reloc, const Elf32_Sym *sym,
97 Elf32_Addr (*resolve) (const Elf32_Sym **ref,
98 Elf32_Addr reloc_addr,
99 int noplt))
d66e34cd
RM
100{
101 _dl_signal_error (0, "Elf32_Rela relocation requested -- unused on "
84aafa91 102 NULL, ELF_MACHINE_NAME);
d66e34cd
RM
103}
104
105
106/* Set up the loaded object described by L so its unrelocated PLT
107 entries will jump to the on-demand fixup code in dl-runtime.c. */
108
0501d603
UD
109static inline int
110elf_machine_runtime_setup (struct link_map *l, int lazy)
d66e34cd
RM
111{
112 extern void _dl_runtime_resolve (Elf32_Word);
0501d603 113
a2b08ee5 114 if (lazy)
0501d603
UD
115 {
116 /* The GOT entries for functions in the PLT have not yet been filled
117 in. Their initial contents will arrange when called to push an
118 offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
119 and then jump to _GLOBAL_OFFSET_TABLE[2]. */
a42195db 120 Elf32_Addr *got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
0501d603
UD
121 got[1] = (Elf32_Addr) l; /* Identify this shared object. */
122
123 /* This function will get called to fix up the GOT entry indicated by
124 the offset on the stack, and then jump to the resolved address. */
125 got[2] = (Elf32_Addr) &_dl_runtime_resolve;
126 }
127
128 return lazy;
d66e34cd
RM
129}
130
131
132/* Initial entry point code for the dynamic linker.
133 The C function `_dl_start' is the real entry point;
134 its return value is the user program's entry point. */
135
136#define RTLD_START #error need some startup code