From 2633a79cc03a96463eb9d51ad01d7d3216567830 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 17 May 2012 06:29:02 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 8 ++++++++ bfd/elf.c | 30 +++++++++++++++--------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f9262d2..46979ce 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2012-05-17 Maciej W. Rozycki + Alan Modra + + * 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 * elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Don't make _DYNAMIC, diff --git a/bfd/elf.c b/bfd/elf.c index 7acf142..c5b04ac 100644 --- 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; } -- 2.7.4