aboutsummaryrefslogtreecommitdiff
path: root/bfd/linker.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-08-04 01:19:10 +0000
committerAlan Modra <amodra@gmail.com>2005-08-04 01:19:10 +0000
commit1e035701d67ed8a8bc72ec9e393f2d984090a60c (patch)
tree6fcad3c6a7a6230a26ad9be058d62593e52434a1 /bfd/linker.c
parent90b263f311be83eb53821908bbec2a18e2b1ce69 (diff)
downloadgdb-1e035701d67ed8a8bc72ec9e393f2d984090a60c.zip
gdb-1e035701d67ed8a8bc72ec9e393f2d984090a60c.tar.gz
gdb-1e035701d67ed8a8bc72ec9e393f2d984090a60c.tar.bz2
bfd/
* elflink.c (fix_syms, _bfd_elf_fix_excluded_sec_syms): Move to.. * linker.c (fix_syms, _bfd_fix_excluded_sec_syms): ..here. * bfd-in.h (_bfd_fix_excluded_sec_syms): Rename. * bfd-in2.h: Regenerate. ld/ * ldemul.c (ldemul_finish): Call ld_emulation->finish unconditionally. (finish_default): New function. * ldemul.h (finish_default): Declare. * emultempl/aix.em (gld*_before_allocation): Call before_allocation_default rather than strip_excluded_output_sections. (ld_*_emulation): Init finish field to finish_default. * emultempl/armcoff.em: Likewise. * emultempl/beos.em: Likewise. * emultempl/elf32.em: Likewise. * emultempl/generic.em: Likewise. * emultempl/gld960.em: Likewise. * emultempl/gld960c.em: Likewise. * emultempl/hppaelf.em: Likewise. * emultempl/linux.em: Likewise. * emultempl/lnk960.em: Likewise. * emultempl/m68kcoff.em: Likewise. * emultempl/mmo.em: Likewise. * emultempl/pe.em: Likewise. * emultempl/ppc64elf.em: Likewise. * emultempl/sunos.em: Likewise. * emultempl/ticoff.em: Likewise. * emultempl/vanilla.em: Likewise.
Diffstat (limited to 'bfd/linker.c')
-rw-r--r--bfd/linker.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/bfd/linker.c b/bfd/linker.c
index 426d545..0bfdfb2 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -3071,3 +3071,36 @@ _bfd_generic_section_already_linked (bfd *abfd, asection *sec)
/* This is the first section with this name. Record it. */
bfd_section_already_linked_table_insert (already_linked_list, sec);
}
+
+/* Convert symbols in excluded output sections to absolute. */
+
+static bfd_boolean
+fix_syms (struct bfd_link_hash_entry *h, void *data)
+{
+ bfd *obfd = (bfd *) data;
+
+ if (h->type == bfd_link_hash_warning)
+ h = h->u.i.link;
+
+ if (h->type == bfd_link_hash_defined
+ || h->type == bfd_link_hash_defweak)
+ {
+ asection *s = h->u.def.section;
+ if (s != NULL
+ && s->output_section != NULL
+ && (s->output_section->flags & SEC_EXCLUDE) != 0
+ && bfd_section_removed_from_list (obfd, s->output_section))
+ {
+ h->u.def.value += s->output_offset + s->output_section->vma;
+ h->u.def.section = bfd_abs_section_ptr;
+ }
+ }
+
+ return TRUE;
+}
+
+void
+_bfd_fix_excluded_sec_syms (bfd *obfd, struct bfd_link_info *info)
+{
+ bfd_link_hash_traverse (info->hash, fix_syms, obfd);
+}