public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* PowerPC64 synthetic symbols
@ 2021-01-20 12:14 Alan Modra
  0 siblings, 0 replies; 2+ messages in thread
From: Alan Modra @ 2021-01-20 12:14 UTC (permalink / raw)
  To: binutils

If an assembler trims off unused section symbols there may be no
section symbols.  This means that testing for the .opd section symbol
needs to test both the section name and symbol flags.

	* elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Don't assume
	section symbols are present.

diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index ed595074b94..f76830b6c42 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -2299,7 +2299,8 @@ 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 (strcmp (syms[i]->section->name, ".opd") == 0)
+      if ((syms[i]->flags & BSF_SECTION_SYM) != 0
+	  && strcmp (syms[i]->section->name, ".opd") == 0)
 	++i;
       codesecsym = i;
 

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 2+ messages in thread

* PowerPC64 synthetic symbols
@ 2018-03-21 11:11 Alan Modra
  0 siblings, 0 replies; 2+ messages in thread
From: Alan Modra @ 2018-03-21 11:11 UTC (permalink / raw)
  To: binutils

Nick pointed out to me in a private email that 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.

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)

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-01-20 12:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-20 12:14 PowerPC64 synthetic symbols Alan Modra
  -- strict thread matches above, loose matches on Subject: below --
2018-03-21 11:11 Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).