aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog17
-rw-r--r--bfd/aoutx.h74
-rw-r--r--bfd/bfd-in2.h12
-rw-r--r--bfd/coff-ppc.c18
-rw-r--r--bfd/cofflink.c38
-rw-r--r--bfd/elflink.h12
-rw-r--r--bfd/section.c6
-rw-r--r--bfd/xcofflink.c12
8 files changed, 149 insertions, 40 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b771a81..9406f6a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,22 @@
Wed Mar 27 10:43:34 1996 Ian Lance Taylor <ian@cygnus.com>
+ * section.c (SEC_LINKER_MARK): Define.
+ * bfd-in2.h: Rebuild.
+ * aoutx.h (NAME(aout,final_link)): Mark sections included in the
+ link.
+ (aout_link_input_bfd): Don't link unmarked sections.
+ * cofflink.c (_bfd_coff_final_link): Mark sections included in the
+ link.
+ (_bfd_coff_link_input_bfd): Don't link unmarked sections.
+ * coff-ppc.c (ppc_bfd_coff_final_link): Mark sections included in
+ the link.
+ * elflink.h (elf_bfd_final_link): Mark sections included in the
+ link.
+ (elf_link_input_bfd): Don't link unmarked sections.
+ * xcofflink.c (_bfd_xcoff_bfd_final_link): Mark sections included
+ in the link.
+ (xcoff_link_input_bfd): Don't link unmarked sections.
+
* coffswap.h (coff_swap_scnhdr_out): Include section name in
overflow error messages.
diff --git a/bfd/aoutx.h b/bfd/aoutx.h
index b5b6099..07f95ac 100644
--- a/bfd/aoutx.h
+++ b/bfd/aoutx.h
@@ -3681,6 +3681,19 @@ NAME(aout,final_link) (abfd, info, callback)
for (sub = info->input_bfds; sub != (bfd *) NULL; sub = sub->link_next)
sub->output_has_begun = false;
+ /* Mark all sections which are to be included in the link. This
+ will normally be every section. We need to do this so that we
+ can identify any sections which the linker has decided to not
+ include. */
+ for (o = abfd->sections; o != NULL; o = o->next)
+ {
+ for (p = o->link_order_head; p != NULL; p = p->next)
+ {
+ if (p->type == bfd_indirect_link_order)
+ p->u.indirect.section->flags |= SEC_LINKER_MARK;
+ }
+ }
+
have_link_order_relocs = false;
for (o = abfd->sections; o != (asection *) NULL; o = o->next)
{
@@ -3836,16 +3849,25 @@ aout_link_input_bfd (finfo, input_bfd)
return false;
/* Relocate and write out the sections. These functions use the
- symbol map created by aout_link_write_symbols. */
- if (! aout_link_input_section (finfo, input_bfd,
- obj_textsec (input_bfd),
- &finfo->treloff,
- exec_hdr (input_bfd)->a_trsize)
- || ! aout_link_input_section (finfo, input_bfd,
- obj_datasec (input_bfd),
- &finfo->dreloff,
- exec_hdr (input_bfd)->a_drsize))
- return false;
+ symbol map created by aout_link_write_symbols. SEC_LINKER_MARK
+ will be set if these sections are to be included in the link,
+ which will normally be the case. */
+ if ((obj_textsec (input_bfd)->flags & SEC_LINKER_MARK) != 0)
+ {
+ if (! aout_link_input_section (finfo, input_bfd,
+ obj_textsec (input_bfd),
+ &finfo->treloff,
+ exec_hdr (input_bfd)->a_trsize))
+ return false;
+ }
+ if ((obj_datasec (input_bfd)->flags & SEC_LINKER_MARK) != 0)
+ {
+ if (! aout_link_input_section (finfo, input_bfd,
+ obj_datasec (input_bfd),
+ &finfo->dreloff,
+ exec_hdr (input_bfd)->a_drsize))
+ return false;
+ }
/* If we are not keeping memory, we don't need the symbols any
longer. We still need them if we are keeping memory, because the
@@ -3972,6 +3994,11 @@ aout_link_write_symbols (finfo, input_bfd)
external symbol. */
h = *sym_hash;
+ /* Use the name from the hash table, in case the symbol was
+ wrapped. */
+ if (h != NULL)
+ name = h->root.root.string;
+
/* If this is an indirect or warning symbol, then change
hresolve to the base symbol. We also change *sym_hash so
that the relocation routines relocate against the real
@@ -4862,16 +4889,19 @@ aout_link_input_section_std (finfo, input_bfd, input_section, relocs,
{
const char *name;
- name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
+ if (h != NULL)
+ name = h->root.root.string;
+ else
+ name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
if (! ((*finfo->info->callbacks->undefined_symbol)
(finfo->info, name, input_bfd, input_section, r_addr)))
return false;
}
r = MY_final_link_relocate (howto,
- input_bfd, input_section,
- contents, r_addr, relocation,
- (bfd_vma) 0);
+ input_bfd, input_section,
+ contents, r_addr, relocation,
+ (bfd_vma) 0);
}
if (r != bfd_reloc_ok)
@@ -5246,16 +5276,19 @@ aout_link_input_section_ext (finfo, input_bfd, input_section, relocs,
{
const char *name;
- name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
+ if (h != NULL)
+ name = h->root.root.string;
+ else
+ name = strings + GET_WORD (input_bfd, syms[r_index].e_strx);
if (! ((*finfo->info->callbacks->undefined_symbol)
(finfo->info, name, input_bfd, input_section, r_addr)))
return false;
}
r = MY_final_link_relocate (howto_table_ext + r_type,
- input_bfd, input_section,
- contents, r_addr, relocation,
- r_addend);
+ input_bfd, input_section,
+ contents, r_addr, relocation,
+ r_addend);
if (r != bfd_reloc_ok)
{
switch (r)
@@ -5330,8 +5363,9 @@ aout_link_reloc_link_order (finfo, o, p)
BFD_ASSERT (p->type == bfd_symbol_reloc_link_order);
r_extern = 1;
- h = aout_link_hash_lookup (aout_hash_table (finfo->info),
- pr->u.name, false, false, true);
+ h = ((struct aout_link_hash_entry *)
+ bfd_wrapped_link_hash_lookup (finfo->output_bfd, finfo->info,
+ pr->u.name, false, false, true));
if (h != (struct aout_link_hash_entry *) NULL
&& h->indx >= 0)
r_index = h->indx;
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 9e2ded5..11cc952 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -333,6 +333,10 @@ typedef struct _symbol_info
short stab_desc; /* Stab desc. */
CONST char *stab_name; /* String for stab type. */
} symbol_info;
+
+/* Get the name of a stabs type code. */
+
+extern const char *bfd_get_stab_name PARAMS ((int));
/* Hash table routines. There is no way to free up a hash table. */
@@ -613,7 +617,9 @@ extern boolean bfd_sunos_size_dynamic_sections
/* Linux shared library support routines for the linker. */
-extern boolean bfd_linux_size_dynamic_sections
+extern boolean bfd_i386linux_size_dynamic_sections
+ PARAMS ((bfd *, struct bfd_link_info *));
+extern boolean bfd_m68klinux_size_dynamic_sections
PARAMS ((bfd *, struct bfd_link_info *));
/* mmap hacks */
@@ -885,6 +891,10 @@ typedef struct sec
table. */
#define SEC_SORT_ENTRIES 0x80000
+ /* A mark flag used by some of the linker backends. This
+ should not be set by application code. */
+#define SEC_LINKER_MARK 0x100000
+
/* End of section flags. */
/* The virtual memory address of the section - where it will be
diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c
index 76c2056..67fcef3 100644
--- a/bfd/coff-ppc.c
+++ b/bfd/coff-ppc.c
@@ -2745,6 +2745,12 @@ ppc_bfd_coff_final_link (abfd, info)
sec = p->u.indirect.section;
+ /* Mark all sections which are to be included in the
+ link. This will normally be every section. We need
+ to do this so that we can identify any sections which
+ the linker has decided to not include. */
+ sec->flags |= SEC_LINKER_MARK;
+
if (info->strip == strip_none
|| info->strip == strip_some)
o->lineno_count += sec->lineno_count;
@@ -2920,7 +2926,7 @@ ppc_bfd_coff_final_link (abfd, info)
if (! sub->output_has_begun)
#endif
{
- if (! coff_link_input_bfd (&finfo, sub))
+ if (! _bfd_coff_link_input_bfd (&finfo, sub))
goto error_return;
sub->output_has_begun = true;
}
@@ -2928,7 +2934,7 @@ ppc_bfd_coff_final_link (abfd, info)
else if (p->type == bfd_section_reloc_link_order
|| p->type == bfd_symbol_reloc_link_order)
{
- if (! coff_reloc_link_order (abfd, &finfo, o, p))
+ if (! _bfd_coff_reloc_link_order (abfd, &finfo, o, p))
goto error_return;
}
else
@@ -2945,14 +2951,14 @@ ppc_bfd_coff_final_link (abfd, info)
bfd* last_one = ppc_get_last();
if (last_one)
{
- if (! coff_link_input_bfd (&finfo, last_one))
+ if (! _bfd_coff_link_input_bfd (&finfo, last_one))
goto error_return;
}
last_one->output_has_begun = true;
}
#endif
- /* Free up the buffers used by coff_link_input_bfd. */
+ /* Free up the buffers used by _bfd_coff_link_input_bfd. */
coff_debug_merge_hash_table_free (&finfo.debug_merge);
debug_merge_allocated = false;
@@ -3012,12 +3018,12 @@ ppc_bfd_coff_final_link (abfd, info)
/* Write out the global symbols. */
finfo.failed = false;
- coff_link_hash_traverse (coff_hash_table (info), coff_write_global_sym,
+ coff_link_hash_traverse (coff_hash_table (info), _bfd_coff_write_global_sym,
(PTR) &finfo);
if (finfo.failed)
goto error_return;
- /* The outsyms buffer is used by coff_write_global_sym. */
+ /* The outsyms buffer is used by _bfd_coff_write_global_sym. */
if (finfo.outsyms != NULL)
{
free (finfo.outsyms);
diff --git a/bfd/cofflink.c b/bfd/cofflink.c
index 92b19e2..123685b 100644
--- a/bfd/cofflink.c
+++ b/bfd/cofflink.c
@@ -485,13 +485,18 @@ _bfd_coff_final_link (abfd, info)
o->lineno_count = 0;
for (p = o->link_order_head; p != NULL; p = p->next)
{
-
if (p->type == bfd_indirect_link_order)
{
asection *sec;
sec = p->u.indirect.section;
+ /* Mark all sections which are to be included in the
+ link. This will normally be every section. We need
+ to do this so that we can identify any sections which
+ the linker has decided to not include. */
+ sec->flags |= SEC_LINKER_MARK;
+
if (info->strip == strip_none
|| info->strip == strip_some)
o->lineno_count += sec->lineno_count;
@@ -1079,11 +1084,11 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
output_index = syment_base;
outsym = finfo->outsyms;
- if (coff_data(output_bfd)->pe)
- {
- if (!process_embedded_commands (output_bfd, finfo->info, input_bfd))
- return false;
- }
+ if (coff_data (output_bfd)->pe)
+ {
+ if (! process_embedded_commands (output_bfd, finfo->info, input_bfd))
+ return false;
+ }
while (esym < esym_end)
{
@@ -1196,9 +1201,9 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
/* Ignore fake names invented by compiler; treat them all as
the same name. */
- if (*name == '~' || *name == '.'
+ if (*name == '~' || *name == '.' || *name == '$'
|| (*name == bfd_get_symbol_leading_char (input_bfd)
- && (name[1] == '~' || name[1] == '.')))
+ && (name[1] == '~' || name[1] == '.' || name[1] == '$')))
name = "";
mh = coff_debug_merge_hash_lookup (&finfo->debug_merge, name,
@@ -1551,7 +1556,9 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
the index of the next symbol we are going
to include. I don't know if this is
entirely right. */
- while (finfo->sym_indices[indx] < 0
+ while ((finfo->sym_indices[indx] < 0
+ || ((bfd_size_type) finfo->sym_indices[indx]
+ < syment_base))
&& indx < obj_raw_syment_count (input_bfd))
++indx;
if (indx >= obj_raw_syment_count (input_bfd))
@@ -1743,6 +1750,12 @@ _bfd_coff_link_input_bfd (finfo, input_bfd)
{
bfd_byte *contents;
+ if ((o->flags & SEC_LINKER_MARK) == 0)
+ {
+ /* This section was omitted from the link. */
+ continue;
+ }
+
if ((o->flags & SEC_HAS_CONTENTS) == 0)
{
if ((o->flags & SEC_RELOC) != 0
@@ -2126,9 +2139,10 @@ _bfd_coff_reloc_link_order (output_bfd, finfo, output_section, link_order)
{
struct coff_link_hash_entry *h;
- h = coff_link_hash_lookup (coff_hash_table (finfo->info),
- link_order->u.reloc.p->u.name,
- false, false, true);
+ h = ((struct coff_link_hash_entry *)
+ bfd_wrapped_link_hash_lookup (output_bfd, finfo->info,
+ link_order->u.reloc.p->u.name,
+ false, false, true));
if (h != NULL)
{
if (h->indx >= 0)
diff --git a/bfd/elflink.h b/bfd/elflink.h
index 4ef3c8b..d613d9d 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -1798,6 +1798,12 @@ elf_bfd_final_link (abfd, info)
sec = p->u.indirect.section;
+ /* Mark all sections which are to be included in the
+ link. This will normally be every section. We need
+ to do this so that we can identify any sections which
+ the linker has decided to not include. */
+ sec->flags |= SEC_LINKER_MARK;
+
if (info->relocateable)
o->reloc_count += sec->reloc_count;
@@ -2805,6 +2811,12 @@ elf_link_input_bfd (finfo, input_bfd)
/* Relocate the contents of each section. */
for (o = input_bfd->sections; o != NULL; o = o->next)
{
+ if ((o->flags & SEC_LINKER_MARK) == 0)
+ {
+ /* This section was omitted from the link. */
+ continue;
+ }
+
if ((o->flags & SEC_HAS_CONTENTS) == 0)
continue;
diff --git a/bfd/section.c b/bfd/section.c
index 2f280c5..840606d 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -1,5 +1,5 @@
/* Object file "section" support for the BFD library.
- Copyright (C) 1990, 1991, 1992, 1993, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library.
@@ -269,6 +269,10 @@ CODE_FRAGMENT
. table. *}
.#define SEC_SORT_ENTRIES 0x80000
.
+. {* A mark flag used by some of the linker backends. This
+. should not be set by application code. *}
+.#define SEC_LINKER_MARK 0x100000
+.
. {* End of section flags. *}
.
. {* The virtual memory address of the section - where it will be
diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c
index acf134d..ddb9cad 100644
--- a/bfd/xcofflink.c
+++ b/bfd/xcofflink.c
@@ -3217,6 +3217,12 @@ _bfd_xcoff_bfd_final_link (abfd, info)
sec = p->u.indirect.section;
+ /* Mark all sections which are to be included in the
+ link. This will normally be every section. We need
+ to do this so that we can identify any sections which
+ the linker has decided to not include. */
+ sec->flags |= SEC_LINKER_MARK;
+
if (info->strip == strip_none
|| info->strip == strip_some)
o->lineno_count += sec->lineno_count;
@@ -4571,6 +4577,12 @@ xcoff_link_input_bfd (finfo, input_bfd)
{
bfd_byte *contents;
+ if ((o->flags & SEC_LINKER_MARK) == 0)
+ {
+ /* This section was omitted from the link. */
+ continue;
+ }
+
if ((o->flags & SEC_HAS_CONTENTS) == 0
|| o->_raw_size == 0
|| (o->flags & SEC_IN_MEMORY) != 0)