From 0ccf57bd817a73e7d7cef714039f1302fa5298ec Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 21 Mar 2018 13:22:26 +1030 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 +++++ bfd/elf64-ppc.c | 24 +++++++++++++++--------- 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,3 +1,8 @@ +2018-03-21 Alan Modra + + * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Trim uninteresting + symbols. Use size_t counts. Delete redundant opd test. + 2018-03-21 Alan Modra * elf32-ppc.c (ppc_elf_tls_optimize): Delete locsyms. 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) -- 2.30.2