PARAMS ((struct bfd_link_info *, const char *, bfd *, bfd *, asection *,
bfd_byte *, asection *, bfd_vma, bfd_signed_vma, bfd_vma));
-#define INTERWORK_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_INTERWORK)
+#define INTERWORK_FLAG(abfd) (elf_elfheader (abfd)->e_flags & EF_ARM_INTERWORK)
/* The linker script knows the section names for placement.
The entry_names are used to do simple name mangling on the stubs.
upper_insn = (upper_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 12) & 0x7ff);
lower_insn = (lower_insn & ~(bfd_vma) 0x7ff) | ((relocation >> 1) & 0x7ff);
+ if (r_type == R_ARM_THM_XPC22
+ && ((lower_insn & 0x1800) == 0x0800))
+ /* Remove bit zero of the adjusted offset. Bit zero can only be
+ set if the upper insn is at a half-word boundary, since the
+ destination address, an ARM instruction, must always be on a
+ word boundary. The semantics of the BLX (1) instruction, however,
+ are that bit zero in the offset must always be zero, and the
+ corresponding bit one in the target address will be set from bit
+ one of the source address. */
+ lower_insn &= ~1;
+
/* Put the relocated value back in the object file: */
bfd_put_16 (input_bfd, upper_insn, hit_data);
bfd_put_16 (input_bfd, lower_insn, hit_data + 2);
{
if (EF_ARM_EABI_VERSION (flags) == EF_ARM_EABI_UNKNOWN)
{
- if (flags & EF_INTERWORK)
+ if (flags & EF_ARM_INTERWORK)
_bfd_error_handler (_("\
Warning: Not setting interwork flag of %s since it has already been specified as non-interworking"),
bfd_get_filename (abfd));
&& in_flags != out_flags)
{
/* Cannot mix APCS26 and APCS32 code. */
- if ((in_flags & EF_APCS_26) != (out_flags & EF_APCS_26))
+ if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
return false;
/* Cannot mix float APCS and non-float APCS code. */
- if ((in_flags & EF_APCS_FLOAT) != (out_flags & EF_APCS_FLOAT))
+ if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
return false;
/* If the src and dest have different interworking flags
then turn off the interworking bit. */
- if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
+ if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
{
- if (out_flags & EF_INTERWORK)
+ if (out_flags & EF_ARM_INTERWORK)
_bfd_error_handler (_("\
Warning: Clearing the interwork flag in %s because non-interworking code in %s has been linked with it"),
bfd_get_filename (obfd), bfd_get_filename (ibfd));
- in_flags &= ~EF_INTERWORK;
+ in_flags &= ~EF_ARM_INTERWORK;
}
/* Likewise for PIC, though don't warn for this case. */
- if ((in_flags & EF_PIC) != (out_flags & EF_PIC))
- in_flags &= ~EF_PIC;
+ if ((in_flags & EF_ARM_PIC) != (out_flags & EF_ARM_PIC))
+ in_flags &= ~EF_ARM_PIC;
}
elf_elfheader (obfd)->e_flags = in_flags;
/* Not sure what needs to be checked for EABI versions >= 1. */
if (EF_ARM_EABI_VERSION (in_flags) == EF_ARM_EABI_UNKNOWN)
{
- if ((in_flags & EF_APCS_26) != (out_flags & EF_APCS_26))
+ if ((in_flags & EF_ARM_APCS_26) != (out_flags & EF_ARM_APCS_26))
{
_bfd_error_handler (_("\
Error: %s compiled for APCS-%d, whereas %s is compiled for APCS-%d"),
bfd_get_filename (ibfd),
- in_flags & EF_APCS_26 ? 26 : 32,
+ in_flags & EF_ARM_APCS_26 ? 26 : 32,
bfd_get_filename (obfd),
- out_flags & EF_APCS_26 ? 26 : 32);
+ out_flags & EF_ARM_APCS_26 ? 26 : 32);
flags_compatible = false;
}
- if ((in_flags & EF_APCS_FLOAT) != (out_flags & EF_APCS_FLOAT))
+ if ((in_flags & EF_ARM_APCS_FLOAT) != (out_flags & EF_ARM_APCS_FLOAT))
{
_bfd_error_handler (_("\
Error: %s passes floats in %s registers, whereas %s passes them in %s registers"),
bfd_get_filename (ibfd),
- in_flags & EF_APCS_FLOAT ? _("float") : _("integer"),
+ in_flags & EF_ARM_APCS_FLOAT ? _("float") : _("integer"),
bfd_get_filename (obfd),
- out_flags & EF_APCS_26 ? _("float") : _("integer"));
+ out_flags & EF_ARM_APCS_26 ? _("float") : _("integer"));
flags_compatible = false;
}
-#ifdef EF_SOFT_FLOAT
- if ((in_flags & EF_SOFT_FLOAT) != (out_flags & EF_SOFT_FLOAT))
+#ifdef EF_ARM_SOFT_FLOAT
+ if ((in_flags & EF_ARM_SOFT_FLOAT) != (out_flags & EF_ARM_SOFT_FLOAT))
{
_bfd_error_handler (_ ("\
Error: %s uses %s floating point, whereas %s uses %s floating point"),
bfd_get_filename (ibfd),
- in_flags & EF_SOFT_FLOAT ? _("soft") : _("hard"),
+ in_flags & EF_ARM_SOFT_FLOAT ? _("soft") : _("hard"),
bfd_get_filename (obfd),
- out_flags & EF_SOFT_FLOAT ? _("soft") : _("hard"));
+ out_flags & EF_ARM_SOFT_FLOAT ? _("soft") : _("hard"));
flags_compatible = false;
}
#endif
/* Interworking mismatch is only a warning. */
- if ((in_flags & EF_INTERWORK) != (out_flags & EF_INTERWORK))
+ if ((in_flags & EF_ARM_INTERWORK) != (out_flags & EF_ARM_INTERWORK))
_bfd_error_handler (_("\
Warning: %s %s interworking, whereas %s %s"),
bfd_get_filename (ibfd),
- in_flags & EF_INTERWORK ? _("supports") : _("does not support"),
+ in_flags & EF_ARM_INTERWORK ? _("supports") : _("does not support"),
bfd_get_filename (obfd),
- out_flags & EF_INTERWORK ? _("does not") : _("does"));
+ out_flags & EF_ARM_INTERWORK ? _("does not") : _("does"));
}
return flags_compatible;
/* The following flag bits are GNU extenstions and not part of the
official ARM ELF extended ABI. Hence they are only decoded if
the EABI version is not set. */
- if (flags & EF_INTERWORK)
+ if (flags & EF_ARM_INTERWORK)
fprintf (file, _(" [interworking enabled]"));
- if (flags & EF_APCS_26)
+ if (flags & EF_ARM_APCS_26)
fprintf (file, _(" [APCS-26]"));
else
fprintf (file, _(" [APCS-32]"));
- if (flags & EF_APCS_FLOAT)
+ if (flags & EF_ARM_APCS_FLOAT)
fprintf (file, _(" [floats passed in float registers]"));
- if (flags & EF_PIC)
+ if (flags & EF_ARM_PIC)
fprintf (file, _(" [position independent]"));
- if (flags & EF_NEW_ABI)
+ if (flags & EF_ARM_NEW_ABI)
fprintf (file, _(" [new ABI]"));
- if (flags & EF_OLD_ABI)
+ if (flags & EF_ARM_OLD_ABI)
fprintf (file, _(" [old ABI]"));
- if (flags & EF_SOFT_FLOAT)
+ if (flags & EF_ARM_SOFT_FLOAT)
fprintf (file, _(" [software FP]"));
- flags &= ~(EF_INTERWORK | EF_APCS_26 | EF_APCS_FLOAT | EF_PIC
- | EF_NEW_ABI | EF_OLD_ABI | EF_SOFT_FLOAT);
+ flags &= ~(EF_ARM_INTERWORK | EF_ARM_APCS_26 | EF_ARM_APCS_FLOAT | EF_ARM_PIC
+ | EF_ARM_NEW_ABI | EF_ARM_OLD_ABI | EF_ARM_SOFT_FLOAT);
break;
case EF_ARM_EABI_VER1:
flags &= ~ EF_ARM_SYMSARESORTED;
break;
+ case EF_ARM_EABI_VER2:
+ fprintf (file, _(" [Version2 EABI]"));
+
+ if (flags & EF_ARM_SYMSARESORTED)
+ fprintf (file, _(" [sorted symbol table]"));
+ else
+ fprintf (file, _(" [unsorted symbol table]"));
+
+ if (flags & EF_ARM_DYNSYMSUSESEGIDX)
+ fprintf (file, _(" [dynamic symbols use segment index]"));
+
+ if (flags & EF_ARM_MAPSYMSFIRST)
+ fprintf (file, _(" [mapping symbols precede others]"));
+
+ flags &= ~(EF_ARM_SYMSARESORTED | EF_ARM_DYNSYMSUSESEGIDX
+ | EF_ARM_MAPSYMSFIRST);
+ break;
+
default:
fprintf (file, _(" <EABI version unrecognised>"));
break;
if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
filename_ptr, functionname_ptr,
- line_ptr, 0, NULL))
+ line_ptr, 0,
+ &elf_tdata (abfd)->dwarf2_find_line_info))
return true;
if (! _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset,