3.2-stable review patch.  If anyone has any objections, please let me know.

------------------

From: "H. Peter Anvin" <h...@linux.intel.com>

commit 24ab82bd9bf18f3efc69a131d73577940941e1b7 upstream.

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 <h...@zytor.com>
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 arch/x86/tools/relocs.c |   11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
index c3cfbb2..b43cfcd 100644
--- a/arch/x86/tools/relocs.c
+++ b/arch/x86/tools/relocs.c
@@ -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);
                        }
                }


--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to