aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/emultempl/elf32.em30
-rw-r--r--ld/emultempl/hppaelf.em1
-rw-r--r--ld/emultempl/ppc64elf.em1
-rw-r--r--ld/ldlang.c46
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--;
}
}