aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorGavin Romig-Koch <gavin@redhat.com>1998-12-15 14:10:46 +0000
committerGavin Romig-Koch <gavin@redhat.com>1998-12-15 14:10:46 +0000
commit02650bd0a97e811838a207da56505e16f1209ae9 (patch)
tree398f4e5620b0cf6c712d3d061566f1e2169968f0 /bfd
parent759181e384bb9bda3b8f0219384d42866474ef49 (diff)
downloadfsf-binutils-gdb-02650bd0a97e811838a207da56505e16f1209ae9.zip
fsf-binutils-gdb-02650bd0a97e811838a207da56505e16f1209ae9.tar.gz
fsf-binutils-gdb-02650bd0a97e811838a207da56505e16f1209ae9.tar.bz2
This adds ABI flags to MIPS/ELF object files.
For bfd: * elf32-mips.c (elf_mips_abi_name): New. (_bfd_mips_elf_merge_private_bfd_data): Compare EF_MIPS_ABI flags. For gas: * config/tc-mips.c (mips_abi_string): New. (md_parse_option,md_longopts): Add mabi. (mips_elf_final_processing): Set e_flags based on mabi flag. For gcc: * config/mips/mips.h (GAS_ASM_SPEC): Pass mabi to gas. (ABI_GAS_ASM_SPEC,abi_gas_asm_spec): New. (EXTRA_SPECS): Added ABI_GAS_ASM_SPEC,abi_gas_asm_spec. For include/elf: * mips.h (EF_MIPS_ABI,E_MIPS_ABI_O32,E_MIPS_ABI_O64, E_MIPS_ABI_EABI32,E_MIPS_ABI_EABI64):
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf32-mips.c42
2 files changed, 47 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4b4fabd..7a39879 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+1998-12-15 Gavin Romig-Koch <gavin@cygnus.com>
+
+ * elf32-mips.c (elf_mips_abi_name): New.
+ (_bfd_mips_elf_merge_private_bfd_data): Compare EF_MIPS_ABI flags.
+
start-sanitize-vr4xxx
1998-12-13 Gavin Romig-Koch <gavin@cygnus.com>
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index 70d12a9..b9f90fd 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -60,6 +60,7 @@ 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 INLINE int elf_mips_mach PARAMS ((flagword));
+static INLINE char* elf_mips_abi_name PARAMS ((flagword));
static boolean mips_elf32_section_from_shdr
PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
static boolean mips_elf32_section_processing
@@ -1716,6 +1717,29 @@ elf_mips_mach (flags)
return 0;
}
+/* Return printable name for ABI from flagword. */
+
+static INLINE char*
+elf_mips_abi_name (flags)
+ flagword flags;
+{
+ switch (flags & EF_MIPS_ABI)
+ {
+ case 0:
+ return "none";
+ case E_MIPS_ABI_O32:
+ return "O32";
+ case E_MIPS_ABI_O64:
+ return "O64";
+ case E_MIPS_ABI_EABI32:
+ return "EABI32";
+ case E_MIPS_ABI_EABI64:
+ return "EABI64";
+ default:
+ return "unknown abi";
+ }
+}
+
/* A mapping from BFD reloc types to MIPS ELF reloc types. */
struct elf_reloc_map {
@@ -2388,6 +2412,24 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
old_flags &= ~ (EF_MIPS_ARCH | EF_MIPS_MACH);
}
+ /* Compare ABI's */
+ if ((new_flags & EF_MIPS_ABI) != (old_flags & EF_MIPS_ABI))
+ {
+ /* Only error if both are set (to different values). */
+ if ((new_flags & EF_MIPS_ABI)
+ && (old_flags & EF_MIPS_ABI))
+ {
+ (*_bfd_error_handler)
+ (_("%s: ABI mismatch: linking %s module with previous %s modules"),
+ bfd_get_filename (ibfd),
+ elf_mips_abi_name (new_flags),
+ elf_mips_abi_name (old_flags));
+ ok = false;
+ }
+ new_flags &= ~EF_MIPS_ABI;
+ old_flags &= ~EF_MIPS_ABI;
+ }
+
/* Warn about any other mismatches */
if (new_flags != old_flags)
{