summaryrefslogtreecommitdiff
path: root/bfd/elflink.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2005-03-16 21:52:48 +0000
committerH.J. Lu <hjl.tools@gmail.com>2005-03-16 21:52:48 +0000
commit57316bff0a1aebca7c9f92d125e5366014f0bb1a (patch)
tree4a49b5bee243f75a41d85143644c1e99f1ef271b /bfd/elflink.c
parent199fea98c99205f0fd3d2d3fd1a2670bdfe8a326 (diff)
downloadbinutils-gdb-57316bff0a1aebca7c9f92d125e5366014f0bb1a.tar.gz
bfd/
2005-03-16 H.J. Lu <hongjiu.lu@intel.com> * elflink.c (elf_mark_used_section): New. (bfd_elf_gc_sections): Call elf_gc_mark_section for non-relocatable link if we don't do GC. include/ 2005-03-16 H.J. Lu <hongjiu.lu@intel.com> * bfdlink.h (bfd_link_info): Add gc_sections. ld/ 2005-03-16 H.J. Lu <hongjiu.lu@intel.com> * emultempl/elf32.em (gld${EMULATION_NAME}_finish): Remove unused empty output sections for non-relocatable link. * ld.h (args_type): Remove gc_sections. * ldlang.c (lang_mark_used_section): New. (lang_gc_sections): Use link_info.gc_sections instead of command_line.gc_sections. * ldmain.c (main): Likewise. * lexsup.c (parse_args): Likewise. * ldlang.c (lang_process): Call lang_mark_used_section. * ldmain.c (main): Initialize link_info.gc_sections to FALSE. ld/testsuite/ 2005-03-16 H.J. Lu <hongjiu.lu@intel.com> * ld-alpha/tlsbin.rd: Updated for empty section removal. * ld-alpha/tlsbinr.rd: Likewise. * ld-alpha/tlspic.rd: Likewise. * ld-arm/mixed-lib.sym: Likewise. * ld-i386/tlsbin.rd: Likewise. * ld-i386/tlsnopic.rd: Likewise. * ld-i386/tlspic.rd: Likewise. * ld-ia64/tlsbin.rd: Likewise. * ld-ia64/tlspic.rd: Likewise. * ld-powerpc/apuinfo.rd: Likewise. * ld-powerpc/powerpc.exp: Likewise. * ld-powerpc/tlsexe32.r: Likewise. * ld-s390/tlsbin.rd: Likewise. * ld-s390/tlsbin_64.rd: Likewise. * ld-s390/tlspic.rd: Likewise. * ld-s390/tlspic_64.rd: Likewise. * ld-sh/tlsbin-2.d: Likewise. * ld-sh/tlspic-2.d: Likewise. * ld-sparc/tlssunbin32.rd: Likewise. * ld-sparc/tlssunnopic32.rd: Likewise. * ld-sparc/tlssunpic32.rd: Likewise. * ld-x86-64/tlsbin.rd: Likewise. * ld-x86-64/tlspic.rd: Likewise.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r--bfd/elflink.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 1721f3f8a3c..9f1be5f4a35 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -8996,7 +8996,28 @@ elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h,
return TRUE;
}
+
+/* Mark sections containing global symbols. This is called through
+ elf_link_hash_traverse. */
+static bfd_boolean
+elf_mark_used_section (struct elf_link_hash_entry *h,
+ void *global ATTRIBUTE_UNUSED)
+{
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if ((h->root.type == bfd_link_hash_defined
+ || h->root.type == bfd_link_hash_defweak))
+ {
+ asection *s = h->root.u.def.section->output_section;
+ if (s)
+ s->flags |= SEC_KEEP;
+ }
+
+ return TRUE;
+}
+
/* Do mark and sweep of unused sections. */
bfd_boolean
@@ -9008,6 +9029,17 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
(asection *, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *h, Elf_Internal_Sym *);
+ if (!info->gc_sections)
+ {
+ /* If we are called when info->gc_sections is 0, we will mark
+ all sections containing global symbols for non-relocable
+ link. */
+ if (!info->relocatable)
+ elf_link_hash_traverse (elf_hash_table (info),
+ elf_mark_used_section, NULL);
+ return TRUE;
+ }
+
if (!get_elf_backend_data (abfd)->can_gc_sections
|| info->relocatable
|| info->emitrelocations