PowerPC64 synthetic symbols
STT_FILE and a bunch of other symbol types aren't proper symbols to mark the start of a function's code. * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Trim uninteresting symbols. Use size_t counts. Delete redundant opd test.
This commit is contained in:
parent
4bad6366a7
commit
0ccf57bd81
2 changed files with 20 additions and 9 deletions
|
@ -1,3 +1,8 @@
|
|||
2018-03-21 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Trim uninteresting
|
||||
symbols. Use size_t counts. Delete redundant opd test.
|
||||
|
||||
2018-03-21 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf32-ppc.c (ppc_elf_tls_optimize): Delete locsyms.
|
||||
|
|
|
@ -3269,10 +3269,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
asymbol **ret)
|
||||
{
|
||||
asymbol *s;
|
||||
long i;
|
||||
long count;
|
||||
size_t i, j, count;
|
||||
char *names;
|
||||
long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
|
||||
size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
|
||||
asection *opd = NULL;
|
||||
bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
|
||||
asymbol **syms;
|
||||
|
@ -3317,13 +3316,20 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
else
|
||||
memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
|
||||
|
||||
/* Trim uninteresting symbols. Interesting symbols are section,
|
||||
function, and notype symbols. */
|
||||
for (i = 0, j = 0; i < symcount; ++i)
|
||||
if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
|
||||
| BSF_RELC | BSF_SRELC)) == 0)
|
||||
syms[j++] = syms[i];
|
||||
symcount = j;
|
||||
|
||||
synthetic_relocatable = relocatable;
|
||||
synthetic_opd = opd;
|
||||
qsort (syms, symcount, sizeof (*syms), compare_symbols);
|
||||
|
||||
if (!relocatable && symcount > 1)
|
||||
{
|
||||
long j;
|
||||
/* Trim duplicate syms, since we may have merged the normal and
|
||||
dynamic symbols. Actually, we only care about syms that have
|
||||
different values, so trim any with the same value. */
|
||||
|
@ -3339,7 +3345,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
sym->section directly. With separate debug info files, the
|
||||
symbols will be extracted from the debug file while abfd passed
|
||||
to this function is the real binary. */
|
||||
if (opd != NULL && strcmp (syms[i]->section->name, ".opd") == 0)
|
||||
if (strcmp (syms[i]->section->name, ".opd") == 0)
|
||||
++i;
|
||||
codesecsym = i;
|
||||
|
||||
|
@ -3374,7 +3380,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
|
||||
arelent *r;
|
||||
size_t size;
|
||||
long relcount;
|
||||
size_t relcount;
|
||||
|
||||
if (opdsymend == secsymend)
|
||||
goto done;
|
||||
|
@ -3473,7 +3479,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
|
||||
bfd_byte *contents = NULL;
|
||||
size_t size;
|
||||
long plt_count = 0;
|
||||
size_t plt_count = 0;
|
||||
bfd_vma glink_vma = 0, resolv_vma = 0;
|
||||
asection *dynamic, *glink = NULL, *relplt = NULL;
|
||||
arelent *p;
|
||||
|
@ -3610,7 +3616,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
ent = bfd_get_64 (abfd, contents + syms[i]->value);
|
||||
if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
|
||||
{
|
||||
long lo, hi;
|
||||
size_t lo, hi;
|
||||
size_t len;
|
||||
asection *sec = abfd->sections;
|
||||
|
||||
|
@ -3619,7 +3625,7 @@ ppc64_elf_get_synthetic_symtab (bfd *abfd,
|
|||
hi = codesecsymend;
|
||||
while (lo < hi)
|
||||
{
|
||||
long mid = (lo + hi) >> 1;
|
||||
size_t mid = (lo + hi) >> 1;
|
||||
if (syms[mid]->section->vma < ent)
|
||||
lo = mid + 1;
|
||||
else if (syms[mid]->section->vma > ent)
|
||||
|
|
Loading…
Add table
Reference in a new issue