git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
x86, relocs: When printing an error, say relative or absolute
[pandora-kernel.git]
/
arch
/
x86
/
tools
/
relocs.c
diff --git
a/arch/x86/tools/relocs.c
b/arch/x86/tools/relocs.c
index
2071bad
..
c075507
100644
(file)
--- a/
arch/x86/tools/relocs.c
+++ b/
arch/x86/tools/relocs.c
@@
-55,7
+55,11
@@
static const char * const sym_regex_kernel[S_NSYMTYPES] = {
* as absolute (typically defined outside any section in the linker script.)
*/
[S_REL] =
* as absolute (typically defined outside any section in the linker script.)
*/
[S_REL] =
- "^_end$",
+ "^(__init_(begin|end)|"
+ "__x86_cpu_dev_(start|end)|"
+ "(__parainstructions|__alt_instructions)(|_end)|"
+ "(__iommu_table|__apicdrivers|__smp_locks)(|_end)|"
+ "_end)$"
};
};
@@
-558,10
+562,14
@@
static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
Elf32_Sym *sym;
unsigned r_type;
const char *symname;
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);
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:
switch (r_type) {
case R_386_NONE:
case R_386_PC32:
@@
-577,7
+585,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;
symname = sym_name(sym_strtab, sym);
if (!use_real_mode)
goto bad;
- if (s
ym->st_shndx == SHN_ABS
) {
+ if (s
hn_abs
) {
if (is_reloc(S_ABS, symname))
break;
else if (!is_reloc(S_SEG, symname))
if (is_reloc(S_ABS, symname))
break;
else if (!is_reloc(S_SEG, symname))
@@
-593,7
+601,7
@@
static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
case R_386_32:
symname = sym_name(sym_strtab, sym);
case R_386_32:
symname = sym_name(sym_strtab, sym);
- if (s
ym->st_shndx == SHN_ABS
) {
+ if (s
hn_abs
) {
if (is_reloc(S_ABS, symname))
break;
else if (!is_reloc(S_REL, symname))
if (is_reloc(S_ABS, symname))
break;
else if (!is_reloc(S_REL, symname))
@@
-611,7
+619,8
@@
static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym),
break;
bad:
symname = sym_name(sym_strtab, 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);
}
}
rel_type(r_type), symname);
}
}