aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/bfd-in2.h7
-rw-r--r--bfd/coff-rs6000.c2
-rw-r--r--bfd/coff64-rs6000.c2
-rw-r--r--bfd/elf-bfd.h2
-rw-r--r--bfd/libbfd-in.h2
-rw-r--r--bfd/libbfd.c9
-rw-r--r--bfd/libbfd.h2
-rw-r--r--bfd/targets.c7
-rw-r--r--ld/ChangeLog9
-rw-r--r--ld/emultempl/elf32.em9
-rw-r--r--ld/emultempl/pe.em2
-rw-r--r--ld/ldlang.c76
-rw-r--r--ld/ldlang.h6
14 files changed, 67 insertions, 80 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 6b78c6b..dcd3be6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+2005-11-24 Alan Modra <amodra@bigpond.net.au>
+
+ * elf-bfd.h (_bfd_generic_match_sections_by_type): Don't define.
+ * libbfd-in.h (_bfd_generic_match_sections_by_type): Delete.
+ * libbfd.c (_bfd_generic_match_sections_by_type): Delete.
+ * targets.c (bfd_match_sections_by_type): Don't define.
+ (BFD_JUMP_TABLE_LINK): Remove _bfd_generic_match_sections_by_type.
+ * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Likewise.
+ * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise.
+ * bfd-in2.h: Regenerate.
+ * libbfd.h: Regenerate.
+
2005-11-23 Daniel Jacobowitz <dan@codesourcery.com>
Thiemo Seufer <ths@networkno.de>
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index d857086..81fb666 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -4945,7 +4945,6 @@ typedef struct bfd_target
NAME##_bfd_link_split_section, \
NAME##_bfd_gc_sections, \
NAME##_bfd_merge_sections, \
- _bfd_generic_match_sections_by_type, \
NAME##_bfd_is_group_section, \
NAME##_bfd_discard_group, \
NAME##_section_already_linked \
@@ -4985,12 +4984,6 @@ typedef struct bfd_target
/* Attempt to merge SEC_MERGE sections. */
bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
-#define bfd_match_sections_by_type(abfd, asec, bbfd, bsec) \
- BFD_SEND (abfd, _bfd_match_sections_by_type, (abfd, asec, bbfd, bsec))
- /* Return TRUE if 2 section types are compatible. */
- bfd_boolean (*_bfd_match_sections_by_type)
- (bfd *, const asection *, bfd *, const asection *);
-
/* Is this section a member of a group? */
bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index 8e54c6a..220edf8 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -4196,7 +4196,6 @@ const bfd_target rs6000coff_vec =
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_merge_sections,
- _bfd_generic_match_sections_by_type,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
@@ -4447,7 +4446,6 @@ const bfd_target pmac_xcoff_vec =
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_merge_sections,
- _bfd_generic_match_sections_by_type,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c
index 77a6eec..e0aa87e 100644
--- a/bfd/coff64-rs6000.c
+++ b/bfd/coff64-rs6000.c
@@ -2743,7 +2743,6 @@ const bfd_target rs6000coff64_vec =
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_merge_sections,
- _bfd_generic_match_sections_by_type,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
@@ -2995,7 +2994,6 @@ const bfd_target aix5coff64_vec =
_bfd_generic_link_split_section,
bfd_generic_gc_sections,
bfd_generic_merge_sections,
- _bfd_generic_match_sections_by_type,
bfd_generic_is_group_section,
bfd_generic_discard_group,
_bfd_generic_section_already_linked,
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index be1c65f..f957283 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1476,8 +1476,6 @@ extern bfd_boolean _bfd_elf_merge_sections
(bfd *, struct bfd_link_info *);
extern bfd_boolean _bfd_elf_match_sections_by_type
(bfd *, const asection *, bfd *, const asection *);
-#define _bfd_generic_match_sections_by_type \
- _bfd_elf_match_sections_by_type
extern bfd_boolean bfd_elf_is_group_section
(bfd *, const struct bfd_section *);
extern void _bfd_elf_section_already_linked
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index f81452f..e3468c1 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -402,8 +402,6 @@ extern bfd_boolean _bfd_generic_set_section_contents
((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false)
#define _bfd_nolink_section_already_linked \
((void (*) (bfd *, struct bfd_section *)) bfd_void)
-extern bfd_boolean _bfd_generic_match_sections_by_type
- (bfd *, const asection *, bfd *, const asection *);
/* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
index 34e32ac..57cfabc 100644
--- a/bfd/libbfd.c
+++ b/bfd/libbfd.c
@@ -1035,15 +1035,6 @@ _bfd_generic_find_line (bfd *abfd ATTRIBUTE_UNUSED,
}
bfd_boolean
-_bfd_generic_match_sections_by_type (bfd *abfd ATTRIBUTE_UNUSED,
- const asection *asec ATTRIBUTE_UNUSED,
- bfd *bbfd ATTRIBUTE_UNUSED,
- const asection *bsec ATTRIBUTE_UNUSED)
-{
- return TRUE;
-}
-
-bfd_boolean
_bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
asection *isec ATTRIBUTE_UNUSED,
bfd *obfd ATTRIBUTE_UNUSED,
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index e05252c..8b01aaa 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -407,8 +407,6 @@ extern bfd_boolean _bfd_generic_set_section_contents
((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false)
#define _bfd_nolink_section_already_linked \
((void (*) (bfd *, struct bfd_section *)) bfd_void)
-extern bfd_boolean _bfd_generic_match_sections_by_type
- (bfd *, const asection *, bfd *, const asection *);
/* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
have dynamic symbols or relocs. Use BFD_JUMP_TABLE_DYNAMIC
diff --git a/bfd/targets.c b/bfd/targets.c
index 8f5795c..c0372a1 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -434,7 +434,6 @@ BFD_JUMP_TABLE macros.
. NAME##_bfd_link_split_section, \
. NAME##_bfd_gc_sections, \
. NAME##_bfd_merge_sections, \
-. _bfd_generic_match_sections_by_type, \
. NAME##_bfd_is_group_section, \
. NAME##_bfd_discard_group, \
. NAME##_section_already_linked \
@@ -474,12 +473,6 @@ BFD_JUMP_TABLE macros.
. {* Attempt to merge SEC_MERGE sections. *}
. bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
.
-.#define bfd_match_sections_by_type(abfd, asec, bbfd, bsec) \
-. BFD_SEND (abfd, _bfd_match_sections_by_type, (abfd, asec, bbfd, bsec))
-. {* Return TRUE if 2 section types are compatible. *}
-. bfd_boolean (*_bfd_match_sections_by_type)
-. (bfd *, const asection *, bfd *, const asection *);
-.
. {* Is this section a member of a group? *}
. bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
.
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 977af6f..8fd73db 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,14 @@
2005-11-24 Alan Modra <amodra@bigpond.net.au>
+ * ldlang.c (lang_output_section_find_by_flags): Add match_type param.
+ Run two passes, first using match_type, second without.
+ * ldlang.h (lang_match_sec_type_func): New typedef.
+ (lang_output_section_find_by_flags): Update prototype.
+ bfd_match_sections_by_type and lang_output_section_find_by_flags.
+ * emultempl/pe.em (place_orphan): Likewise.
+
+2005-11-24 Alan Modra <amodra@bigpond.net.au>
+
* ldlang.c (lang_insert_orphan): Skip first assignment to dot
in script when looking for place to insert orphan statements.
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index d7d2f0e..55e1663 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1362,9 +1362,9 @@ gld${EMULATION_NAME}_place_orphan (asection *s)
if (os != NULL
&& (os->bfd_section == NULL
|| os->bfd_section->flags == 0
- || (bfd_match_sections_by_type (output_bfd,
- os->bfd_section,
- s->owner, s)
+ || (_bfd_elf_match_sections_by_type (output_bfd,
+ os->bfd_section,
+ s->owner, s)
&& ((s->flags ^ os->bfd_section->flags)
& (SEC_LOAD | SEC_ALLOC)) == 0)))
{
@@ -1443,7 +1443,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s)
}
after = place->os;
if (after == NULL)
- after = lang_output_section_find_by_flags (s, &place->os);
+ after = lang_output_section_find_by_flags
+ (s, &place->os, _bfd_elf_match_sections_by_type);
if (after == NULL)
/* *ABS* is always the first output section statement. */
after = &lang_output_section_statement.head->output_section_statement;
diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em
index bcd7e32..5afa8da 100644
--- a/ld/emultempl/pe.em
+++ b/ld/emultempl/pe.em
@@ -1621,7 +1621,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s)
place->os = lang_output_section_find (place->name);
after = place->os;
if (after == NULL)
- after = lang_output_section_find_by_flags (s, &place->os);
+ after = lang_output_section_find_by_flags (s, &place->os, NULL);
if (after == NULL)
/* *ABS* is always the first output section statement. */
after = (&lang_output_section_statement.head
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 119fb7a..0e72ab8 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -1147,7 +1147,8 @@ lang_output_section_statement_lookup (const char *const name)
lang_output_section_statement_type *
lang_output_section_find_by_flags (const asection *sec,
- lang_output_section_statement_type **exact)
+ lang_output_section_statement_type **exact,
+ lang_match_sec_type_func match_type)
{
lang_output_section_statement_type *first, *look, *found;
flagword flags;
@@ -1165,9 +1166,8 @@ lang_output_section_find_by_flags (const asection *sec,
if (look->bfd_section != NULL)
{
flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
continue;
}
flags ^= sec->flags;
@@ -1177,7 +1177,8 @@ lang_output_section_find_by_flags (const asection *sec,
}
if (found != NULL)
{
- *exact = found;
+ if (exact != NULL)
+ *exact = found;
return found;
}
@@ -1190,9 +1191,8 @@ lang_output_section_find_by_flags (const asection *sec,
if (look->bfd_section != NULL)
{
flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
continue;
}
flags ^= sec->flags;
@@ -1200,10 +1200,8 @@ lang_output_section_find_by_flags (const asection *sec,
| SEC_CODE | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
found = look;
}
- return found;
}
-
- if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
+ else if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
{
/* .rodata can go after .text, .sdata2 after .rodata. */
for (look = first; look; look = look->next)
@@ -1212,9 +1210,8 @@ lang_output_section_find_by_flags (const asection *sec,
if (look->bfd_section != NULL)
{
flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
continue;
}
flags ^= sec->flags;
@@ -1223,10 +1220,8 @@ lang_output_section_find_by_flags (const asection *sec,
&& !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
found = look;
}
- return found;
}
-
- if (sec->flags & SEC_SMALL_DATA)
+ else if (sec->flags & SEC_SMALL_DATA)
{
/* .sdata goes after .data, .sbss after .sdata. */
for (look = first; look; look = look->next)
@@ -1235,9 +1230,8 @@ lang_output_section_find_by_flags (const asection *sec,
if (look->bfd_section != NULL)
{
flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
continue;
}
flags ^= sec->flags;
@@ -1247,10 +1241,8 @@ lang_output_section_find_by_flags (const asection *sec,
&& !(sec->flags & SEC_HAS_CONTENTS)))
found = look;
}
- return found;
}
-
- if (sec->flags & SEC_HAS_CONTENTS)
+ else if (sec->flags & SEC_HAS_CONTENTS)
{
/* .data goes after .rodata. */
for (look = first; look; look = look->next)
@@ -1259,9 +1251,8 @@ lang_output_section_find_by_flags (const asection *sec,
if (look->bfd_section != NULL)
{
flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
continue;
}
flags ^= sec->flags;
@@ -1269,27 +1260,30 @@ lang_output_section_find_by_flags (const asection *sec,
| SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
found = look;
}
- return found;
}
-
- /* .bss goes last. */
- for (look = first; look; look = look->next)
+ else
{
- flags = look->flags;
- if (look->bfd_section != NULL)
+ /* .bss goes last. */
+ for (look = first; look; look = look->next)
{
- flags = look->bfd_section->flags;
- if (!bfd_match_sections_by_type (output_bfd,
- look->bfd_section,
- sec->owner, sec))
- continue;
+ flags = look->flags;
+ if (look->bfd_section != NULL)
+ {
+ flags = look->bfd_section->flags;
+ if (match_type && !match_type (output_bfd, look->bfd_section,
+ sec->owner, sec))
+ continue;
+ }
+ flags ^= sec->flags;
+ if (!(flags & SEC_ALLOC))
+ found = look;
}
- flags ^= sec->flags;
- if (!(flags & SEC_ALLOC))
- found = look;
}
- return found;
+ if (found || !match_type)
+ return found;
+
+ return lang_output_section_find_by_flags (sec, NULL, NULL);
}
/* Find the last output section before given output statement.
diff --git a/ld/ldlang.h b/ld/ldlang.h
index 1613541..cf5b01f 100644
--- a/ld/ldlang.h
+++ b/ld/ldlang.h
@@ -304,6 +304,9 @@ typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
callback_t callback,
void *data);
+typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
+ bfd *, const asection *);
+
struct lang_wild_statement_struct
{
lang_statement_header_type header;
@@ -521,7 +524,8 @@ extern void ldlang_add_file
extern lang_output_section_statement_type *lang_output_section_find
(const char * const);
extern lang_output_section_statement_type *lang_output_section_find_by_flags
- (const asection *, lang_output_section_statement_type **exact);
+ (const asection *, lang_output_section_statement_type **,
+ lang_match_sec_type_func);
extern lang_output_section_statement_type *lang_insert_orphan
(asection *, const char *, lang_output_section_statement_type *,
struct orphan_save *, etree_type *, lang_statement_list_type *);