From 7ec49f9133feadc43acc49b1ee00674ecb9c1c15 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 27 Mar 1996 19:21:19 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 17 ++++++++++++ bfd/aoutx.h | 74 ++++++++++++++++++++++++++++++++++++------------- bfd/bfd-in2.h | 12 +++++++- bfd/coff-ppc.c | 18 ++++++++---- bfd/cofflink.c | 38 +++++++++++++++++-------- bfd/elflink.h | 12 ++++++++ bfd/section.c | 6 +++- bfd/xcofflink.c | 12 ++++++++ 8 files changed, 149 insertions(+), 40 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b771a814c7..9406f6ae8e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,22 @@ Wed Mar 27 10:43:34 1996 Ian Lance Taylor + * 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 b5b609985d..07f95ac468 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 9e2ded580e..11cc952917 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 76c20569da..67fcef38cf 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 92b19e21b9..123685b20b 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 4ef3c8b3c4..d613d9d141 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 2f280c5958..840606d13d 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 acf134d976..ddb9cad4a1 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)