summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-03-21 13:22:26 +1030
committerAlan Modra <amodra@gmail.com>2018-03-21 21:44:01 +1030
commit0ccf57bd817a73e7d7cef714039f1302fa5298ec (patch)
tree3196eb23ccccda366c4b57a39d17d1fbe9c0c750
parent4bad6366a74c9cdf92e6aef3849c29771c77af36 (diff)
downloadbinutils-gdb-0ccf57bd817a73e7d7cef714039f1302fa5298ec.tar.gz
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.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c24
2 files changed, 20 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9885d2dea59..7534b192f69 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,10 @@
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.
2018-03-21 Alan Modra <amodra@gmail.com>
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 48eeb55bbf6..751ad778b26 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -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)