FreeCalypso > hg > freecalypso-reveng
diff ticoff/disasm.c @ 121:d88f2f40e3ae
tiobjd: handling of symbol-less relocs
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Fri, 04 Apr 2014 07:19:15 +0000 |
parents | 4d8dfdbd2ea1 |
children | 5f9cc99930a8 |
line wrap: on
line diff
--- a/ticoff/disasm.c Fri Apr 04 05:45:22 2014 +0000 +++ b/ticoff/disasm.c Fri Apr 04 07:19:15 2014 +0000 @@ -14,16 +14,15 @@ extern unsigned get_u16(), get_u32(); static void -find_better_symbol(symp, addp) +find_better_symbol(sec, symp, addp) + struct internal_scnhdr *sec; struct internal_syment **symp; unsigned *addp; { - struct internal_scnhdr *sec; unsigned addr, delta; struct internal_syment *sym; unsigned n; - sec = (*symp)->section; addr = *addp; for (n = 0; n < sec->nsymbols; n++) { sym = sec->sorted_symbols[n]; @@ -48,15 +47,18 @@ { struct internal_syment *sym = rel->sym; - addend -= sym->value; - if (sym->section && !strcmp(sym->name, sym->section->name)) - find_better_symbol(&sym, &addend); + if (sym) + addend -= sym->value; + if (!sym || sym->section && !strcmp(sym->name, sym->section->name)) + find_better_symbol(sym ? sym->section : sec, &sym, &addend); + if (sym) + fputs(sym->name, stdout); + else + fputs(sec->name, stdout); if (addend >= 10) - printf("%s+0x%x", sym->name, addend); + printf("+0x%x", addend); else if (addend) - printf("%s+%u", sym->name, addend); - else - fputs(sym->name, stdout); + printf("+%u", addend); } void