diff options
author | Alan Modra <amodra@gmail.com> | 2018-03-21 13:22:26 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-03-21 21:44:01 +1030 |
commit | 0ccf57bd817a73e7d7cef714039f1302fa5298ec (patch) | |
tree | 3196eb23ccccda366c4b57a39d17d1fbe9c0c750 /bfd | |
parent | 4bad6366a74c9cdf92e6aef3849c29771c77af36 (diff) | |
download | gdb-0ccf57bd817a73e7d7cef714039f1302fa5298ec.zip gdb-0ccf57bd817a73e7d7cef714039f1302fa5298ec.tar.gz gdb-0ccf57bd817a73e7d7cef714039f1302fa5298ec.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 24 |
2 files changed, 20 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 9885d2d..7534b19 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 48eeb55..751ad77 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) |