FreeCalypso > hg > freecalypso-reveng
comparison ticoff/disasm.c @ 118:193926ccd1ec
tiobjd: better handling of section-relative relocs
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Thu, 03 Apr 2014 07:47:03 +0000 |
parents | f9fde7f36ae3 |
children | 4d8dfdbd2ea1 |
comparison
equal
deleted
inserted
replaced
117:f9fde7f36ae3 | 118:193926ccd1ec |
---|---|
11 #include "coffconst.h" | 11 #include "coffconst.h" |
12 #include "globals.h" | 12 #include "globals.h" |
13 | 13 |
14 extern unsigned get_u16(), get_u32(); | 14 extern unsigned get_u16(), get_u32(); |
15 | 15 |
16 static void | |
17 find_better_symbol(symp, addp) | |
18 struct internal_syment **symp; | |
19 unsigned *addp; | |
20 { | |
21 struct internal_scnhdr *sec; | |
22 unsigned addr; | |
23 struct internal_syment *sym, *symsel; | |
24 unsigned n; | |
25 | |
26 sec = (*symp)->section; | |
27 addr = *addp; | |
28 symsel = 0; | |
29 for (n = 0; n < sec->nsymbols; n++) { | |
30 sym = sec->sorted_symbols[n]; | |
31 if (sym->value > addr) | |
32 break; | |
33 if (sym->class == C_EXT || sym->class == C_STAT) | |
34 symsel = sym; | |
35 } | |
36 if (symsel) { | |
37 *symp = symsel; | |
38 *addp = addr - symsel->value; | |
39 } | |
40 } | |
41 | |
16 void | 42 void |
17 disasm_reloc_target(sec, rel, addend) | 43 disasm_reloc_target(sec, rel, addend) |
18 struct internal_scnhdr *sec; | 44 struct internal_scnhdr *sec; |
19 struct internal_reloc *rel; | 45 struct internal_reloc *rel; |
20 unsigned addend; | 46 unsigned addend; |
21 { | 47 { |
22 struct internal_syment *sym = rel->sym; | 48 struct internal_syment *sym = rel->sym; |
23 | 49 |
24 addend -= sym->value; | 50 addend -= sym->value; |
51 if (sym->section && !strcmp(sym->name, sym->section->name)) | |
52 find_better_symbol(&sym, &addend); | |
25 if (addend >= 10) | 53 if (addend >= 10) |
26 printf("%s+0x%x", sym->name, addend); | 54 printf("%s+0x%x", sym->name, addend); |
27 else if (addend) | 55 else if (addend) |
28 printf("%s+%u", sym->name, addend); | 56 printf("%s+%u", sym->name, addend); |
29 else | 57 else |
183 dump_filehdr_info(); | 211 dump_filehdr_info(); |
184 putchar('\n'); | 212 putchar('\n'); |
185 get_int_section_table(); | 213 get_int_section_table(); |
186 get_int_symbol_table(); | 214 get_int_symbol_table(); |
187 extern_profile_report("Module"); | 215 extern_profile_report("Module"); |
216 sort_symbols_of_all_sec(); | |
188 for (secnum = 0; secnum < nsections; secnum++) { | 217 for (secnum = 0; secnum < nsections; secnum++) { |
189 sec = sections + secnum; | 218 sec = sections + secnum; |
190 printf("=== %s ===\n", sec->name); | 219 printf("=== %s ===\n", sec->name); |
191 disasm_sectype_by_name(sec); | 220 disasm_sectype_by_name(sec); |
192 putchar('\n'); | 221 putchar('\n'); |