42,7 → 42,7 |
#include <symbol.h> |
#include <elf.h> |
|
elf_symbol_t *symbol_def_find(module_t *m, char *name) |
static elf_symbol_t *def_find_in_module(char *name, module_t *m) |
{ |
elf_symbol_t *sym_table; |
elf_symbol_t *sym; |
49,8 → 49,10 |
elf_word nchain; |
size_t i; |
char *s_name; |
char *module_name; |
|
printf("symbol_def_find(m, '%s')\n", name); |
module_name = m->dyn.soname; |
printf("def_find_in_module('%s', %s)\n", name, module_name); |
|
sym_table = m->dyn.sym_tab; |
nchain = m->dyn.hash[1]; |
60,14 → 62,38 |
s_name = m->dyn.str_tab + sym->st_name; |
printf("cmp sym '%s'\n", s_name); |
if (strcmp(name, s_name) == 0) { |
printf("found. idx=%d\n", i); |
printf("name match\n"); |
if (sym->st_shndx != SHN_UNDEF) { |
printf("definition found. idx=%d\n", i); |
return sym; |
} else { |
printf("not a definition\n"); |
} |
} |
} |
|
printf("not found\n"); |
return NULL; |
} |
|
|
elf_symbol_t *symbol_def_find(char *name, module_t **m) |
{ |
elf_symbol_t *sym; |
|
sym = def_find_in_module(name, runtime_env.program); |
if (sym != NULL) { *m = runtime_env.program; return sym; } |
|
sym = def_find_in_module(name, runtime_env.libc); |
if (sym != NULL) { *m = runtime_env.libc; return sym; } |
|
/* sym = def_find_in_module(name, runtime_env.rtld); |
if (sym != NULL) { *m = runtime_env.rtld; return sym; }*/ |
|
printf("symbol found nowhere\n"); |
*m = NULL; |
return NULL; |
} |
|
/** @} |
*/ |