aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf32-mips.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-10-08 15:41:08 +0000
committerIan Lance Taylor <ian@airs.com>1996-10-08 15:41:08 +0000
commitfe4ff5157082ed2f95422a1414ddcc30bab8d4d2 (patch)
tree8e0d7bfd483d963f3921a7fa907568226e21b419 /bfd/elf32-mips.c
parentd0e01d94fa30a348c01e1cf155ca1827a6c017af (diff)
downloadfsf-binutils-gdb-fe4ff5157082ed2f95422a1414ddcc30bab8d4d2.zip
fsf-binutils-gdb-fe4ff5157082ed2f95422a1414ddcc30bab8d4d2.tar.gz
fsf-binutils-gdb-fe4ff5157082ed2f95422a1414ddcc30bab8d4d2.tar.bz2
* elf32-mips.c (elf_mips_isa): New static function.
(_bfd_mips_elf_merge_private_bfd_data): Don't warn about linking -mips1 and -mips2 code together, or -mips3 and -mips4 code.
Diffstat (limited to 'bfd/elf32-mips.c')
-rw-r--r--bfd/elf32-mips.c71
1 files changed, 59 insertions, 12 deletions
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index 6dc1091..1e13655 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -56,6 +56,7 @@ static boolean mips_elf_create_procedure_table
struct ecoff_debug_info *));
static int mips_elf_additional_program_headers PARAMS ((bfd *));
static boolean mips_elf_modify_segment_map PARAMS ((bfd *));
+static INLINE int elf_mips_isa PARAMS ((flagword));
static boolean mips_elf32_section_from_shdr
PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
static boolean mips_elf32_section_processing
@@ -1485,7 +1486,7 @@ _bfd_mips_elf_object_p (abfd)
{
default:
case E_MIPS_ARCH_1:
- /* Just use the default, which was set in elfcode.h. */
+ (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 3000);
break;
case E_MIPS_ARCH_2:
@@ -1648,10 +1649,8 @@ _bfd_mips_elf_copy_private_bfd_data (ibfd, obfd)
bfd *ibfd;
bfd *obfd;
{
- /* This function is selected based on the input vector. We only
- want to copy information over if the output BFD also uses Elf
- format. */
- if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+ || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
return true;
BFD_ASSERT (!elf_flags_init (obfd)
@@ -1664,6 +1663,26 @@ _bfd_mips_elf_copy_private_bfd_data (ibfd, obfd)
return true;
}
+/* Return the ISA for a MIPS e_flags value. */
+
+static INLINE int
+elf_mips_isa (flags)
+ flagword flags;
+{
+ switch (flags & EF_MIPS_ARCH)
+ {
+ case E_MIPS_ARCH_1:
+ return 1;
+ case E_MIPS_ARCH_2:
+ return 2;
+ case E_MIPS_ARCH_3:
+ return 3;
+ case E_MIPS_ARCH_4:
+ return 4;
+ }
+ return 4;
+}
+
/* Merge backend specific data from an object file to the output
object file when linking. */
@@ -1689,10 +1708,8 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
return false;
}
- /* This function is selected based on the input vector. We only
- want to copy information over if the output BFD also uses Elf
- format. */
- if (bfd_get_flavour (obfd) != bfd_target_elf_flavour)
+ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
+ || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
return true;
new_flags = elf_elfheader (ibfd)->e_flags;
@@ -1703,6 +1720,9 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
{
elf_flags_init (obfd) = true;
elf_elfheader (obfd)->e_flags = new_flags;
+ if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
+ && bfd_get_arch_info (obfd)->the_default)
+ bfd_set_arch_mach (obfd, bfd_get_arch (ibfd), bfd_get_mach (ibfd));
}
else if (((new_flags ^ old_flags) & ~EF_MIPS_NOREORDER)
== 0) /* Compatible flags are ok */
@@ -1713,6 +1733,7 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
if ((new_flags & EF_MIPS_PIC) != (old_flags & EF_MIPS_PIC))
{
new_flags &= ~EF_MIPS_PIC;
+ old_flags &= ~EF_MIPS_PIC;
(*_bfd_error_handler)
("%s: needs all files compiled with -fPIC",
bfd_get_filename (ibfd));
@@ -1721,11 +1742,32 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
if ((new_flags & EF_MIPS_CPIC) != (old_flags & EF_MIPS_CPIC))
{
new_flags &= ~EF_MIPS_CPIC;
+ old_flags &= ~EF_MIPS_CPIC;
(*_bfd_error_handler)
("%s: needs all files compiled with -mabicalls",
bfd_get_filename (ibfd));
}
+ /* Don't warn about mixing -mips1 and -mips2 code, or mixing
+ -mips3 and -mips4 code. They will normally use the same data
+ sizes and calling conventions. */
+ if ((new_flags & EF_MIPS_ARCH) != (old_flags & EF_MIPS_ARCH))
+ {
+ int new_isa, old_isa;
+
+ new_isa = elf_mips_isa (new_flags);
+ old_isa = elf_mips_isa (old_flags);
+ if ((new_isa == 1 || new_isa == 2)
+ ? (old_isa != 1 && old_isa != 2)
+ : (old_isa == 1 || old_isa == 2))
+ (*_bfd_error_handler)
+ ("%s: ISA mismatch (-mips%d) with previous modules (-mips%d)",
+ bfd_get_filename (ibfd), new_isa, old_isa);
+
+ new_flags &= ~ EF_MIPS_ARCH;
+ old_flags &= ~ EF_MIPS_ARCH;
+ }
+
/* Warn about any other mismatches */
if (new_flags != old_flags)
(*_bfd_error_handler)
@@ -4988,9 +5030,14 @@ mips_elf_check_relocs (abfd, info, sec, relocs)
else
{
sgot = bfd_get_section_by_name (dynobj, ".got");
- BFD_ASSERT (elf_section_data (sgot) != NULL);
- g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
- BFD_ASSERT (g != NULL);
+ if (sgot == NULL)
+ g = NULL;
+ else
+ {
+ BFD_ASSERT (elf_section_data (sgot) != NULL);
+ g = (struct mips_got_info *) elf_section_data (sgot)->tdata;
+ BFD_ASSERT (g != NULL);
+ }
}
sreloc = NULL;