* elf-bfd.h (struct sym_sec_cache): Delete "sec". Add "shndx".

* elf.c (bfd_section_from_r_symndx): Don't cache bfd section of
	symbol.  Instead cache ELF section index.  Remove redundant
	checks of st_shndx.
This commit is contained in:
Alan Modra 2007-07-18 11:23:37 +00:00
parent 816efef9d2
commit a5d1b3b53e
3 changed files with 33 additions and 27 deletions

View file

@ -1,3 +1,10 @@
2007-07-18 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (struct sym_sec_cache): Delete "sec". Add "shndx".
* elf.c (bfd_section_from_r_symndx): Don't cache bfd section of
symbol. Instead cache ELF section index. Remove redundant
checks of st_shndx.
2007-07-15 Mike Frysinger <vapier@gentoo.org>
* trad-core.c (NBPG): If not defined, set to getpagesize().

View file

@ -423,7 +423,7 @@ struct sym_sec_cache
{
bfd *abfd;
unsigned long indx[LOCAL_SYM_CACHE_SIZE];
asection *sec[LOCAL_SYM_CACHE_SIZE];
unsigned int shndx[LOCAL_SYM_CACHE_SIZE];
};
/* Constant information held for an ELF backend. */

View file

@ -2273,36 +2273,35 @@ bfd_section_from_r_symndx (bfd *abfd,
asection *sec,
unsigned long r_symndx)
{
Elf_Internal_Shdr *symtab_hdr;
unsigned char esym[sizeof (Elf64_External_Sym)];
Elf_External_Sym_Shndx eshndx;
Elf_Internal_Sym isym;
unsigned int ent = r_symndx % LOCAL_SYM_CACHE_SIZE;
asection *s;
if (cache->abfd == abfd && cache->indx[ent] == r_symndx)
return cache->sec[ent];
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
&isym, esym, &eshndx) == NULL)
return NULL;
if (cache->abfd != abfd)
if (cache->abfd != abfd || cache->indx[ent] != r_symndx)
{
memset (cache->indx, -1, sizeof (cache->indx));
cache->abfd = abfd;
Elf_Internal_Shdr *symtab_hdr;
unsigned char esym[sizeof (Elf64_External_Sym)];
Elf_External_Sym_Shndx eshndx;
Elf_Internal_Sym isym;
symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
if (bfd_elf_get_elf_syms (abfd, symtab_hdr, 1, r_symndx,
&isym, esym, &eshndx) == NULL)
return NULL;
if (cache->abfd != abfd)
{
memset (cache->indx, -1, sizeof (cache->indx));
cache->abfd = abfd;
}
cache->indx[ent] = r_symndx;
cache->shndx[ent] = isym.st_shndx;
}
cache->indx[ent] = r_symndx;
cache->sec[ent] = sec;
if ((isym.st_shndx != SHN_UNDEF && isym.st_shndx < SHN_LORESERVE)
|| isym.st_shndx > SHN_HIRESERVE)
{
asection *s;
s = bfd_section_from_elf_index (abfd, isym.st_shndx);
if (s != NULL)
cache->sec[ent] = s;
}
return cache->sec[ent];
s = bfd_section_from_elf_index (abfd, cache->shndx[ent]);
if (s != NULL)
return s;
return sec;
}
/* Given an ELF section number, retrieve the corresponding BFD