aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/elf-bfd.h1
-rw-r--r--bfd/elf32-mips.c1
-rw-r--r--bfd/elf64-mips.c1
-rw-r--r--bfd/elfn32-mips.c1
-rw-r--r--bfd/elfxx-mips.c21
-rw-r--r--bfd/elfxx-mips.h2
7 files changed, 34 insertions, 5 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 9b6d8088ed7..98ec7e7a70d 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,17 @@
2008-08-07 Richard Sandiford <rdsandiford@googlemail.com>
+ * elf-bfd.h (MIPS_ELF_TDATA): New elf_object_id.
+ * elf32-mips.c (bfd_elf32_mkobject): Define.
+ * elf64-mips.c (bfd_elf64_mkobject): Likewise.
+ * elfn32-mips.c (bfd_elf32_mkobject): Likewise.
+ * elfxx-mips.h (_bfd_mips_elf_mkobject): Declare.
+ * elfxx-mips.c (is_mips_elf): New macro.
+ (_bfd_mips_elf_mkobject): New function.
+ (_bfd_mips_elf_final_link): Use is_mips_elf.
+ (_bfd_mips_elf_merge_private_bfd_data): Likewise.
+
+2008-08-07 Richard Sandiford <rdsandiford@googlemail.com>
+
* elfxx-mips.c (mips_elf_record_relocs): Defer allocation of a
global GOT entry when deferring allocation of dynamic relocations.
(allocate_dynrelocs): When allocating deferred dynamic relocations,
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 2d59ea444f8..d1772557b8f 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1408,6 +1408,7 @@ enum elf_object_id
ARM_ELF_TDATA,
HPPA_ELF_TDATA,
I386_ELF_TDATA,
+ MIPS_ELF_TDATA,
PPC32_ELF_TDATA,
PPC64_ELF_TDATA,
S390_ELF_TDATA,
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index 526c222f543..e04e797c806 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -1630,6 +1630,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
#define bfd_elf32_bfd_get_relocated_section_contents \
_bfd_elf_mips_get_relocated_section_contents
+#define bfd_elf32_mkobject _bfd_mips_elf_mkobject
#define bfd_elf32_bfd_link_hash_table_create \
_bfd_mips_elf_link_hash_table_create
#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
index f79d889bb3f..61db0f8cd17 100644
--- a/bfd/elf64-mips.c
+++ b/bfd/elf64-mips.c
@@ -3210,6 +3210,7 @@ const struct elf_size_info mips_elf64_size_info =
#define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
#define bfd_elf64_bfd_get_relocated_section_contents \
_bfd_elf_mips_get_relocated_section_contents
+#define bfd_elf64_mkobject _bfd_mips_elf_mkobject
#define bfd_elf64_bfd_link_hash_table_create \
_bfd_mips_elf_link_hash_table_create
#define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
index 63734f8d5c7..4e8a8d7a58c 100644
--- a/bfd/elfn32-mips.c
+++ b/bfd/elfn32-mips.c
@@ -2458,6 +2458,7 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
#define bfd_elf32_bfd_get_relocated_section_contents \
_bfd_elf_mips_get_relocated_section_contents
+#define bfd_elf32_mkobject _bfd_mips_elf_mkobject
#define bfd_elf32_bfd_link_hash_table_create \
_bfd_mips_elf_link_hash_table_create
#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 4e1481b2b6b..5c87ecde07a 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -243,6 +243,11 @@ struct _mips_elf_section_data
#define mips_elf_section_data(sec) \
((struct _mips_elf_section_data *) elf_section_data (sec))
+#define is_mips_elf(bfd) \
+ (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
+ && elf_tdata (bfd) != NULL \
+ && elf_object_id (bfd) == MIPS_ELF_TDATA)
+
/* The ABI says that every symbol used by dynamic relocations must have
a global GOT entry. Among other things, this provides the dynamic
linker with a free, directly-indexed cache. The GOT can therefore
@@ -10640,6 +10645,15 @@ error_return:
return NULL;
}
+/* Allocate ABFD's target-dependent data. */
+
+bfd_boolean
+_bfd_mips_elf_mkobject (bfd *abfd)
+{
+ return bfd_elf_allocate_object (abfd, sizeof (struct elf_obj_tdata),
+ MIPS_ELF_TDATA);
+}
+
/* Create a MIPS ELF linker hash table. */
struct bfd_link_hash_table *
@@ -10936,9 +10950,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
input_section = p->u.indirect.section;
input_bfd = input_section->owner;
- if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
- || (get_elf_backend_data (input_bfd)
- ->elf_backend_ecoff_debug_swap) == NULL)
+ if (!is_mips_elf (input_bfd))
{
/* I don't know what a non MIPS ELF bfd would be
doing with a .mdebug section, but I don't really
@@ -11611,8 +11623,7 @@ _bfd_mips_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
return FALSE;
}
- if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
- || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ if (!is_mips_elf (ibfd) || !is_mips_elf (obfd))
return TRUE;
if (strcmp (bfd_get_target (ibfd), bfd_get_target (obfd)) != 0)
diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h
index 659c418cf4d..5b791731369 100644
--- a/bfd/elfxx-mips.h
+++ b/bfd/elfxx-mips.h
@@ -93,6 +93,8 @@ extern bfd_boolean _bfd_mips_elf_set_section_contents
extern bfd_byte *_bfd_elf_mips_get_relocated_section_contents
(bfd *, struct bfd_link_info *, struct bfd_link_order *,
bfd_byte *, bfd_boolean, asymbol **);
+extern bfd_boolean _bfd_mips_elf_mkobject
+ (bfd *);
extern struct bfd_link_hash_table *_bfd_mips_elf_link_hash_table_create
(bfd *);
extern struct bfd_link_hash_table *_bfd_mips_vxworks_link_hash_table_create