aboutsummaryrefslogtreecommitdiff
path: root/ld/ldlang.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2010-02-19 01:47:16 +0000
committerAlan Modra <amodra@gmail.com>2010-02-19 01:47:16 +0000
commitd0bf826b37bdeb1ad98dc2d601b450bd5b9043e5 (patch)
tree6228351f86e84b5f27cf405eaa860fb830cc861a /ld/ldlang.c
parent220453ec97481311a3cfd0d1a191c1bfe24f3b53 (diff)
downloadgdb-d0bf826b37bdeb1ad98dc2d601b450bd5b9043e5.zip
gdb-d0bf826b37bdeb1ad98dc2d601b450bd5b9043e5.tar.gz
gdb-d0bf826b37bdeb1ad98dc2d601b450bd5b9043e5.tar.bz2
bfd/
* elf.c (_bfd_elf_fixup_group_sections): New function, split out from.. (_bfd_elf_copy_private_header_data): ..here. * elflink.c (_bfd_elf_size_group_sections): New function. (bfd_elf_size_dynamic_sections): Call it. * elf-bfd.h (_bfd_elf_size_group_sections): Declare. (_bfd_elf_fixup_group_sections): Declare. ld/ * ldlang.c (unique_section_p): Add os param. Allow group sections to match /DISCARD/. Update all callers. * emultempl/genelf.em (gld${EMULATION_NAME}_before_allocation): New. (LDEMUL_BEFORE_ALLOCATION): Define. ld/testsuite/ * ld-elf/group.ld: Discard .dropme sections. * ld-elf/group10.d, * ld-elf/group10.s: New test.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r--ld/ldlang.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index fd75a5b..ce5a11c 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -195,7 +195,8 @@ input_statement_is_archive_path (const char *file_spec, char *sep,
}
static bfd_boolean
-unique_section_p (const asection *sec)
+unique_section_p (const asection *sec,
+ const lang_output_section_statement_type *os)
{
struct unique_sections *unam;
const char *secnam;
@@ -203,7 +204,8 @@ unique_section_p (const asection *sec)
if (link_info.relocatable
&& sec->owner != NULL
&& bfd_is_group_section (sec->owner, sec))
- return TRUE;
+ return !(os != NULL
+ && strcmp (os->name, DISCARD_SECTION_NAME) == 0);
secnam = sec->name;
for (unam = unique_section_list; unam; unam = unam->next)
@@ -445,12 +447,15 @@ output_section_callback_fast (lang_wild_statement_type *ptr,
struct wildcard_list *sec,
asection *section,
lang_input_statement_type *file,
- void *output ATTRIBUTE_UNUSED)
+ void *output)
{
lang_section_bst_type *node;
lang_section_bst_type **tree;
+ lang_output_section_statement_type *os;
- if (unique_section_p (section))
+ os = (lang_output_section_statement_type *) output;
+
+ if (unique_section_p (section, os))
return;
node = (lang_section_bst_type *) xmalloc (sizeof (lang_section_bst_type));
@@ -2415,9 +2420,12 @@ output_section_callback (lang_wild_statement_type *ptr,
void *output)
{
lang_statement_union_type *before;
+ lang_output_section_statement_type *os;
+
+ os = (lang_output_section_statement_type *) output;
/* Exclude sections that match UNIQUE_SECTION_LIST. */
- if (unique_section_p (section))
+ if (unique_section_p (section, os))
return;
before = wild_sort (ptr, sec, file, section);
@@ -2428,16 +2436,14 @@ output_section_callback (lang_wild_statement_type *ptr,
of the current list. */
if (before == NULL)
- lang_add_section (&ptr->children, section,
- (lang_output_section_statement_type *) output);
+ lang_add_section (&ptr->children, section, os);
else
{
lang_statement_list_type list;
lang_statement_union_type **pp;
lang_list_init (&list);
- lang_add_section (&list, section,
- (lang_output_section_statement_type *) output);
+ lang_add_section (&list, section, os);
/* If we are discarding the section, LIST.HEAD will
be NULL. */
@@ -2464,14 +2470,18 @@ check_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED,
struct wildcard_list *sec ATTRIBUTE_UNUSED,
asection *section,
lang_input_statement_type *file ATTRIBUTE_UNUSED,
- void *data)
+ void *output)
{
+ lang_output_section_statement_type *os;
+
+ os = (lang_output_section_statement_type *) output;
+
/* Exclude sections that match UNIQUE_SECTION_LIST. */
- if (unique_section_p (section))
+ if (unique_section_p (section, os))
return;
if (section->output_section == NULL && (section->flags & SEC_READONLY) == 0)
- ((lang_output_section_statement_type *) data)->all_input_readonly = FALSE;
+ os->all_input_readonly = FALSE;
}
/* This is passed a file name which must have been seen already and
@@ -5848,7 +5858,8 @@ lang_place_orphans (void)
const char *name = s->name;
int constraint = 0;
- if (config.unique_orphan_sections || unique_section_p (s))
+ if (config.unique_orphan_sections
+ || unique_section_p (s, NULL))
constraint = SPECIAL;
if (!ldemul_place_orphan (s, name, constraint))