|
@@ -192,15 +192,20 @@ static unsigned int get_symindex(Elf_Sym const *sym, Elf32_Word const *symtab,
|
|
|
Elf32_Word const *symtab_shndx)
|
|
|
{
|
|
|
unsigned long offset;
|
|
|
+ unsigned short shndx = w2(sym->st_shndx);
|
|
|
int index;
|
|
|
|
|
|
- if (sym->st_shndx != SHN_XINDEX)
|
|
|
- return w2(sym->st_shndx);
|
|
|
+ if (shndx > SHN_UNDEF && shndx < SHN_LORESERVE)
|
|
|
+ return shndx;
|
|
|
|
|
|
- offset = (unsigned long)sym - (unsigned long)symtab;
|
|
|
- index = offset / sizeof(*sym);
|
|
|
+ if (shndx == SHN_XINDEX) {
|
|
|
+ offset = (unsigned long)sym - (unsigned long)symtab;
|
|
|
+ index = offset / sizeof(*sym);
|
|
|
|
|
|
- return w(symtab_shndx[index]);
|
|
|
+ return w(symtab_shndx[index]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static unsigned int get_shnum(Elf_Ehdr const *ehdr, Elf_Shdr const *shdr0)
|