/* These are the only relocation types we care about. */
if ( r_type != R_ARM_PC24
+#ifndef OLD_ARM_ABI
+ && r_type != R_ARM_CALL
+ && r_type != R_ARM_JUMP24
+#endif
&& r_type != R_ARM_THM_PC22)
continue;
switch (r_type)
{
case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
+#endif
/* This one is a call from arm code. We need to look up
the target of the call. If it is a thumb target, we
insert glue. */
case R_ARM_ABS32:
case R_ARM_REL32:
#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
case R_ARM_XPC25:
case R_ARM_PREL31:
#endif
|| ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
|| h->root.type != bfd_link_hash_undefweak)
&& r_type != R_ARM_PC24
+#ifndef OLD_ARM_ABI
+ && r_type != R_ARM_CALL
+ && r_type != R_ARM_JUMP24
+#endif
&& r_type != R_ARM_PLT32)
{
Elf_Internal_Rela outrel;
{
#ifndef OLD_ARM_ABI
case R_ARM_XPC25: /* Arm BLX instruction. */
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
#endif
case R_ARM_PC24: /* Arm B/BL instruction */
case R_ARM_PLT32:
break;
case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
+#endif
addend <<= howto->size;
addend += increment;
switch (r_type)
{
case R_ARM_PC24:
+#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
+#endif
case R_ARM_ABS32:
case R_ARM_THM_PC22:
case R_ARM_PLT32:
if ((! h ||
h->root.type != bfd_link_hash_undefined)
&& (!((*info->callbacks->reloc_overflow)
- (info, name, howto->name, (bfd_vma) 0,
- input_bfd, input_section, rel->r_offset))))
+ (info, (h ? &h->root : NULL), name, howto->name,
+ (bfd_vma) 0, input_bfd, input_section,
+ rel->r_offset))))
return FALSE;
break;
if (EF_ARM_EABI_VERSION (in_flags) != EF_ARM_EABI_VERSION (out_flags))
{
_bfd_error_handler
- (_("ERROR: %B is compiled for EABI version %d, whereas %B is compiled for version %d"),
+ (_("ERROR: Source object %B has EABI version %d, but target %B has EABI version %d"),
ibfd, obfd,
(in_flags & EF_ARM_EABIMASK) >> 24,
(out_flags & EF_ARM_EABIMASK) >> 24);
case R_ARM_PC24:
case R_ARM_PLT32:
#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
r_symndx = ELF32_R_SYM (rel->r_info);
case R_ARM_PC24:
case R_ARM_PLT32:
#ifndef OLD_ARM_ABI
+ case R_ARM_CALL:
+ case R_ARM_JUMP24:
case R_ARM_PREL31:
#endif
if (h != NULL)
sure yet, because something later might force the
symbol local. */
if (r_type == R_ARM_PC24
+#ifndef OLD_ARM_ABI
+ || r_type == R_ARM_CALL
+ || r_type == R_ARM_JUMP24
+#endif
|| r_type == R_ARM_PLT32)
h->needs_plt = 1;
&& ((r_type != R_ARM_PC24
&& r_type != R_ARM_PLT32
#ifndef OLD_ARM_ABI
+ && r_type != R_ARM_CALL
+ && r_type != R_ARM_JUMP24
&& r_type != R_ARM_PREL31
#endif
&& r_type != R_ARM_REL32)
}
else
/* It's possible that we incorrectly decided a .plt reloc was
- needed for an R_ARM_PC24 reloc to a non-function sym in
- check_relocs. We can't decide accurately between function and
- non-function syms in check-relocs; Objects loaded later in
+ needed for an R_ARM_PC24 or similar reloc to a non-function sym
+ in check_relocs. We can't decide accurately between function
+ and non-function syms in check-relocs; Objects loaded later in
the link may change h->type. So fix it now. */
h->plt.offset = (bfd_vma) -1;
splt->contents + h->plt.offset + 4 * i);
/* Fill in the entry in the .rel.plt section. */
- rel.r_offset = (splt->output_offset
+ rel.r_offset = (splt->output_section->vma
+ + splt->output_offset
+ h->plt.offset + 4 * (i - 1));
rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT);
}
case DT_SYMTAB:
name = ".dynsym";
goto get_vma_if_bpabi;
-
+ case DT_VERSYM:
+ name = ".gnu.version";
+ goto get_vma_if_bpabi;
+ case DT_VERDEF:
+ name = ".gnu.version_d";
+ goto get_vma_if_bpabi;
+ case DT_VERNEED:
+ name = ".gnu.version_r";
+ goto get_vma_if_bpabi;
+
case DT_PLTGOT:
name = ".got";
goto get_vma;