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