comparison ticoff/disasm.c @ 120:4d8dfdbd2ea1

tiobjd: auto-translation of section-relative relocs made more conservative
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Fri, 04 Apr 2014 05:45:22 +0000
parents 193926ccd1ec
children d88f2f40e3ae
comparison
equal deleted inserted replaced
119:fb1e47bebe00 120:4d8dfdbd2ea1
17 find_better_symbol(symp, addp) 17 find_better_symbol(symp, addp)
18 struct internal_syment **symp; 18 struct internal_syment **symp;
19 unsigned *addp; 19 unsigned *addp;
20 { 20 {
21 struct internal_scnhdr *sec; 21 struct internal_scnhdr *sec;
22 unsigned addr; 22 unsigned addr, delta;
23 struct internal_syment *sym, *symsel; 23 struct internal_syment *sym;
24 unsigned n; 24 unsigned n;
25 25
26 sec = (*symp)->section; 26 sec = (*symp)->section;
27 addr = *addp; 27 addr = *addp;
28 symsel = 0;
29 for (n = 0; n < sec->nsymbols; n++) { 28 for (n = 0; n < sec->nsymbols; n++) {
30 sym = sec->sorted_symbols[n]; 29 sym = sec->sorted_symbols[n];
31 if (sym->value > addr) 30 if (sym->value > addr)
32 break; 31 return;
33 if (sym->class == C_EXT || sym->class == C_STAT) 32 if (sym->class != C_EXT && sym->class != C_STAT)
34 symsel = sym; 33 continue;
35 } 34 delta = addr - sym->value;
36 if (symsel) { 35 if (sym->name[0] == '_' && !delta ||
37 *symp = symsel; 36 sym->name[0] == '$' && delta <= 1) {
38 *addp = addr - symsel->value; 37 *symp = sym;
38 *addp = delta;
39 }
39 } 40 }
40 } 41 }
41 42
42 void 43 void
43 disasm_reloc_target(sec, rel, addend) 44 disasm_reloc_target(sec, rel, addend)