summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog26
-rw-r--r--bfd/bfd-in.h13
-rw-r--r--bfd/bfd-in2.h13
-rw-r--r--bfd/coff-ppc.c4
-rw-r--r--bfd/cofflink.c7
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf.c2
-rw-r--r--bfd/elflink.c6
-rw-r--r--bfd/libbfd-in.h7
-rw-r--r--bfd/libbfd.h7
-rw-r--r--bfd/libcoff-in.h2
-rw-r--r--bfd/libcoff.h2
-rw-r--r--bfd/stabs.c72
13 files changed, 94 insertions, 73 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d34715564b4..9fff848b7be 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,29 @@
+2004-06-28 Alan Modra <amodra@bigpond.net.au>
+
+ * 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 <kettenis@gnu.org>
From Miod Vallat <miod@online.fr>:
diff --git a/bfd/bfd-in.h b/bfd/bfd-in.h
index f2739484cf5..b3eb2939b00 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 3b9d78cf937..65a4a10213e 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 799178e0891..c1eca470c87 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 f9e89180aed..1af86abaec9 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 e140c68a7ed..532cdb31607 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 39e5ee2c5ca..1525fa55d62 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 51d20f8b364..7b8d2524282 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 2e4f1762f82..1bfa220f94a 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 2e3be87b151..217299b9dbd 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 6b5947c4914..589f88c08fb 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 57711328352..fd3ecd1ea29 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 62bac2da910..12285a3668e 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;
}