diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 30 | ||||
-rw-r--r-- | ld/emultempl/hppaelf.em | 1 | ||||
-rw-r--r-- | ld/emultempl/ppc64elf.em | 1 | ||||
-rw-r--r-- | ld/ldlang.c | 46 |
5 files changed, 31 insertions, 56 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 864a524..6143817 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,12 @@ +2005-07-08 Alan Modra <amodra@bigpond.net.au> + + * ldlang.c (wild_sort): Formatting. + (strip_excluded_output_sections): Strip zero size sections here. + * emultempl/elf32.em (gld*_strip_empty_sections): Delete. + (gld*_finish): Don't call the above. + * emultempl/hppaelf.em (hppaelf_finish): Likewise. + * emultempl/ppc64elf.em (ppc_finish): Likewise. + 2005-07-05 Paul Brook <paul@codesourcery.com> * Makefile.am (ALL_EMULATIONS): Add eelf32ppcvxworks.o. diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 9248c30..da7af0b 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -61,7 +61,6 @@ static void gld${EMULATION_NAME}_before_allocation (void); static bfd_boolean gld${EMULATION_NAME}_place_orphan (lang_input_statement_type *file, asection *s); static void gld${EMULATION_NAME}_layout_sections_again (void); -static void gld${EMULATION_NAME}_strip_empty_sections (void); static void gld${EMULATION_NAME}_provide_init_fini_syms (void); static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED; @@ -1507,40 +1506,11 @@ gld${EMULATION_NAME}_layout_sections_again (void) } static void -gld${EMULATION_NAME}_strip_empty_sections (void) -{ - if (!link_info.relocatable) - { - lang_output_section_statement_type *os; - - for (os = &lang_output_section_statement.head->output_section_statement; - os != NULL; - os = os->next) - { - asection *s; - - if (os == abs_output_section || os->constraint == -1) - continue; - s = os->bfd_section; - if (s != NULL - && s->size == 0 - && (s->flags & SEC_KEEP) == 0 - && !bfd_section_removed_from_list (output_bfd, s)) - { - bfd_section_list_remove (output_bfd, s); - output_bfd->section_count--; - } - } - } -} - -static void gld${EMULATION_NAME}_finish (void) { if (bfd_elf_discard_info (output_bfd, &link_info)) gld${EMULATION_NAME}_layout_sections_again (); - gld${EMULATION_NAME}_strip_empty_sections (); gld${EMULATION_NAME}_provide_init_fini_syms (); } EOF diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em index 5e91fb6..96a98ed 100644 --- a/ld/emultempl/hppaelf.em +++ b/ld/emultempl/hppaelf.em @@ -305,7 +305,6 @@ hppaelf_finish (void) } } - gld${EMULATION_NAME}_strip_empty_sections (); gld${EMULATION_NAME}_provide_init_fini_syms (); } diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index 6eea93d..483d381 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -379,7 +379,6 @@ ppc_finish (void) } ppc64_elf_restore_symbols (&link_info); - gld${EMULATION_NAME}_strip_empty_sections (); gld${EMULATION_NAME}_provide_init_fini_syms (); } diff --git a/ld/ldlang.c b/ld/ldlang.c index 4f9569f..ce178f1 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -1960,11 +1960,8 @@ wild_sort (lang_wild_statement_type *wild, looking at the sections for this file. */ if (sec != NULL && sec->spec.sorted != none) - { - if (compare_section (sec->spec.sorted, section, - ls->section) < 0) - break; - } + if (compare_section (sec->spec.sorted, section, ls->section) < 0) + break; } return l; @@ -3086,39 +3083,40 @@ strip_excluded_output_sections (void) if (output_section == NULL) continue; - exclude = TRUE; - if (output_section->map_head.s != NULL) + exclude = (output_section->rawsize == 0 + && (output_section->flags & SEC_KEEP) == 0 + && !bfd_section_removed_from_list (output_bfd, + output_section)); + + /* Some sections have not yet been sized, notably .gnu.version, + .dynsym, .dynstr and .hash. These all have SEC_LINKER_CREATED + input sections, so don't drop output sections that have such + input sections unless they are also marked SEC_EXCLUDE. */ + if (exclude && output_section->map_head.s != NULL) { asection *s; - for (s = output_section->map_head.s; s != NULL; - s = s->map_head.s) - if ((s->flags & SEC_EXCLUDE) == 0) + for (s = output_section->map_head.s; s != NULL; s = s->map_head.s) + if ((s->flags & SEC_LINKER_CREATED) != 0 + && (s->flags & SEC_EXCLUDE) == 0) { exclude = FALSE; break; } - - output_section->map_head.link_order = NULL; - output_section->map_tail.link_order = NULL; } - if (exclude - && (output_section->flags & SEC_KEEP) == 0 - && output_section->rawsize == 0 - && !bfd_is_abs_section (output_section)) + /* TODO: Don't just junk map_head.s, turn them into link_orders. */ + output_section->map_head.link_order = NULL; + output_section->map_tail.link_order = NULL; + + if (exclude) { /* We don't set bfd_section to NULL since bfd_section of the removed output section statement may still be used. */ os->ignored = TRUE; output_section->flags |= SEC_EXCLUDE; - - if (!bfd_section_removed_from_list (output_bfd, - output_section)) - { - bfd_section_list_remove (output_bfd, output_section); - output_bfd->section_count--; - } + bfd_section_list_remove (output_bfd, output_section); + output_bfd->section_count--; } } |