Subversion Repositories HelenOS

Rev

Rev 2978 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2978 Rev 2980
Line 40... Line 40...
40
 
40
 
41
#include <rtld.h>
41
#include <rtld.h>
42
#include <symbol.h>
42
#include <symbol.h>
43
#include <elf.h>
43
#include <elf.h>
44
 
44
 
45
elf_symbol_t *symbol_def_find(module_t *m, char *name)
45
static elf_symbol_t *def_find_in_module(char *name, module_t *m)
46
{
46
{
47
    elf_symbol_t *sym_table;
47
    elf_symbol_t *sym_table;
48
    elf_symbol_t *sym;
48
    elf_symbol_t *sym;
49
    elf_word nchain;
49
    elf_word nchain;
50
    size_t i;
50
    size_t i;
51
    char *s_name;
51
    char *s_name;
-
 
52
    char *module_name;
52
 
53
 
-
 
54
    module_name = m->dyn.soname;
53
    printf("symbol_def_find(m, '%s')\n", name);
55
    printf("def_find_in_module('%s', %s)\n", name, module_name);
54
 
56
 
55
    sym_table = m->dyn.sym_tab;
57
    sym_table = m->dyn.sym_tab;
56
    nchain = m->dyn.hash[1];
58
    nchain = m->dyn.hash[1];
57
 
59
 
58
    for (i = 0; i < nchain; ++i) {
60
    for (i = 0; i < nchain; ++i) {
59
        sym = &sym_table[i];
61
        sym = &sym_table[i];
60
        s_name = m->dyn.str_tab + sym->st_name;
62
        s_name = m->dyn.str_tab + sym->st_name;
61
        printf("cmp sym '%s'\n", s_name);
63
        printf("cmp sym '%s'\n", s_name);
62
        if (strcmp(name, s_name) == 0) {
64
        if (strcmp(name, s_name) == 0) {
-
 
65
            printf("name match\n");
-
 
66
            if (sym->st_shndx != SHN_UNDEF) {
63
            printf("found. idx=%d\n", i);
67
                printf("definition found. idx=%d\n", i);
64
            return sym;
68
                return sym;
-
 
69
            } else {
-
 
70
                printf("not a definition\n");
-
 
71
            }
65
        }
72
        }
66
    }
73
    }
67
 
74
 
68
    printf("not found\n");
75
    printf("not found\n");
69
    return NULL;
76
    return NULL;
70
}
77
}
71
 
78
 
-
 
79
 
-
 
80
elf_symbol_t *symbol_def_find(char *name, module_t **m)
-
 
81
{
-
 
82
    elf_symbol_t *sym;
-
 
83
 
-
 
84
    sym = def_find_in_module(name, runtime_env.program);
-
 
85
    if (sym != NULL) { *m = runtime_env.program; return sym; } 
-
 
86
 
-
 
87
    sym = def_find_in_module(name, runtime_env.libc);
-
 
88
    if (sym != NULL) { *m = runtime_env.libc; return sym; }
-
 
89
 
-
 
90
/*  sym = def_find_in_module(name, runtime_env.rtld);
-
 
91
    if (sym != NULL) { *m = runtime_env.rtld; return sym; }*/
-
 
92
 
-
 
93
    printf("symbol found nowhere\n");
-
 
94
    *m = NULL;
-
 
95
    return NULL;
-
 
96
}
-
 
97
 
72
/** @}
98
/** @}
73
 */
99
 */