* elf.c (ignore_section_sym): Correct comment. Don't return
authorAlan Modra <amodra@gmail.com>
Thu, 17 May 2012 06:29:02 +0000 (06:29 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 17 May 2012 06:29:02 +0000 (06:29 +0000)
true for absolute section.
(elf_map_symbols): Move stray comment.  Adjust for above change.
Don't discard global section symbols.

bfd/ChangeLog
bfd/elf.c

index f9262d2339ca251356168b3b2853cd0beb30c3ca..46979ceda47b7471c641d9d92c798e4eb0432831 100644 (file)
@@ -1,3 +1,11 @@
+2012-05-17  Maciej W. Rozycki  <macro@linux-mips.org>
+           Alan Modra  <amodra@gmail.com>
+
+       * elf.c (ignore_section_sym): Correct comment.  Don't return
+       true for absolute section.
+       (elf_map_symbols): Move stray comment.  Adjust for above change.
+       Don't discard global section symbols.
+
 2012-05-17  Alan Modra  <amodra@gmail.com>
 
        * elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Don't make _DYNAMIC,
index 7acf1422e5d0f47d92561f424046db98a6d6f2b8..c5b04ac2b8450835ea14fd5af16ac82a21120ad3 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3243,9 +3243,6 @@ assign_section_numbers (bfd *abfd, struct bfd_link_info *link_info)
   return TRUE;
 }
 
-/* Map symbol from it's internal number to the external number, moving
-   all local symbols to be at the head of the list.  */
-
 static bfd_boolean
 sym_is_global (bfd *abfd, asymbol *sym)
 {
@@ -3260,7 +3257,7 @@ sym_is_global (bfd *abfd, asymbol *sym)
 }
 
 /* Don't output section symbols for sections that are not going to be
-   output.  */
+   output, or that are duplicates.  */
 
 static bfd_boolean
 ignore_section_sym (bfd *abfd, asymbol *sym)
@@ -3268,9 +3265,13 @@ ignore_section_sym (bfd *abfd, asymbol *sym)
   return ((sym->flags & BSF_SECTION_SYM) != 0
          && !(sym->section->owner == abfd
               || (sym->section->output_section->owner == abfd
-                  && sym->section->output_offset == 0)));
+                  && sym->section->output_offset == 0)
+              || bfd_is_abs_section (sym->section)));
 }
 
+/* Map symbol from it's internal number to the external number, moving
+   all local symbols to be at the head of the list.  */
+
 static bfd_boolean
 elf_map_symbols (bfd *abfd)
 {
@@ -3312,7 +3313,8 @@ elf_map_symbols (bfd *abfd)
 
       if ((sym->flags & BSF_SECTION_SYM) != 0
          && sym->value == 0
-         && !ignore_section_sym (abfd, sym))
+         && !ignore_section_sym (abfd, sym)
+         && !bfd_is_abs_section (sym->section))
        {
          asection *sec = sym->section;
 
@@ -3326,12 +3328,10 @@ elf_map_symbols (bfd *abfd)
   /* Classify all of the symbols.  */
   for (idx = 0; idx < symcount; idx++)
     {
-      if (ignore_section_sym (abfd, syms[idx]))
-       continue;
-      if (!sym_is_global (abfd, syms[idx]))
-       num_locals++;
-      else
+      if (sym_is_global (abfd, syms[idx]))
        num_globals++;
+      else if (!ignore_section_sym (abfd, syms[idx]))
+       num_locals++;
     }
 
   /* We will be adding a section symbol for each normal BFD section.  Most
@@ -3361,12 +3361,12 @@ elf_map_symbols (bfd *abfd)
       asymbol *sym = syms[idx];
       unsigned int i;
 
-      if (ignore_section_sym (abfd, sym))
-       continue;
-      if (!sym_is_global (abfd, sym))
+      if (sym_is_global (abfd, sym))
+       i = num_locals + num_globals2++;
+      else if (!ignore_section_sym (abfd, sym))
        i = num_locals2++;
       else
-       i = num_locals + num_globals2++;
+       continue;
       new_syms[i] = sym;
       sym->udata.i = i + 1;
     }