Rev 3663 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3663 | Rev 3681 | ||
---|---|---|---|
Line 142... | Line 142... | ||
142 | uintptr_t r_addend; |
142 | uintptr_t r_addend; |
143 | 143 | ||
144 | elf_symbol_t *sym_table; |
144 | elf_symbol_t *sym_table; |
145 | elf_symbol_t *sym; |
145 | elf_symbol_t *sym; |
146 | uint32_t *r_ptr; |
146 | uint32_t *r_ptr; |
- | 147 | uint16_t *r_ptr16; |
|
147 | char *str_tab; |
148 | char *str_tab; |
148 | 149 | ||
149 | elf_symbol_t *sym_def; |
150 | elf_symbol_t *sym_def; |
150 | module_t *dest; |
151 | module_t *dest; |
151 | 152 | ||
152 | uint32_t *plt; |
153 | uint32_t *plt; |
153 | uint32_t *_plt_table; |
154 | uint32_t *_plt_table; |
154 | uint32_t *_plt_ent; |
155 | uint32_t *_plt_ent; |
155 | uint32_t plt_n; |
156 | uint32_t plt_n; |
156 | uint32_t pidx; |
157 | uint32_t pidx; |
- | 158 | uint32_t t_addr; |
|
- | 159 | uint32_t sym_size; |
|
157 | 160 | ||
158 | plt = m->dyn.plt_got; |
161 | plt = m->dyn.plt_got; |
159 | plt_n = m->dyn.plt_rel_sz / sizeof(elf_rela_t); |
162 | plt_n = m->dyn.plt_rel_sz / sizeof(elf_rela_t); |
160 | _plt_ent = plt+ 18; |
163 | _plt_ent = plt+ 18; |
161 | _plt_table = plt + 18 + plt_n; |
164 | _plt_table = plt + 18 + plt_n; |
Line 182... | Line 185... | ||
182 | sym->st_value, |
185 | sym->st_value, |
183 | sym->st_size); |
186 | sym->st_size); |
184 | 187 | ||
185 | rel_type = ELF32_R_TYPE(r_info); |
188 | rel_type = ELF32_R_TYPE(r_info); |
186 | r_ptr = (uint32_t *)(r_offset + m->bias); |
189 | r_ptr = (uint32_t *)(r_offset + m->bias); |
- | 190 | r_ptr16 = (uint16_t *)(r_offset + m->bias); |
|
187 | 191 | ||
188 | if (sym->st_name != 0) { |
192 | if (sym->st_name != 0) { |
189 | DPRINTF("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset); |
193 | DPRINTF("rel_type: %x, rel_offset: 0x%x\n", rel_type, r_offset); |
190 | sym_def = symbol_def_find(str_tab + sym->st_name, |
194 | sym_def = symbol_def_find(str_tab + sym->st_name, |
191 | m, &dest); |
195 | m, &dest); |
Line 199... | Line 203... | ||
199 | continue; |
203 | continue; |
200 | } |
204 | } |
201 | } |
205 | } |
202 | 206 | ||
203 | switch (rel_type) { |
207 | switch (rel_type) { |
- | 208 | case R_PPC_ADDR16_LO: |
|
- | 209 | DPRINTF("fixup R_PPC_ADDR16_LO (#lo(s+a))\n"); |
|
- | 210 | *r_ptr16 = (sym_addr + r_addend) & 0xffff; |
|
- | 211 | break; |
|
- | 212 | ||
- | 213 | case R_PPC_ADDR16_HI: |
|
- | 214 | DPRINTF("fixup R_PPC_ADDR16_HI (#hi(s+a))\n"); |
|
- | 215 | *r_ptr16 = (sym_addr + r_addend) >> 16; |
|
- | 216 | break; |
|
- | 217 | ||
- | 218 | case R_PPC_ADDR16_HA: |
|
- | 219 | DPRINTF("fixup R_PPC_ADDR16_HA (#ha(s+a))\n"); |
|
- | 220 | t_addr = sym_addr + r_addend; |
|
- | 221 | *r_ptr16 = (t_addr >> 16) + ((t_addr & 0x8000) ? 1 : 0); |
|
- | 222 | break; |
|
- | 223 | ||
204 | case R_PPC_JMP_SLOT: |
224 | case R_PPC_JMP_SLOT: |
205 | DPRINTF("fixup R_PPC_JMP_SLOT (b+v)\n"); |
225 | DPRINTF("fixup R_PPC_JMP_SLOT (b+v)\n"); |
206 | pidx = (r_ptr - _plt_ent) / 2; |
226 | pidx = (r_ptr - _plt_ent) / 2; |
207 | if (pidx >= plt_n) { |
227 | if (pidx >= plt_n) { |
208 | DPRINTF("error: proc index out of range\n"); |
228 | DPRINTF("error: proc index out of range\n"); |
Line 215... | Line 235... | ||
215 | 235 | ||
216 | case R_PPC_ADDR32: |
236 | case R_PPC_ADDR32: |
217 | DPRINTF("fixup R_PPC_ADDR32 (b+v+a)\n"); |
237 | DPRINTF("fixup R_PPC_ADDR32 (b+v+a)\n"); |
218 | *r_ptr = r_addend + sym_addr; |
238 | *r_ptr = r_addend + sym_addr; |
219 | break; |
239 | break; |
- | 240 | ||
- | 241 | case R_PPC_COPY: |
|
- | 242 | /* |
|
- | 243 | * Copy symbol data from shared object to specified |
|
- | 244 | * location. |
|
- | 245 | */ |
|
- | 246 | DPRINTF("fixup R_PPC_COPY (s)\n"); |
|
- | 247 | sym_size = sym->st_size; |
|
- | 248 | if (sym_size != sym_def->st_size) { |
|
- | 249 | printf("warning: mismatched symbol sizes\n"); |
|
- | 250 | /* Take the lower value. */ |
|
- | 251 | if (sym_size > sym_def->st_size) |
|
- | 252 | sym_size = sym_def->st_size; |
|
- | 253 | } |
|
- | 254 | memcpy(r_ptr, (const void *)sym_addr, sym_size); |
|
- | 255 | break; |
|
220 | 256 | ||
221 | case R_PPC_RELATIVE: |
257 | case R_PPC_RELATIVE: |
222 | DPRINTF("fixup R_PPC_RELATIVE (b+a)\n"); |
258 | DPRINTF("fixup R_PPC_RELATIVE (b+a)\n"); |
223 | *r_ptr = r_addend + m->bias; |
259 | *r_ptr = r_addend + m->bias; |
224 | break; |
260 | break; |
Line 227... | Line 263... | ||
227 | *r_ptr = (sym_addr + r_addend - (uint32_t)r_ptr) >> 2; |
263 | *r_ptr = (sym_addr + r_addend - (uint32_t)r_ptr) >> 2; |
228 | DPRINTF("fixup R_PPC_REL24 (s+a-p)>>2\n"); |
264 | DPRINTF("fixup R_PPC_REL24 (s+a-p)>>2\n"); |
229 | /*TODO*/ |
265 | /*TODO*/ |
230 | break; |
266 | break; |
231 | default: |
267 | default: |
232 | printf("unknown relocation type\n"); |
268 | printf("unknown relocation type %d\n", rel_type); |
233 | break; |
269 | break; |
234 | } |
270 | } |
235 | } |
271 | } |
236 | 272 | ||
237 | /* |
273 | /* |