Subversion Repositories HelenOS

Rev

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

Rev 2982 Rev 2983
Line 70... Line 70...
70
    str_tab = m->dyn.str_tab;
70
    str_tab = m->dyn.str_tab;
71
 
71
 
72
    printf("address: 0x%x, entries: %d\n", (uintptr_t)rt, rt_entries);
72
    printf("address: 0x%x, entries: %d\n", (uintptr_t)rt, rt_entries);
73
   
73
   
74
    for (i = 0; i < rt_entries; ++i) {
74
    for (i = 0; i < rt_entries; ++i) {
75
        printf("symbol %d: ", i);
75
//      printf("symbol %d: ", i);
76
        r_offset = rt[i].r_offset;
76
        r_offset = rt[i].r_offset;
77
        r_info = rt[i].r_info;
77
        r_info = rt[i].r_info;
78
 
78
 
79
        sym_idx = ELF32_R_SYM(r_info);
79
        sym_idx = ELF32_R_SYM(r_info);
80
        sym = &sym_table[sym_idx];
80
        sym = &sym_table[sym_idx];
81
 
81
 
82
        printf("name '%s', value 0x%x, size 0x%x\n",
82
/*      printf("name '%s', value 0x%x, size 0x%x\n",
83
            str_tab + sym->st_name,
83
            str_tab + sym->st_name,
84
            sym->st_value,
84
            sym->st_value,
85
            sym->st_size);
85
            sym->st_size);
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
        if (sym->st_name != 0) {
90
        if (sym->st_name != 0) {
91
            printf("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
91
//          printf("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset);
92
            sym_def = symbol_def_find(str_tab + sym->st_name, &dest);
92
            sym_def = symbol_def_find(str_tab + sym->st_name, &dest);
93
            printf("dest name: '%s'\n", dest->dyn.soname);
93
//          printf("dest name: '%s'\n", dest->dyn.soname);
94
            printf("dest bias: 0x%x\n", dest->bias);
94
//          printf("dest bias: 0x%x\n", dest->bias);
95
            if (sym_def) {
95
            if (sym_def) {
-
 
96
                if (sym_def->st_shndx == SHN_ABS) {
-
 
97
                    /* Do not add bias to absolute symbols */
-
 
98
                    sym_addr = sym_def->st_value;
-
 
99
                } else {
96
                sym_addr = sym_def->st_value + dest->bias;
100
                    sym_addr = sym_def->st_value + dest->bias;
-
 
101
                }
97
                printf("symbol definition found, addr=0x%x\n", sym_addr);
102
//              printf("symbol definition found, addr=0x%x\n", sym_addr);
98
            } else {
103
            } else {
99
                printf("symbol definition not found\n");
104
                printf("symbol definition not found\n");
100
                continue;
105
                continue;
101
            }
106
            }
102
        }
107
        }
103
 
108
 
104
        switch (rel_type) {
109
        switch (rel_type) {
105
        case R_386_GLOB_DAT:
110
        case R_386_GLOB_DAT:
106
        case R_386_JUMP_SLOT:
111
        case R_386_JUMP_SLOT:
107
            printf("fixup R_386_GLOB_DAT/JUMP_SLOT (b+v)\n");
112
//          printf("fixup R_386_GLOB_DAT/JUMP_SLOT (b+v)\n");
108
            *r_ptr = sym_addr;
113
            *r_ptr = sym_addr;
109
            break;
114
            break;
110
 
115
 
111
        case R_386_32:
116
        case R_386_32:
112
            printf("fixup R_386_32 (b+v+a)\n");
117
//          printf("fixup R_386_32 (b+v+a)\n");
113
            *r_ptr += sym_addr;
118
            *r_ptr += sym_addr;
114
            break;
119
            break;
115
           
120
           
116
        case R_386_RELATIVE:
121
        case R_386_RELATIVE:
117
            printf("fixup R_386_RELATIVE (b+a)\n");
122
//          printf("fixup R_386_RELATIVE (b+a)\n");
118
            *r_ptr += m->bias;
123
            *r_ptr += m->bias;
119
            break;
124
            break;
120
        }
125
        }
121
    }
126
    }
122
 
127