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 |