From 3722b82f100acbc3dbe63a0fd5735e7e34ce5651 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 28 Jun 2004 13:57:59 +0000 Subject: [PATCH] * bfd-in.h (struct stab_info): Move from stabs.c. * stabs.c (struct stab_link_includes_table): Delete. (stab_link_includes_lookup): Delete. (_bfd_write_section_stabs, _bfd_write_stab_strings): Remove one level of indirection from sinfo parm. (_bfd_link_section_stabs): Likewise. Set SEC_LINKER_CREATED on stabstr section. Adjust hash table accesses. * coff-ppc.c (ppc_bfd_coff_final_link): Do include rawsize in contents alloc. Adjust stab_info test. * cofflink.c (_bfd_coff_link_hash_table_init): Clear stab_info. (_bfd_coff_final_link): Adjust stab_info test. (_bfd_coff_link_input_bfd): Ignore SEC_LINKER_CREATED sections. * elf-bfd.h (struct elf_link_hash_table): Include struct stab_info in place. * libcoff-in.h (struct coff_link_hash_table): Likewise. * elf.c (_bfd_elf_link_hash_table_init): Clear stab_info. * elflink.c (bfd_elf_final_link): Don't attempt to link linker created stabstr section. Adjust stab_info test. * libbfd-in.h (_bfd_link_section_stabs, _bfd_write_section_stabs) (_bfd_write_stab_strings): Adjust prototypes. * libbfd.h: Regenerate. * libcoff.h: Regenerate. * bfd-in2.h: Regenerate. --- bfd/ChangeLog | 26 +++++++++++++++++ bfd/bfd-in.h | 13 +++++++++ bfd/bfd-in2.h | 13 +++++++++ bfd/coff-ppc.c | 4 ++- bfd/cofflink.c | 7 +++-- bfd/elf-bfd.h | 6 ++-- bfd/elf.c | 2 +- bfd/elflink.c | 6 ++-- bfd/libbfd-in.h | 7 +++-- bfd/libbfd.h | 7 +++-- bfd/libcoff-in.h | 2 +- bfd/libcoff.h | 2 +- bfd/stabs.c | 72 +++++++++++------------------------------------- 13 files changed, 94 insertions(+), 73 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d34715564b..9fff848b7b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,29 @@ +2004-06-28 Alan Modra + + * bfd-in.h (struct stab_info): Move from stabs.c. + * stabs.c (struct stab_link_includes_table): Delete. + (stab_link_includes_lookup): Delete. + (_bfd_write_section_stabs, _bfd_write_stab_strings): Remove one + level of indirection from sinfo parm. + (_bfd_link_section_stabs): Likewise. Set SEC_LINKER_CREATED on + stabstr section. Adjust hash table accesses. + * coff-ppc.c (ppc_bfd_coff_final_link): Do include rawsize in contents + alloc. Adjust stab_info test. + * cofflink.c (_bfd_coff_link_hash_table_init): Clear stab_info. + (_bfd_coff_final_link): Adjust stab_info test. + (_bfd_coff_link_input_bfd): Ignore SEC_LINKER_CREATED sections. + * elf-bfd.h (struct elf_link_hash_table): Include struct stab_info + in place. + * libcoff-in.h (struct coff_link_hash_table): Likewise. + * elf.c (_bfd_elf_link_hash_table_init): Clear stab_info. + * elflink.c (bfd_elf_final_link): Don't attempt to link linker created + stabstr section. Adjust stab_info test. + * libbfd-in.h (_bfd_link_section_stabs, _bfd_write_section_stabs) + (_bfd_write_stab_strings): Adjust prototypes. + * libbfd.h: Regenerate. + * libcoff.h: Regenerate. + * bfd-in2.h: Regenerate. + 2004-06-27 Mark Kettenis From Miod Vallat : diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h index f2739484cf..b3eb2939b0 100644 --- a/bfd/bfd-in.h +++ b/bfd/bfd-in.h @@ -439,6 +439,19 @@ extern void bfd_hash_traverse this size. */ extern void bfd_hash_set_default_size (bfd_size_type); +/* This structure is used to keep track of stabs in sections + information while linking. */ + +struct stab_info +{ + /* A hash table used to hold stabs strings. */ + struct bfd_strtab_hash *strings; + /* The header file hash table. */ + struct bfd_hash_table includes; + /* The first .stabstr section. */ + struct bfd_section *stabstr; +}; + #define COFF_SWAP_TABLE (void *) &bfd_coff_std_swap_table /* User program access to BFD facilities. */ diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 3b9d78cf93..65a4a10213 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -446,6 +446,19 @@ extern void bfd_hash_traverse this size. */ extern void bfd_hash_set_default_size (bfd_size_type); +/* This structure is used to keep track of stabs in sections + information while linking. */ + +struct stab_info +{ + /* A hash table used to hold stabs strings. */ + struct bfd_strtab_hash *strings; + /* The header file hash table. */ + struct bfd_hash_table includes; + /* The first .stabstr section. */ + struct bfd_section *stabstr; +}; + #define COFF_SWAP_TABLE (void *) &bfd_coff_std_swap_table /* User program access to BFD facilities. */ diff --git a/bfd/coff-ppc.c b/bfd/coff-ppc.c index 799178e089..c1eca470c8 100644 --- a/bfd/coff-ppc.c +++ b/bfd/coff-ppc.c @@ -2328,6 +2328,8 @@ ppc_bfd_coff_final_link (abfd, info) if (info->relocatable) o->reloc_count += sec->reloc_count; + if (sec->rawsize > max_contents_size) + max_contents_size = sec->rawsize; if (sec->size > max_contents_size) max_contents_size = sec->size; if (sec->lineno_count > max_lineno_count) @@ -2663,7 +2665,7 @@ ppc_bfd_coff_final_link (abfd, info) } /* If we have optimized stabs strings, output them. */ - if (coff_hash_table (info)->stab_info != NULL) + if (coff_hash_table (info)->stab_info.stabstr != NULL) { if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info)) return FALSE; diff --git a/bfd/cofflink.c b/bfd/cofflink.c index f9e89180ae..1af86abaec 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -96,7 +96,7 @@ _bfd_coff_link_hash_table_init (struct coff_link_hash_table *table, struct bfd_hash_table *, const char *)) { - table->stab_info = NULL; + memset (&table->stab_info, 0, sizeof (table->stab_info)); return _bfd_link_hash_table_init (&table->root, abfd, newfunc); } @@ -1082,7 +1082,7 @@ _bfd_coff_final_link (bfd *abfd, } /* If we have optimized stabs strings, output them. */ - if (coff_hash_table (info)->stab_info != NULL) + if (coff_hash_table (info)->stab_info.stabstr != NULL) { if (! _bfd_write_stab_strings (abfd, &coff_hash_table (info)->stab_info)) return FALSE; @@ -2282,6 +2282,9 @@ _bfd_coff_link_input_bfd (struct coff_final_link_info *finfo, bfd *input_bfd) /* This section was omitted from the link. */ continue; + if ((o->flags & SEC_LINKER_CREATED) != 0) + continue; + if ((o->flags & SEC_HAS_CONTENTS) == 0 || (o->size == 0 && (o->flags & SEC_RELOC) == 0)) { diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index e140c68a7e..532cdb3160 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -356,12 +356,12 @@ struct elf_link_hash_table /* The _GLOBAL_OFFSET_TABLE_ symbol. */ struct elf_link_hash_entry *hgot; - /* A pointer to information used to link stabs in sections. */ - void *stab_info; - /* A pointer to information used to merge SEC_MERGE sections. */ void *merge_info; + /* Used to link stabs in sections. */ + struct stab_info stab_info; + /* Used by eh_frame code when editing .eh_frame. */ struct eh_frame_hdr_info eh_info; diff --git a/bfd/elf.c b/bfd/elf.c index 39e5ee2c5c..1525fa55d6 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -1466,8 +1466,8 @@ _bfd_elf_link_hash_table_init table->bucketcount = 0; table->needed = NULL; table->hgot = NULL; - table->stab_info = NULL; table->merge_info = NULL; + memset (&table->stab_info, 0, sizeof (table->stab_info)); memset (&table->eh_info, 0, sizeof (table->eh_info)); table->dynlocal = NULL; table->runpath = NULL; diff --git a/bfd/elflink.c b/bfd/elflink.c index 51d20f8b36..7b8d252428 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4124,7 +4124,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) secdata = elf_section_data (stab); if (! _bfd_link_section_stabs (abfd, - & hash_table->stab_info, + &hash_table->stab_info, stab, stabstr, &secdata->sec_info, &string_offset)) @@ -8001,6 +8001,8 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) created by _bfd_elf_link_create_dynamic_sections. */ continue; } + if (elf_hash_table (info)->stab_info.stabstr == o) + continue; if (elf_hash_table (info)->eh_info.hdr_sec == o) continue; if ((elf_section_data (o->output_section)->this_hdr.sh_type @@ -8036,7 +8038,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) } /* If we have optimized stabs strings, output them. */ - if (elf_hash_table (info)->stab_info != NULL) + if (elf_hash_table (info)->stab_info.stabstr != NULL) { if (! _bfd_write_stab_strings (abfd, &elf_hash_table (info)->stab_info)) goto error_return; diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h index 2e4f1762f8..1bfa220f94 100644 --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h @@ -498,7 +498,8 @@ extern bfd_reloc_status_type _bfd_relocate_contents /* Link stabs in sections in the first pass. */ extern bfd_boolean _bfd_link_section_stabs - (bfd *, void **, asection *, asection *, void **, bfd_size_type *); + (bfd *, struct stab_info *, asection *, asection *, void **, + bfd_size_type *); /* Eliminate stabs for discarded functions and symbols. */ extern bfd_boolean _bfd_discard_section_stabs @@ -507,12 +508,12 @@ extern bfd_boolean _bfd_discard_section_stabs /* Write out the .stab section when linking stabs in sections. */ extern bfd_boolean _bfd_write_section_stabs - (bfd *, void **, asection *, void **, bfd_byte *); + (bfd *, struct stab_info *, asection *, void **, bfd_byte *); /* Write out the .stabstr string table when linking stabs in sections. */ extern bfd_boolean _bfd_write_stab_strings - (bfd *, void **); + (bfd *, struct stab_info *); /* Find an offset within a .stab section when linking stabs in sections. */ diff --git a/bfd/libbfd.h b/bfd/libbfd.h index 2e3be87b15..217299b9db 100644 --- a/bfd/libbfd.h +++ b/bfd/libbfd.h @@ -503,7 +503,8 @@ extern bfd_reloc_status_type _bfd_relocate_contents /* Link stabs in sections in the first pass. */ extern bfd_boolean _bfd_link_section_stabs - (bfd *, void **, asection *, asection *, void **, bfd_size_type *); + (bfd *, struct stab_info *, asection *, asection *, void **, + bfd_size_type *); /* Eliminate stabs for discarded functions and symbols. */ extern bfd_boolean _bfd_discard_section_stabs @@ -512,12 +513,12 @@ extern bfd_boolean _bfd_discard_section_stabs /* Write out the .stab section when linking stabs in sections. */ extern bfd_boolean _bfd_write_section_stabs - (bfd *, void **, asection *, void **, bfd_byte *); + (bfd *, struct stab_info *, asection *, void **, bfd_byte *); /* Write out the .stabstr string table when linking stabs in sections. */ extern bfd_boolean _bfd_write_stab_strings - (bfd *, void **); + (bfd *, struct stab_info *); /* Find an offset within a .stab section when linking stabs in sections. */ diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h index 6b5947c491..589f88c08f 100644 --- a/bfd/libcoff-in.h +++ b/bfd/libcoff-in.h @@ -276,7 +276,7 @@ struct coff_link_hash_table { struct bfd_link_hash_table root; /* A pointer to information used to link stabs in sections. */ - PTR stab_info; + struct stab_info stab_info; }; /* Look up an entry in a COFF linker hash table. */ diff --git a/bfd/libcoff.h b/bfd/libcoff.h index 5771132835..fd3ecd1ea2 100644 --- a/bfd/libcoff.h +++ b/bfd/libcoff.h @@ -280,7 +280,7 @@ struct coff_link_hash_table { struct bfd_link_hash_table root; /* A pointer to information used to link stabs in sections. */ - PTR stab_info; + struct stab_info stab_info; }; /* Look up an entry in a COFF linker hash table. */ diff --git a/bfd/stabs.c b/bfd/stabs.c index 62bac2da91..12285a3668 100644 --- a/bfd/stabs.c +++ b/bfd/stabs.c @@ -48,13 +48,6 @@ #define VALOFF (8) #define STABSIZE (12) -/* A hash table used for header files with N_BINCL entries. */ - -struct stab_link_includes_table -{ - struct bfd_hash_table root; -}; - /* A linked list of totals that we have found for a particular header file. A total is a unique identifier for a particular BINCL...EINCL sequence of STABs that can be used to identify duplicate sequences. @@ -80,12 +73,6 @@ struct stab_link_includes_entry struct stab_link_includes_totals *totals; }; -/* Look up an entry in an the header file hash table. */ - -#define stab_link_includes_lookup(table, string, create, copy) \ - ((struct stab_link_includes_entry *) \ - bfd_hash_lookup (&(table)->root, (string), (create), (copy))) - /* This structure is used to hold a list of N_BINCL symbols, some of which might be converted into N_EXCL symbols. */ @@ -124,19 +111,6 @@ struct stab_section_info bfd_size_type stridxs[1]; }; -/* This structure is used to keep track of stabs in sections - information while linking. */ - -struct stab_info -{ - /* A hash table used to hold stabs strings. */ - struct bfd_strtab_hash *strings; - /* The header file hash table. */ - struct stab_link_includes_table includes; - /* The first .stabstr section. */ - asection *stabstr; -}; - static struct bfd_hash_entry *stab_link_includes_newfunc PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *)); @@ -176,16 +150,15 @@ stab_link_includes_newfunc (entry, table, string) pass of the linker. */ bfd_boolean -_bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_offset) +_bfd_link_section_stabs (abfd, sinfo, stabsec, stabstrsec, psecinfo, pstring_offset) bfd *abfd; - PTR *psinfo; + struct stab_info *sinfo; asection *stabsec; asection *stabstrsec; PTR *psecinfo; bfd_size_type *pstring_offset; { bfd_boolean first; - struct stab_info *sinfo; bfd_size_type count, amt; struct stab_section_info *secinfo; bfd_byte *stabbuf = NULL; @@ -227,30 +200,26 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of first = FALSE; - if (*psinfo == NULL) + if (sinfo->stabstr == NULL) { /* Initialize the stabs information we need to keep track of. */ first = TRUE; - amt = sizeof (struct stab_info); - *psinfo = (PTR) bfd_alloc (abfd, amt); - if (*psinfo == NULL) - goto error_return; - sinfo = (struct stab_info *) *psinfo; sinfo->strings = _bfd_stringtab_init (); if (sinfo->strings == NULL) goto error_return; /* Make sure the first byte is zero. */ (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); - if (! bfd_hash_table_init_n (&sinfo->includes.root, + if (! bfd_hash_table_init_n (&sinfo->includes, stab_link_includes_newfunc, 251)) goto error_return; sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); - sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING; + if (sinfo->stabstr == NULL) + goto error_return; + sinfo->stabstr->flags |= (SEC_HAS_CONTENTS | SEC_READONLY + | SEC_DEBUGGING | SEC_LINKER_CREATED); } - sinfo = (struct stab_info *) *psinfo; - /* Initialize the information we are going to store for this .stab section. */ @@ -411,8 +380,8 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of /* If we have already included a header file with the same value, then replaced this one with an N_EXCL symbol. */ - incl_entry = stab_link_includes_lookup (&sinfo->includes, string, - TRUE, TRUE); + incl_entry = (struct stab_link_includes_entry * ) + bfd_hash_lookup (&sinfo->includes, string, TRUE, TRUE); if (incl_entry == NULL) goto error_return; @@ -439,7 +408,7 @@ _bfd_link_section_stabs (abfd, psinfo, stabsec, stabstrsec, psecinfo, pstring_of /* This is the first time we have seen this header file with this set of stabs strings. */ t = ((struct stab_link_includes_totals *) - bfd_hash_allocate (&sinfo->includes.root, sizeof *t)); + bfd_hash_allocate (&sinfo->includes, sizeof *t)); if (t == NULL) goto error_return; t->sum_chars = sum_chars; @@ -718,20 +687,18 @@ _bfd_discard_section_stabs (abfd, stabsec, psecinfo, contents. */ bfd_boolean -_bfd_write_section_stabs (output_bfd, psinfo, stabsec, psecinfo, contents) +_bfd_write_section_stabs (output_bfd, sinfo, stabsec, psecinfo, contents) bfd *output_bfd; - PTR *psinfo; + struct stab_info *sinfo; asection *stabsec; PTR *psecinfo; bfd_byte *contents; { - struct stab_info *sinfo; struct stab_section_info *secinfo; struct stab_excl_list *e; bfd_byte *sym, *tosym, *symend; bfd_size_type *pstridx; - sinfo = (struct stab_info *) *psinfo; secinfo = (struct stab_section_info *) *psecinfo; if (secinfo == NULL) @@ -792,17 +759,10 @@ _bfd_write_section_stabs (output_bfd, psinfo, stabsec, psecinfo, contents) /* Write out the .stabstr section. */ bfd_boolean -_bfd_write_stab_strings (output_bfd, psinfo) +_bfd_write_stab_strings (output_bfd, sinfo) bfd *output_bfd; - PTR *psinfo; + struct stab_info *sinfo; { - struct stab_info *sinfo; - - sinfo = (struct stab_info *) *psinfo; - - if (sinfo == NULL) - return TRUE; - if (bfd_is_abs_section (sinfo->stabstr->output_section)) { /* The section was discarded from the link. */ @@ -824,7 +784,7 @@ _bfd_write_stab_strings (output_bfd, psinfo) /* We no longer need the stabs information. */ _bfd_stringtab_free (sinfo->strings); - bfd_hash_table_free (&sinfo->includes.root); + bfd_hash_table_free (&sinfo->includes); return TRUE; } -- 2.34.1