|
@@ -102,18 +102,17 @@ uintptr_t __guard attribute_relro;
|
|
|
#endif
|
|
|
|
|
|
static void _dl_run_array_forward(unsigned long array, unsigned long size,
|
|
|
- DL_LOADADDR_TYPE loadaddr)
|
|
|
+ ElfW(Addr) loadaddr)
|
|
|
{
|
|
|
if (array != 0) {
|
|
|
unsigned int j;
|
|
|
unsigned int jm;
|
|
|
ElfW(Addr) *addrs;
|
|
|
jm = size / sizeof (ElfW(Addr));
|
|
|
- addrs = (ElfW(Addr) *) DL_RELOC_ADDR (array, loadaddr);
|
|
|
+ addrs = (ElfW(Addr) *) (array + loadaddr);
|
|
|
for (j = 0; j < jm; ++j) {
|
|
|
void (*dl_elf_func) (void);
|
|
|
- dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (addrs[j],
|
|
|
- loadaddr);
|
|
|
+ dl_elf_func = (void (*)(void)) (intptr_t) addrs[j];
|
|
|
(*dl_elf_func) ();
|
|
|
}
|
|
|
}
|
|
@@ -137,13 +136,11 @@ void _dl_run_fini_array(struct elf_resolve *tpnt);
|
|
|
void _dl_run_fini_array(struct elf_resolve *tpnt)
|
|
|
{
|
|
|
if (tpnt->dynamic_info[DT_FINI_ARRAY]) {
|
|
|
- ElfW(Addr) *array = (ElfW(Addr) *) DL_RELOC_ADDR (tpnt->dynamic_info[DT_FINI_ARRAY],
|
|
|
- tpnt->loadaddr);
|
|
|
+ ElfW(Addr) *array = (ElfW(Addr) *) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI_ARRAY]);
|
|
|
unsigned int i = (tpnt->dynamic_info[DT_FINI_ARRAYSZ] / sizeof(ElfW(Addr)));
|
|
|
while (i-- > 0) {
|
|
|
void (*dl_elf_func) (void);
|
|
|
- dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (array[i],
|
|
|
- tpnt->loadaddr);
|
|
|
+ dl_elf_func = (void (*)(void)) (intptr_t) array[i];
|
|
|
(*dl_elf_func) ();
|
|
|
}
|
|
|
}
|
|
@@ -169,15 +166,14 @@ static void __attribute__ ((destructor)) __attribute_used__ _dl_fini(void)
|
|
|
if (tpnt->dynamic_info[DT_FINI]) {
|
|
|
void (*dl_elf_func) (void);
|
|
|
|
|
|
- dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (tpnt->dynamic_info[DT_FINI],
|
|
|
- tpnt->loadaddr);
|
|
|
+ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);
|
|
|
_dl_if_debug_dprint("\ncalling FINI: %s\n\n", tpnt->libname);
|
|
|
(*dl_elf_func) ();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
+void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
|
|
|
ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp,
|
|
|
char **argv)
|
|
|
{
|
|
@@ -299,13 +295,13 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
|
|
|
for (idx = 0; idx < auxvt[AT_PHNUM].a_un.a_val; idx++, phdr++)
|
|
|
if (phdr->p_type == PT_PHDR) {
|
|
|
- DL_INIT_LOADADDR_PROG (app_tpnt->loadaddr, (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - ppnt->p_vaddr));
|
|
|
+ app_tpnt->loadaddr = (ElfW(Addr)) (auxvt[AT_PHDR].a_un.a_val - phdr->p_vaddr);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (DL_LOADADDR_BASE (app_tpnt->loadaddr))
|
|
|
+ if (app_tpnt->loadaddr)
|
|
|
_dl_debug_early("Position Independent Executable: "
|
|
|
- "app_tpnt->loadaddr=%x\n", DL_LOADADDR_BASE (app_tpnt->loadaddr));
|
|
|
+ "app_tpnt->loadaddr=%x\n", app_tpnt->loadaddr);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -322,7 +318,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
relro_size = ppnt->p_memsz;
|
|
|
}
|
|
|
if (ppnt->p_type == PT_DYNAMIC) {
|
|
|
- dpnt = (ElfW(Dyn) *) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr);
|
|
|
+ dpnt = (ElfW(Dyn) *) (ppnt->p_vaddr + app_tpnt->loadaddr);
|
|
|
_dl_parse_dynamic_info(dpnt, app_tpnt->dynamic_info, debug_addr, app_tpnt->loadaddr);
|
|
|
#ifndef __FORCE_SHAREABLE_TEXT_SEGMENTS__
|
|
|
|
|
@@ -335,11 +331,11 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
if (app_tpnt->dynamic_info[DT_TEXTREL]) {
|
|
|
ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val;
|
|
|
for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) {
|
|
|
- if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) {
|
|
|
- void *base = DL_RELOC_ADDR (ppnt->p_vaddr & PAGE_ALIGN, app_tpnt->loadaddr);
|
|
|
- _dl_mprotect(base, (ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz,
|
|
|
+ if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W))
|
|
|
+ _dl_mprotect((void *) ((ppnt->p_vaddr + app_tpnt->loadaddr) & PAGE_ALIGN),
|
|
|
+ ((ppnt->p_vaddr + app_tpnt->loadaddr) & ADDR_ALIGN) +
|
|
|
+ (unsigned long) ppnt->p_filesz,
|
|
|
PROT_READ | PROT_WRITE | PROT_EXEC);
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
@@ -350,10 +346,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
continue;
|
|
|
#endif
|
|
|
|
|
|
- app_tpnt = _dl_add_elf_hash_table(_dl_progname, app_tpnt->loadaddr,
|
|
|
- app_tpnt->dynamic_info,
|
|
|
- (unsigned long) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr),
|
|
|
- ppnt->p_filesz);
|
|
|
+ app_tpnt = _dl_add_elf_hash_table(_dl_progname, (char *)app_tpnt->loadaddr,
|
|
|
+ app_tpnt->dynamic_info, ppnt->p_vaddr + app_tpnt->loadaddr, ppnt->p_filesz);
|
|
|
_dl_loaded_modules->libtype = elf_executable;
|
|
|
_dl_loaded_modules->ppnt = (ElfW(Phdr) *) auxvt[AT_PHDR].a_un.a_val;
|
|
|
_dl_loaded_modules->n_phent = auxvt[AT_PHNUM].a_un.a_val;
|
|
@@ -374,7 +368,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
if (ppnt->p_type == PT_INTERP) {
|
|
|
char *ptmp;
|
|
|
|
|
|
- tpnt->libname = (char *) DL_RELOC_ADDR (ppnt->p_vaddr, app_tpnt->loadaddr);
|
|
|
+ tpnt->libname = (char *) ppnt->p_vaddr + app_tpnt->loadaddr;
|
|
|
|
|
|
|
|
|
* for later use
|
|
@@ -384,8 +378,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
if (ptmp != _dl_ldsopath)
|
|
|
*ptmp = '\0';
|
|
|
|
|
|
- _dl_debug_early("Lib Loader: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt->loadaddr),
|
|
|
- tpnt->libname);
|
|
|
+ _dl_debug_early("Lib Loader: (%x) %s\n", tpnt->loadaddr, tpnt->libname);
|
|
|
}
|
|
|
}
|
|
|
app_tpnt->relro_addr = relro_addr;
|
|
@@ -457,7 +450,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
*/
|
|
|
debug_addr->r_map = (struct link_map *) _dl_loaded_modules;
|
|
|
debug_addr->r_version = 1;
|
|
|
- debug_addr->r_ldbase = (ElfW(Addr)) DL_LOADADDR_BASE (load_addr);
|
|
|
+ debug_addr->r_ldbase = load_addr;
|
|
|
debug_addr->r_brk = (unsigned long) &_dl_debug_state;
|
|
|
_dl_debug_addr = debug_addr;
|
|
|
|
|
@@ -504,7 +497,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
} else {
|
|
|
tpnt1->rtld_flags = unlazy | RTLD_GLOBAL;
|
|
|
|
|
|
- _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname);
|
|
|
+ _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
|
|
|
|
|
|
#ifdef __LDSO_LDD_SUPPORT__
|
|
|
if (trace_loaded_objects &&
|
|
@@ -516,7 +509,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
*/
|
|
|
if (_dl_strcmp(_dl_progname, str) != 0)
|
|
|
_dl_dprintf(1, "\t%s => %s (%x)\n", str, tpnt1->libname,
|
|
|
- (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr));
|
|
|
+ tpnt1->loadaddr);
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
@@ -595,14 +588,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
} else {
|
|
|
tpnt1->rtld_flags = unlazy | RTLD_GLOBAL;
|
|
|
|
|
|
- _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname);
|
|
|
+ _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
|
|
|
|
|
|
#ifdef __LDSO_LDD_SUPPORT__
|
|
|
if (trace_loaded_objects &&
|
|
|
tpnt1->usage_count == 1) {
|
|
|
_dl_dprintf(1, "\t%s => %s (%x)\n",
|
|
|
cp2, tpnt1->libname,
|
|
|
- (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr));
|
|
|
+ (unsigned)tpnt1->loadaddr);
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
@@ -654,14 +647,14 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
|
|
|
tpnt1->rtld_flags = unlazy | RTLD_GLOBAL;
|
|
|
|
|
|
- _dl_debug_early("Loading: (%x) %s\n", (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr), tpnt1->libname);
|
|
|
+ _dl_debug_early("Loading: (%x) %s\n", tpnt1->loadaddr, tpnt1->libname);
|
|
|
|
|
|
#ifdef __LDSO_LDD_SUPPORT__
|
|
|
if (trace_loaded_objects &&
|
|
|
tpnt1->usage_count == 1) {
|
|
|
_dl_dprintf(1, "\t%s => %s (%x)\n",
|
|
|
lpntstr, tpnt1->libname,
|
|
|
- (unsigned) DL_LOADADDR_BASE (tpnt1->loadaddr));
|
|
|
+ (unsigned)tpnt1->loadaddr);
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
@@ -722,10 +715,10 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
*/
|
|
|
if (tpnt) {
|
|
|
ElfW(Ehdr) *epnt = (ElfW(Ehdr) *) auxvt[AT_BASE].a_un.a_val;
|
|
|
- ElfW(Phdr) *myppnt = (ElfW(Phdr) *) DL_RELOC_ADDR (epnt->e_phoff, load_addr);
|
|
|
+ ElfW(Phdr) *myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff);
|
|
|
int j;
|
|
|
|
|
|
- tpnt = _dl_add_elf_hash_table(tpnt->libname, load_addr,
|
|
|
+ tpnt = _dl_add_elf_hash_table(tpnt->libname, (char *)load_addr,
|
|
|
tpnt->dynamic_info,
|
|
|
(unsigned long)tpnt->dynamic_addr,
|
|
|
0);
|
|
@@ -772,7 +765,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
if (trace_loaded_objects) {
|
|
|
_dl_dprintf(1, "\t%s => %s (%x)\n",
|
|
|
rpnt->dyn->libname + _dl_strlen(_dl_ldsopath) + 1,
|
|
|
- rpnt->dyn->libname, (unsigned) DL_LOADADDR_BASE (rpnt->dyn->loadaddr));
|
|
|
+ rpnt->dyn->libname, rpnt->dyn->loadaddr);
|
|
|
_dl_exit(0);
|
|
|
}
|
|
|
#endif
|
|
@@ -824,10 +817,8 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
|
|
|
for (myppnt = tpnt->ppnt, j = 0; j < tpnt->n_phent; j++, myppnt++) {
|
|
|
if (myppnt->p_type == PT_LOAD && !(myppnt->p_flags & PF_W) && tpnt->dynamic_info[DT_TEXTREL]) {
|
|
|
- void *base = DL_RELOC_ADDR (myppnt->p_vaddr & PAGE_ALIGN, tpnt->loadaddr);
|
|
|
- _dl_mprotect(base,
|
|
|
- (myppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) myppnt->p_filesz,
|
|
|
- LXFLAGS(myppnt->p_flags));
|
|
|
+ _dl_mprotect((void *) (tpnt->loadaddr + (myppnt->p_vaddr & PAGE_ALIGN)),
|
|
|
+ (myppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) myppnt->p_filesz, LXFLAGS(myppnt->p_flags));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -855,7 +846,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr,
|
|
|
if (tpnt->dynamic_info[DT_INIT]) {
|
|
|
void (*dl_elf_func) (void);
|
|
|
|
|
|
- dl_elf_func = (void (*)(void)) DL_RELOC_ADDR (tpnt->dynamic_info[DT_INIT], tpnt->loadaddr);
|
|
|
+ dl_elf_func = (void (*)(void)) (intptr_t) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);
|
|
|
|
|
|
_dl_if_debug_dprint("calling INIT: %s\n\n", tpnt->libname);
|
|
|
|