Skip to content

Commit

Permalink
elfhacks: d_un.d_ptr is relative on non glibc systems
Browse files Browse the repository at this point in the history
elf(5) documents it this way, GLIBC diverts from this documentation

partial fix for flightlessmango#601
  • Loading branch information
Johnnynator committed Sep 28, 2023
1 parent a2c421a commit fc92530
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
22 changes: 14 additions & 8 deletions src/elfhacks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
* \{
*/

#ifdef __GLIBC__
# define ABS_ADDR(obj, ptr) (ptr)
#else
# define ABS_ADDR(obj, ptr) ((obj->addr) + (ptr))
#endif

struct eh_iterate_callback_args {
eh_iterate_obj_callback_func callback;
void *arg;
Expand Down Expand Up @@ -196,22 +202,22 @@ int eh_init_obj(eh_obj_t *obj)
if (obj->strtab)
return ENOTSUP;

obj->strtab = (const char *) obj->dynamic[p].d_un.d_ptr;
obj->strtab = (const char *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
} else if (obj->dynamic[p].d_tag == DT_HASH) {
if (obj->hash)
return ENOTSUP;

obj->hash = (ElfW(Word) *) obj->dynamic[p].d_un.d_ptr;
obj->hash = (ElfW(Word) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
} else if (obj->dynamic[p].d_tag == DT_GNU_HASH) {
if (obj->gnu_hash)
return ENOTSUP;

obj->gnu_hash = (Elf32_Word *) obj->dynamic[p].d_un.d_ptr;
obj->gnu_hash = (Elf32_Word *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
} else if (obj->dynamic[p].d_tag == DT_SYMTAB) {
if (obj->symtab)
return ENOTSUP;

obj->symtab = (ElfW(Sym) *) obj->dynamic[p].d_un.d_ptr;
obj->symtab = (ElfW(Sym) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
}
p++;
}
Expand Down Expand Up @@ -449,7 +455,7 @@ int eh_find_next_dyn(eh_obj_t *obj, ElfW_Sword tag, int i, ElfW(Dyn) **next)

int eh_set_rela_plt(eh_obj_t *obj, int p, const char *sym, void *val)
{
ElfW(Rela) *rela = (ElfW(Rela) *) obj->dynamic[p].d_un.d_ptr;
ElfW(Rela) *rela = (ElfW(Rela) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
ElfW(Dyn) *relasize;
unsigned int i;

Expand All @@ -470,7 +476,7 @@ int eh_set_rela_plt(eh_obj_t *obj, int p, const char *sym, void *val)

int eh_set_rel_plt(eh_obj_t *obj, int p, const char *sym, void *val)
{
ElfW(Rel) *rel = (ElfW(Rel) *) obj->dynamic[p].d_un.d_ptr;
ElfW(Rel) *rel = (ElfW(Rel) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
ElfW(Dyn) *relsize;
unsigned int i;

Expand Down Expand Up @@ -520,7 +526,7 @@ int eh_set_rel(eh_obj_t *obj, const char *sym, void *val)

int eh_iterate_rela_plt(eh_obj_t *obj, int p, eh_iterate_rel_callback_func callback, void *arg)
{
ElfW(Rela) *rela = (ElfW(Rela) *) obj->dynamic[p].d_un.d_ptr;
ElfW(Rela) *rela = (ElfW(Rela) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
ElfW(Dyn) *relasize;
eh_rel_t rel;
eh_sym_t sym;
Expand Down Expand Up @@ -550,7 +556,7 @@ int eh_iterate_rela_plt(eh_obj_t *obj, int p, eh_iterate_rel_callback_func callb

int eh_iterate_rel_plt(eh_obj_t *obj, int p, eh_iterate_rel_callback_func callback, void *arg)
{
ElfW(Rel) *relp = (ElfW(Rel) *) obj->dynamic[p].d_un.d_ptr;
ElfW(Rel) *relp = (ElfW(Rel) *) ABS_ADDR(obj, obj->dynamic[p].d_un.d_ptr);
ElfW(Dyn) *relsize;
eh_rel_t rel;
eh_sym_t sym;
Expand Down
1 change: 1 addition & 0 deletions src/real_dlsym.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ static void get_real_functions()
#endif
"*libc.so*",
"*libc.*.so*",
"*ld-musl-*.so*",
};

for (size_t i = 0; i < sizeof(libs) / sizeof(*libs); i++)
Expand Down

0 comments on commit fc92530

Please sign in to comment.