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');