blob: bc8717dc21a72fece3d7cded3242351786a1cedc (
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
|
#include <dlfcn.h>
#include "_dl_int.h"
static void exit_now(void) {
#ifdef DEBUG
pf(__func__": symbol not found\n");
#endif
_exit(213);
}
unsigned long do_rel(struct _dl_handle * tmp_dl, unsigned long off)
{
Elf_Rel *tmp = ((void*)tmp_dl->plt_rel)+off;
int sym=ELF_R_SYM(tmp->r_info);
register unsigned long sym_val;
#ifdef DEBUG
pf(__func__": "); ph((unsigned long)tmp_dl); pf(" "); ph(off); pf(" on ");
ph((long)tmp_dl->plt_rel); pf("\n");
pf(__func__": @ "); ph((long)tmp->r_offset); pf(" with type ");
ph(ELF_R_TYPE(tmp->r_info)); pf(" and sym "); ph(sym);
pf(" symval "); ph(tmp_dl->dyn_sym_tab[sym].st_value); pf("\n");
#endif
/* modify GOT for REAL symbol */
//sym_val=((unsigned long)(tmp_dl->mem_base+tmp_dl->dyn_sym_tab[sym].st_value));
sym_val=(unsigned long)_dl_sym(tmp_dl,sym);
*((unsigned long*)(tmp_dl->mem_base+tmp->r_offset))=sym_val;
#ifdef DEBUG
pf(__func__": sym "); ph(sym_val); pf("\n");
#endif
/* JUMP (arg sysdep...) */
if (sym_val) return sym_val;
/* can't find symbol -> die now */
return (unsigned long)exit_now;
}
|