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 42... Line 42...
42
#include <rtld.h>
42
#include <rtld.h>
43
 
43
 
44
/**
44
/**
45
 * Process (fixup) all relocations in a relocation table.
45
 * Process (fixup) all relocations in a relocation table.
46
 */
46
 */
47
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size,
47
void rel_table_process(module_t *m, elf_rel_t *rt, size_t rt_size)
48
    module_t *dest)
-
 
49
{
48
{
50
    int i;
49
    int i;
51
 
50
 
52
    size_t rt_entries;
51
    size_t rt_entries;
53
    size_t r_offset;
52
    size_t r_offset;
Line 60... Line 59...
60
    elf_symbol_t *sym;
59
    elf_symbol_t *sym;
61
    uint32_t *r_ptr;
60
    uint32_t *r_ptr;
62
    char *str_tab;
61
    char *str_tab;
63
   
62
   
64
    elf_symbol_t *sym_def;
63
    elf_symbol_t *sym_def;
-
 
64
    module_t *dest;
65
 
65
 
66
    printf("parse relocation table\n");
66
    printf("parse relocation table\n");
67
 
67
 
68
    sym_table = m->dyn.sym_tab;
68
    sym_table = m->dyn.sym_tab;
69
    rt_entries = rt_size / sizeof(elf_rel_t);
69
    rt_entries = rt_size / sizeof(elf_rel_t);
Line 86... Line 86...
86
 
86
 
87
        rel_type = ELF32_R_TYPE(r_info);
87
        rel_type = ELF32_R_TYPE(r_info);
88
        r_ptr = (uint32_t *)(r_offset + m->bias);
88
        r_ptr = (uint32_t *)(r_offset + m->bias);
89
 
89
 
90
        printf("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
90
        printf("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
91
        sym_def = symbol_def_find(dest, str_tab + sym->st_name);
91
        sym_def = symbol_def_find(str_tab + sym->st_name, &dest);
-
 
92
        printf("dest name: '%s'\n", dest->dyn.soname);
-
 
93
        printf("dest bias: 0x%x\n", dest->bias);
92
        if (sym_def) {
94
        if (sym_def) {
93
            sym_addr = sym_def->st_value + dest->bias;
95
            sym_addr = sym_def->st_value + dest->bias;
94
            printf("symbol definition found, addr=0x%x\n", sym_addr);
96
            printf("symbol definition found, addr=0x%x\n", sym_addr);
95
        } else {
97
        } else {
96
            printf("symbol definition not found\n");
98
            printf("symbol definition not found\n");
Line 109... Line 111...
109
            *r_ptr += sym_addr;
111
            *r_ptr += sym_addr;
110
            break;
112
            break;
111
           
113
           
112
        case R_386_RELATIVE:
114
        case R_386_RELATIVE:
113
            printf("fixup R_386_RELATIVE (b+a)\n");
115
            printf("fixup R_386_RELATIVE (b+a)\n");
114
            *r_ptr += dest->bias;
116
            *r_ptr += m->bias;
115
            break;
117
            break;
116
        }
118
        }
117
    }
119
    }
118
 
120
 
119
}
121
}