aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog13
-rw-r--r--bfd/elflink.c77
2 files changed, 51 insertions, 39 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index bc71060..4276dd8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-26 Alan Modra <amodra@bigpond.net.au>
+
+ * elflink.c (elf_gc_sweep): Move gcc_except_table code..
+ (bfd_elf_gc_sections): ..to here.
+
2005-07-25 DJ Delorie <dj@redhat.com>
* reloc.c: Remove unused M32C relocs, add BFD_RELOC_M32C_HI8.
@@ -114,10 +119,10 @@
2005-07-18 Nick Clifton <nickc@redhat.com>
* config.bfd: Move m32c entry to correct location.
- * archures.c: Likewise.
- * configure.in: Likewise.
- * configure: Regenerate.
- * targets.c: Move ms1 vector to correct location.
+ * archures.c: Likewise.
+ * configure.in: Likewise.
+ * configure: Regenerate.
+ * targets.c: Move ms1 vector to correct location.
2005-07-18 Jan Beulich <jbeulich@novell.com>
diff --git a/bfd/elflink.c b/bfd/elflink.c
index f52d307..067ac3b 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -8912,41 +8912,6 @@ elf_gc_sweep (struct bfd_link_info *info, gc_sweep_hook_fn gc_sweep_hook)
if (o->gc_mark)
continue;
- /* Keep .gcc_except_table.* if the associated .text.* is
- marked. This isn't very nice, but the proper solution,
- splitting .eh_frame up and using comdat doesn't pan out
- easily due to needing special relocs to handle the
- difference of two symbols in separate sections.
- Don't keep code sections referenced by .eh_frame. */
- if (o->gc_mark_from_eh && (o->flags & SEC_CODE) == 0)
- {
- if (strncmp (o->name, ".gcc_except_table.", 18) == 0)
- {
- unsigned long len;
- char *fn_name;
- asection *fn_text;
-
- len = strlen (o->name + 18) + 1;
- fn_name = bfd_malloc (len + 6);
- if (fn_name == NULL)
- return FALSE;
- memcpy (fn_name, ".text.", 6);
- memcpy (fn_name + 6, o->name + 18, len);
- fn_text = bfd_get_section_by_name (sub, fn_name);
- free (fn_name);
- if (fn_text != NULL && fn_text->gc_mark)
- o->gc_mark = 1;
- }
-
- /* If not using specially named exception table section,
- then keep whatever we are using. */
- else
- o->gc_mark = 1;
-
- if (o->gc_mark)
- continue;
- }
-
/* Skip sweeping sections already excluded. */
if (o->flags & SEC_EXCLUDE)
continue;
@@ -9183,6 +9148,48 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
return FALSE;
}
+ /* ... again for sections marked from eh_frame. */
+ for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
+ {
+ asection *o;
+
+ if (bfd_get_flavour (sub) != bfd_target_elf_flavour)
+ continue;
+
+ /* Keep .gcc_except_table.* if the associated .text.* is
+ marked. This isn't very nice, but the proper solution,
+ splitting .eh_frame up and using comdat doesn't pan out
+ easily due to needing special relocs to handle the
+ difference of two symbols in separate sections.
+ Don't keep code sections referenced by .eh_frame. */
+ for (o = sub->sections; o != NULL; o = o->next)
+ if (!o->gc_mark && o->gc_mark_from_eh && (o->flags & SEC_CODE) == 0)
+ {
+ if (strncmp (o->name, ".gcc_except_table.", 18) == 0)
+ {
+ unsigned long len;
+ char *fn_name;
+ asection *fn_text;
+
+ len = strlen (o->name + 18) + 1;
+ fn_name = bfd_malloc (len + 6);
+ if (fn_name == NULL)
+ return FALSE;
+ memcpy (fn_name, ".text.", 6);
+ memcpy (fn_name + 6, o->name + 18, len);
+ fn_text = bfd_get_section_by_name (sub, fn_name);
+ free (fn_name);
+ if (fn_text == NULL || !fn_text->gc_mark)
+ continue;
+ }
+
+ /* If not using specially named exception table section,
+ then keep whatever we are using. */
+ if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
+ return FALSE;
+ }
+ }
+
/* ... and mark SEC_EXCLUDE for those that go. */
if (!elf_gc_sweep (info, get_elf_backend_data (abfd)->gc_sweep_hook))
return FALSE;