FreeCalypso > hg > freecalypso-reveng
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) |
