summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libdl/_dl_rel.c
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;
}