x86, relocs: When printing an error, say relative or absolute
authorH. Peter Anvin <hpa@linux.intel.com>
Fri, 18 May 2012 16:52:01 +0000 (09:52 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Sat, 19 May 2012 02:50:02 +0000 (19:50 -0700)
When the relocs tool throws an error, let the error message say if it
is an absolute or relative symbol.  This should make it a lot more
clear what action the programmer needs to take and should help us find
the reason if additional symbol bugs show up.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: <stable@vger.kernel.org>

arch/x86/tools/relocs.c

index c3cfbb2..b43cfcd 100644 (file)
@@ -563,10 +563,14 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
                        Elf32_Sym *sym;
                        unsigned r_type;
                        const char *symname;
+                       int shn_abs;
+
                        rel = &sec->reltab[j];
                        sym = &sh_symtab[ELF32_R_SYM(rel->r_info)];
                        r_type = ELF32_R_TYPE(rel->r_info);
 
+                       shn_abs = sym->st_shndx == SHN_ABS;
+
                        switch (r_type) {
                        case R_386_NONE:
                        case R_386_PC32:
@@ -582,7 +586,7 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
                                symname = sym_name(sym_strtab, sym);
                                if (!use_real_mode)
                                        goto bad;
-                               if (sym->st_shndx == SHN_ABS) {
+                               if (shn_abs) {
                                        if (is_reloc(S_ABS, symname))
                                                break;
                                        else if (!is_reloc(S_SEG, symname))
@@ -598,7 +602,7 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
 
                        case R_386_32:
                                symname = sym_name(sym_strtab, sym);
-                               if (sym->st_shndx == SHN_ABS) {
+                               if (shn_abs) {
                                        if (is_reloc(S_ABS, symname))
                                                break;
                                        else if (!is_reloc(S_REL, symname))
@@ -616,7 +620,8 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
                                break;
                        bad:
                                symname = sym_name(sym_strtab, sym);
-                               die("Invalid %s relocation: %s\n",
+                               die("Invalid %s %s relocation: %s\n",
+                                   shn_abs ? "absolute" : "relative",
                                    rel_type(r_type), symname);
                        }
                }