blob: 578202d235a1bc361fc585212735434457825eda (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
/* Support for relocating static PIE.
Copyright (C) 2017-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 <elf.h>
#include <dl-elf.h>
ElfW(Addr) _dl_load_base = NULL;
void
reloc_static_pie (ElfW(Addr) load_addr);
void
reloc_static_pie (ElfW(Addr) load_addr)
{
ElfW(Word) relative_count = 0;
ElfW(Addr) rel_addr = 0;
ElfW(Dyn) * dyn_addr = NULL;
unsigned long dynamic_info[DYNAMIC_SIZE] = {0};
/* Read our own dynamic section and fill in the info array. */
dyn_addr = ((void *) load_addr + elf_machine_dynamic ());
/* Use the underlying function to avoid TLS access before initialization */
__dl_parse_dynamic_info(dyn_addr, dynamic_info, NULL, load_addr);
/* Perform relocations */
relative_count = dynamic_info[DT_RELCONT_IDX];
rel_addr = dynamic_info[DT_RELOC_TABLE_ADDR];
elf_machine_relative(load_addr, rel_addr, relative_count);
_dl_load_base = load_addr;
}
|