mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 17:23:55 +08:00
x86, relocs: When printing an error, say relative or absolute
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>
This commit is contained in:
parent
a3e854d95a
commit
24ab82bd9b
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user