Fix formatting in elf32-arm.c

This commit is contained in:
Nick Clifton
2021-05-25 11:13:35 +01:00
parent bc30a119f3
commit cc850f7472
2 changed files with 203 additions and 183 deletions

View File

@ -1,3 +1,7 @@
2021-05-25 Nick Clifton <nickc@redhat.com>
* elf32-arm.c: Fix formatting.
2021-05-25 Alan Modra <amodra@gmail.com> 2021-05-25 Alan Modra <amodra@gmail.com>
* elf-attrs.c (elf_attr_strdup): New function. * elf-attrs.c (elf_attr_strdup): New function.

View File

@ -2831,29 +2831,29 @@ static const insn_sequence elf32_arm_stub_a8_veneer_blx[] =
/* One entry per long/short branch stub defined above. */ /* One entry per long/short branch stub defined above. */
#define DEF_STUBS \ #define DEF_STUBS \
DEF_STUB(long_branch_any_any) \ DEF_STUB (long_branch_any_any) \
DEF_STUB(long_branch_v4t_arm_thumb) \ DEF_STUB (long_branch_v4t_arm_thumb) \
DEF_STUB(long_branch_thumb_only) \ DEF_STUB (long_branch_thumb_only) \
DEF_STUB(long_branch_v4t_thumb_thumb) \ DEF_STUB (long_branch_v4t_thumb_thumb) \
DEF_STUB(long_branch_v4t_thumb_arm) \ DEF_STUB (long_branch_v4t_thumb_arm) \
DEF_STUB(short_branch_v4t_thumb_arm) \ DEF_STUB (short_branch_v4t_thumb_arm) \
DEF_STUB(long_branch_any_arm_pic) \ DEF_STUB (long_branch_any_arm_pic) \
DEF_STUB(long_branch_any_thumb_pic) \ DEF_STUB (long_branch_any_thumb_pic) \
DEF_STUB(long_branch_v4t_thumb_thumb_pic) \ DEF_STUB (long_branch_v4t_thumb_thumb_pic) \
DEF_STUB(long_branch_v4t_arm_thumb_pic) \ DEF_STUB (long_branch_v4t_arm_thumb_pic) \
DEF_STUB(long_branch_v4t_thumb_arm_pic) \ DEF_STUB (long_branch_v4t_thumb_arm_pic) \
DEF_STUB(long_branch_thumb_only_pic) \ DEF_STUB (long_branch_thumb_only_pic) \
DEF_STUB(long_branch_any_tls_pic) \ DEF_STUB (long_branch_any_tls_pic) \
DEF_STUB(long_branch_v4t_thumb_tls_pic) \ DEF_STUB (long_branch_v4t_thumb_tls_pic) \
DEF_STUB(long_branch_arm_nacl) \ DEF_STUB (long_branch_arm_nacl) \
DEF_STUB(long_branch_arm_nacl_pic) \ DEF_STUB (long_branch_arm_nacl_pic) \
DEF_STUB(cmse_branch_thumb_only) \ DEF_STUB (cmse_branch_thumb_only) \
DEF_STUB(a8_veneer_b_cond) \ DEF_STUB (a8_veneer_b_cond) \
DEF_STUB(a8_veneer_b) \ DEF_STUB (a8_veneer_b) \
DEF_STUB(a8_veneer_bl) \ DEF_STUB (a8_veneer_bl) \
DEF_STUB(a8_veneer_blx) \ DEF_STUB (a8_veneer_blx) \
DEF_STUB(long_branch_thumb2_only) \ DEF_STUB (long_branch_thumb2_only) \
DEF_STUB(long_branch_thumb2_only_pure) DEF_STUB (long_branch_thumb2_only_pure)
#define DEF_STUB(x) arm_stub_##x, #define DEF_STUB(x) arm_stub_##x,
enum elf32_arm_stub_type enum elf32_arm_stub_type
@ -3135,7 +3135,8 @@ struct arm_local_iplt_info
}; };
/* Structure to handle FDPIC support for local functions. */ /* Structure to handle FDPIC support for local functions. */
struct fdpic_local { struct fdpic_local
{
unsigned int funcdesc_cnt; unsigned int funcdesc_cnt;
unsigned int gotofffuncdesc_cnt; unsigned int gotofffuncdesc_cnt;
int funcdesc_offset; int funcdesc_offset;
@ -3145,6 +3146,12 @@ struct elf_arm_obj_tdata
{ {
struct elf_obj_tdata root; struct elf_obj_tdata root;
/* Zero to warn when linking objects with incompatible enum sizes. */
int no_enum_size_warning;
/* Zero to warn when linking objects with incompatible wchar_t sizes. */
int no_wchar_size_warning;
/* tls_type for each local got entry. */ /* tls_type for each local got entry. */
char *local_got_tls_type; char *local_got_tls_type;
@ -3154,12 +3161,6 @@ struct elf_arm_obj_tdata
/* Information for local symbols that need entries in .iplt. */ /* Information for local symbols that need entries in .iplt. */
struct arm_local_iplt_info **local_iplt; struct arm_local_iplt_info **local_iplt;
/* Zero to warn when linking objects with incompatible enum sizes. */
int no_enum_size_warning;
/* Zero to warn when linking objects with incompatible wchar_t sizes. */
int no_wchar_size_warning;
/* Maintains FDPIC counters and funcdesc info. */ /* Maintains FDPIC counters and funcdesc info. */
struct fdpic_local *local_fdpic_cnts; struct fdpic_local *local_fdpic_cnts;
}; };
@ -3479,21 +3480,21 @@ static void elf32_arm_add_dynreloc (bfd *output_bfd, struct bfd_link_info *info,
asection *sreloc, Elf_Internal_Rela *rel); asection *sreloc, Elf_Internal_Rela *rel);
static void static void
arm_elf_fill_funcdesc(bfd *output_bfd, arm_elf_fill_funcdesc (bfd *output_bfd,
struct bfd_link_info *info, struct bfd_link_info *info,
int *funcdesc_offset, int *funcdesc_offset,
int dynindx, int dynindx,
int offset, int offset,
bfd_vma addr, bfd_vma addr,
bfd_vma dynreloc_value, bfd_vma dynreloc_value,
bfd_vma seg) bfd_vma seg)
{ {
if ((*funcdesc_offset & 1) == 0) if ((*funcdesc_offset & 1) == 0)
{ {
struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info); struct elf32_arm_link_hash_table *globals = elf32_arm_hash_table (info);
asection *sgot = globals->root.sgot; asection *sgot = globals->root.sgot;
if (bfd_link_pic(info)) if (bfd_link_pic (info))
{ {
asection *srelgot = globals->root.srelgot; asection *srelgot = globals->root.srelgot;
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
@ -3513,12 +3514,12 @@ arm_elf_fill_funcdesc(bfd *output_bfd,
+ hgot->root.u.def.section->output_section->vma + hgot->root.u.def.section->output_section->vma
+ hgot->root.u.def.section->output_offset; + hgot->root.u.def.section->output_offset;
arm_elf_add_rofixup(output_bfd, globals->srofixup, arm_elf_add_rofixup (output_bfd, globals->srofixup,
sgot->output_section->vma + sgot->output_offset sgot->output_section->vma + sgot->output_offset
+ offset); + offset);
arm_elf_add_rofixup(output_bfd, globals->srofixup, arm_elf_add_rofixup (output_bfd, globals->srofixup,
sgot->output_section->vma + sgot->output_offset sgot->output_section->vma + sgot->output_offset
+ offset + 4); + offset + 4);
bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + offset); bfd_put_32 (output_bfd, dynreloc_value, sgot->contents + offset);
bfd_put_32 (output_bfd, got_value, sgot->contents + offset + 4); bfd_put_32 (output_bfd, got_value, sgot->contents + offset + 4);
} }
@ -3693,7 +3694,7 @@ elf32_arm_plt_needs_thumb_stub_p (struct bfd_link_info *info,
htab = elf32_arm_hash_table (info); htab = elf32_arm_hash_table (info);
return (!using_thumb_only(htab) && (arm_plt->thumb_refcount != 0 return (!using_thumb_only (htab) && (arm_plt->thumb_refcount != 0
|| (!htab->use_blx && arm_plt->maybe_thumb_refcount != 0))); || (!htab->use_blx && arm_plt->maybe_thumb_refcount != 0)));
} }
@ -3724,7 +3725,7 @@ elf32_arm_get_local_dynreloc_list (bfd *abfd, unsigned long r_symndx,
s = bfd_section_from_elf_index (abfd, isym->st_shndx); s = bfd_section_from_elf_index (abfd, isym->st_shndx);
if (s == NULL) if (s == NULL)
abort (); return NULL;
vpp = &elf_section_data (s)->local_dynrel; vpp = &elf_section_data (s)->local_dynrel;
return (struct elf_dyn_relocs **) vpp; return (struct elf_dyn_relocs **) vpp;
@ -3984,9 +3985,9 @@ elf32_arm_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
if (htab->fdpic_p) { if (htab->fdpic_p) {
htab->plt_header_size = 0; htab->plt_header_size = 0;
if (info->flags & DF_BIND_NOW) if (info->flags & DF_BIND_NOW)
htab->plt_entry_size = 4 * (ARRAY_SIZE(elf32_arm_fdpic_plt_entry) - 5); htab->plt_entry_size = 4 * (ARRAY_SIZE (elf32_arm_fdpic_plt_entry) - 5);
else else
htab->plt_entry_size = 4 * ARRAY_SIZE(elf32_arm_fdpic_plt_entry); htab->plt_entry_size = 4 * ARRAY_SIZE (elf32_arm_fdpic_plt_entry);
} }
if (!htab->root.splt if (!htab->root.splt
@ -4545,7 +4546,7 @@ elf32_arm_get_stub_entry (const asection *input_section,
/* If the input section is the CMSE stubs one and it needs a long /* If the input section is the CMSE stubs one and it needs a long
branch stub to reach it's final destination, give up with an branch stub to reach it's final destination, give up with an
error message: this is not supported. See PR ld/24709. */ error message: this is not supported. See PR ld/24709. */
if (!strncmp (input_section->name, CMSE_STUB_NAME, strlen(CMSE_STUB_NAME))) if (!strncmp (input_section->name, CMSE_STUB_NAME, strlen (CMSE_STUB_NAME)))
{ {
bfd *output_bfd = htab->obfd; bfd *output_bfd = htab->obfd;
asection *out_sec = bfd_get_section_by_name (output_bfd, CMSE_STUB_NAME); asection *out_sec = bfd_get_section_by_name (output_bfd, CMSE_STUB_NAME);
@ -4560,7 +4561,7 @@ elf32_arm_get_stub_entry (const asection *input_section,
+ h->root.root.u.def.value); + h->root.root.u.def.value);
/* Exit, rather than leave incompletely processed /* Exit, rather than leave incompletely processed
relocations. */ relocations. */
xexit(1); xexit (1);
} }
/* If this input section is part of a group of sections sharing one /* If this input section is part of a group of sections sharing one
@ -5220,8 +5221,8 @@ arm_size_one_stub (struct bfd_hash_entry *gen_entry,
/* Massage our args to the form they really have. */ /* Massage our args to the form they really have. */
stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry; stub_entry = (struct elf32_arm_stub_hash_entry *) gen_entry;
BFD_ASSERT((stub_entry->stub_type > arm_stub_none) BFD_ASSERT ((stub_entry->stub_type > arm_stub_none)
&& stub_entry->stub_type < ARRAY_SIZE(stub_definitions)); && stub_entry->stub_type < ARRAY_SIZE (stub_definitions));
size = find_stub_size_and_template (stub_entry->stub_type, &template_sequence, size = find_stub_size_and_template (stub_entry->stub_type, &template_sequence,
&template_size); &template_size);
@ -9750,7 +9751,7 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
} }
else if (htab->fdpic_p) else if (htab->fdpic_p)
{ {
const bfd_vma *plt_entry = using_thumb_only(htab) const bfd_vma *plt_entry = using_thumb_only (htab)
? elf32_arm_fdpic_thumb_plt_entry ? elf32_arm_fdpic_thumb_plt_entry
: elf32_arm_fdpic_plt_entry; : elf32_arm_fdpic_plt_entry;
@ -9765,10 +9766,10 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
/* As we are using 32 bit instructions even for the Thumb /* As we are using 32 bit instructions even for the Thumb
version, we have to use 'put_arm_insn' instead of version, we have to use 'put_arm_insn' instead of
'put_thumb_insn'. */ 'put_thumb_insn'. */
put_arm_insn(htab, output_bfd, plt_entry[0], ptr + 0); put_arm_insn (htab, output_bfd, plt_entry[0], ptr + 0);
put_arm_insn(htab, output_bfd, plt_entry[1], ptr + 4); put_arm_insn (htab, output_bfd, plt_entry[1], ptr + 4);
put_arm_insn(htab, output_bfd, plt_entry[2], ptr + 8); put_arm_insn (htab, output_bfd, plt_entry[2], ptr + 8);
put_arm_insn(htab, output_bfd, plt_entry[3], ptr + 12); put_arm_insn (htab, output_bfd, plt_entry[3], ptr + 12);
bfd_put_32 (output_bfd, got_offset, ptr + 16); bfd_put_32 (output_bfd, got_offset, ptr + 16);
if (!(info->flags & DF_BIND_NOW)) if (!(info->flags & DF_BIND_NOW))
@ -9777,10 +9778,10 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
htab->root.srelplt->reloc_count * RELOC_SIZE (htab), htab->root.srelplt->reloc_count * RELOC_SIZE (htab),
ptr + 20); ptr + 20);
put_arm_insn(htab, output_bfd, plt_entry[6], ptr + 24); put_arm_insn (htab, output_bfd, plt_entry[6], ptr + 24);
put_arm_insn(htab, output_bfd, plt_entry[7], ptr + 28); put_arm_insn (htab, output_bfd, plt_entry[7], ptr + 28);
put_arm_insn(htab, output_bfd, plt_entry[8], ptr + 32); put_arm_insn (htab, output_bfd, plt_entry[8], ptr + 32);
put_arm_insn(htab, output_bfd, plt_entry[9], ptr + 36); put_arm_insn (htab, output_bfd, plt_entry[9], ptr + 36);
} }
} }
else if (using_thumb_only (htab)) else if (using_thumb_only (htab))
@ -9928,10 +9929,10 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
instruction that could be used to prevent it; it is instruction that could be used to prevent it; it is
recommended that threaded FDPIC applications run with the recommended that threaded FDPIC applications run with the
LD_BIND_NOW environment variable set. */ LD_BIND_NOW environment variable set. */
bfd_put_32(output_bfd, plt_address + 0x18, bfd_put_32 (output_bfd, plt_address + 0x18,
sgot->contents + got_offset); sgot->contents + got_offset);
bfd_put_32(output_bfd, -1 /*TODO*/, bfd_put_32 (output_bfd, -1 /*TODO*/,
sgot->contents + got_offset + 4); sgot->contents + got_offset + 4);
} }
if (dynindx == -1) if (dynindx == -1)
@ -9944,9 +9945,9 @@ elf32_arm_populate_plt_entry (bfd *output_bfd, struct bfd_link_info *info,
lazy binding otherwise we put them in .rel.plt. For now, lazy binding otherwise we put them in .rel.plt. For now,
we don't support lazy binding so put it in .rel.got. */ we don't support lazy binding so put it in .rel.got. */
if (info->flags & DF_BIND_NOW) if (info->flags & DF_BIND_NOW)
elf32_arm_add_dynreloc(output_bfd, info, htab->root.srelgot, &rel); elf32_arm_add_dynreloc (output_bfd, info, htab->root.srelgot, &rel);
else else
elf32_arm_add_dynreloc(output_bfd, info, htab->root.srelplt, &rel); elf32_arm_add_dynreloc (output_bfd, info, htab->root.srelplt, &rel);
} }
else else
{ {
@ -10543,7 +10544,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
/* This symbol is local, or marked to become local. */ /* This symbol is local, or marked to become local. */
BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI BFD_ASSERT (r_type == R_ARM_ABS32 || r_type == R_ARM_ABS32_NOI
|| (globals->fdpic_p && !bfd_link_pic(info))); || (globals->fdpic_p && !bfd_link_pic (info)));
/* On SVR4-ish systems, the dynamic loader cannot /* On SVR4-ish systems, the dynamic loader cannot
relocate the text and data segments independently, relocate the text and data segments independently,
so the symbol does not matter. */ so the symbol does not matter. */
@ -10554,7 +10555,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
must use an R_ARM_IRELATIVE relocation to obtain the must use an R_ARM_IRELATIVE relocation to obtain the
correct run-time address. */ correct run-time address. */
outrel.r_info = ELF32_R_INFO (symbol, R_ARM_IRELATIVE); outrel.r_info = ELF32_R_INFO (symbol, R_ARM_IRELATIVE);
else if (globals->fdpic_p && !bfd_link_pic(info)) else if (globals->fdpic_p && !bfd_link_pic (info))
isrofixup = 1; isrofixup = 1;
else else
outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE); outrel.r_info = ELF32_R_INFO (symbol, R_ARM_RELATIVE);
@ -10565,7 +10566,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
} }
if (isrofixup) if (isrofixup)
arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset); arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
else else
elf32_arm_add_dynreloc (output_bfd, info, sreloc, &outrel); elf32_arm_add_dynreloc (output_bfd, info, sreloc, &outrel);
@ -11466,7 +11467,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
if (isrofixup) if (isrofixup)
arm_elf_add_rofixup (output_bfd, arm_elf_add_rofixup (output_bfd,
elf32_arm_hash_table(info)->srofixup, elf32_arm_hash_table (info)->srofixup,
sgot->output_section->vma sgot->output_section->vma
+ sgot->output_offset + off); + sgot->output_offset + off);
@ -11593,9 +11594,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
if (r_type == R_ARM_TLS_LDM32_FDPIC) if (r_type == R_ARM_TLS_LDM32_FDPIC)
{ {
bfd_put_32(output_bfd, bfd_put_32 (output_bfd,
globals->root.sgot->output_offset + off, globals->root.sgot->output_offset + off,
contents + rel->r_offset); contents + rel->r_offset);
return bfd_reloc_ok; return bfd_reloc_ok;
} }
@ -11647,6 +11648,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
else else
{ {
BFD_ASSERT (local_got_offsets != NULL); BFD_ASSERT (local_got_offsets != NULL);
off = local_got_offsets[r_symndx]; off = local_got_offsets[r_symndx];
offplt = local_tlsdesc_gotents[r_symndx]; offplt = local_tlsdesc_gotents[r_symndx];
tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx]; tls_type = elf32_arm_local_got_tls_type (input_bfd)[r_symndx];
@ -11654,7 +11656,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
/* Linker relaxations happens from one of the /* Linker relaxations happens from one of the
R_ARM_{GOTDESC,CALL,DESCSEQ} relocations to IE or LE. */ R_ARM_{GOTDESC,CALL,DESCSEQ} relocations to IE or LE. */
if (ELF32_R_TYPE(rel->r_info) != r_type) if (ELF32_R_TYPE (rel->r_info) != r_type)
tls_type = GOT_TLS_IE; tls_type = GOT_TLS_IE;
BFD_ASSERT (tls_type != GOT_UNKNOWN); BFD_ASSERT (tls_type != GOT_UNKNOWN);
@ -11809,8 +11811,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
else if (tls_type & GOT_TLS_GDESC) else if (tls_type & GOT_TLS_GDESC)
off = offplt; off = offplt;
if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL if (ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL
|| ELF32_R_TYPE(rel->r_info) == R_ARM_THM_TLS_CALL) || ELF32_R_TYPE (rel->r_info) == R_ARM_THM_TLS_CALL)
{ {
bfd_signed_vma offset; bfd_signed_vma offset;
/* TLS stubs are arm mode. The original symbol is a /* TLS stubs are arm mode. The original symbol is a
@ -11838,7 +11840,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
+ globals->root.splt->output_offset + globals->root.splt->output_offset
+ globals->tls_trampoline); + globals->tls_trampoline);
if (ELF32_R_TYPE(rel->r_info) == R_ARM_TLS_CALL) if (ELF32_R_TYPE (rel->r_info) == R_ARM_TLS_CALL)
{ {
unsigned long inst; unsigned long inst;
@ -11968,9 +11970,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{ {
/* For FDPIC relocations, resolve to the offset of the GOT /* For FDPIC relocations, resolve to the offset of the GOT
entry from the start of GOT. */ entry from the start of GOT. */
bfd_put_32(output_bfd, bfd_put_32 (output_bfd,
globals->root.sgot->output_offset + off, globals->root.sgot->output_offset + off,
contents + rel->r_offset); contents + rel->r_offset);
return bfd_reloc_ok; return bfd_reloc_ok;
} }
@ -12565,23 +12567,26 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{ {
if (h == NULL) if (h == NULL)
{ {
struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts(input_bfd); struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts (input_bfd);
int dynindx = elf_section_data (sym_sec->output_section)->dynindx; int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1; int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
bfd_vma addr = dynreloc_value - sym_sec->output_section->vma; bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
bfd_vma seg = -1; bfd_vma seg = -1;
if (bfd_link_pic(info) && dynindx == 0) if (bfd_link_pic (info) && dynindx == 0)
abort(); {
* error_message = _("no dynamic index information available");
return bfd_reloc_dangerous;
}
/* Resolve relocation. */ /* Resolve relocation. */
bfd_put_32(output_bfd, (offset + sgot->output_offset) bfd_put_32 (output_bfd, (offset + sgot->output_offset)
, contents + rel->r_offset); , contents + rel->r_offset);
/* Emit R_ARM_FUNCDESC_VALUE or two fixups on funcdesc if /* Emit R_ARM_FUNCDESC_VALUE or two fixups on funcdesc if
not done yet. */ not done yet. */
arm_elf_fill_funcdesc(output_bfd, info, arm_elf_fill_funcdesc (output_bfd, info,
&local_fdpic_cnts[r_symndx].funcdesc_offset, &local_fdpic_cnts[r_symndx].funcdesc_offset,
dynindx, offset, addr, dynreloc_value, seg); dynindx, offset, addr, dynreloc_value, seg);
} }
else else
{ {
@ -12602,21 +12607,27 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
addr = 0; addr = 0;
} }
if (bfd_link_pic(info) && dynindx == 0) if (bfd_link_pic (info) && dynindx == 0)
abort(); {
* error_message = _("no dynamic index information available");
return bfd_reloc_dangerous;
}
/* This case cannot occur since funcdesc is allocated by /* This case cannot occur since funcdesc is allocated by
the dynamic loader so we cannot resolve the relocation. */ the dynamic loader so we cannot resolve the relocation. */
if (h->dynindx != -1) if (h->dynindx != -1)
abort(); {
* error_message = _("invalid dynamic index");
return bfd_reloc_dangerous;
}
/* Resolve relocation. */ /* Resolve relocation. */
bfd_put_32(output_bfd, (offset + sgot->output_offset), bfd_put_32 (output_bfd, (offset + sgot->output_offset),
contents + rel->r_offset); contents + rel->r_offset);
/* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */ /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */
arm_elf_fill_funcdesc(output_bfd, info, arm_elf_fill_funcdesc (output_bfd, info,
&eh->fdpic_cnts.funcdesc_offset, &eh->fdpic_cnts.funcdesc_offset,
dynindx, offset, addr, dynreloc_value, seg); dynindx, offset, addr, dynreloc_value, seg);
} }
} }
*unresolved_reloc_p = false; *unresolved_reloc_p = false;
@ -12629,11 +12640,11 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
/* Resolve relocation. */ /* Resolve relocation. */
bfd_put_32(output_bfd, ((eh->fdpic_cnts.gotfuncdesc_offset & ~1) bfd_put_32 (output_bfd, ((eh->fdpic_cnts.gotfuncdesc_offset & ~1)
+ sgot->output_offset), + sgot->output_offset),
contents + rel->r_offset); contents + rel->r_offset);
/* Add funcdesc and associated R_ARM_FUNCDESC_VALUE. */ /* Add funcdesc and associated R_ARM_FUNCDESC_VALUE. */
if(h->dynindx == -1) if (h->dynindx == -1)
{ {
int dynindx; int dynindx;
int offset = eh->fdpic_cnts.funcdesc_offset & ~1; int offset = eh->fdpic_cnts.funcdesc_offset & ~1;
@ -12653,9 +12664,9 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
} }
/* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */ /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */
arm_elf_fill_funcdesc(output_bfd, info, arm_elf_fill_funcdesc (output_bfd, info,
&eh->fdpic_cnts.funcdesc_offset, &eh->fdpic_cnts.funcdesc_offset,
dynindx, offset, addr, dynreloc_value, seg); dynindx, offset, addr, dynreloc_value, seg);
} }
/* Add a dynamic relocation on GOT entry if not already done. */ /* Add a dynamic relocation on GOT entry if not already done. */
@ -12665,14 +12676,14 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{ {
outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE);
if (h->root.type == bfd_link_hash_undefweak) if (h->root.type == bfd_link_hash_undefweak)
bfd_put_32(output_bfd, 0, sgot->contents bfd_put_32 (output_bfd, 0, sgot->contents
+ (eh->fdpic_cnts.gotfuncdesc_offset & ~1)); + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
else else
bfd_put_32(output_bfd, sgot->output_section->vma bfd_put_32 (output_bfd, sgot->output_section->vma
+ sgot->output_offset + sgot->output_offset
+ (eh->fdpic_cnts.funcdesc_offset & ~1), + (eh->fdpic_cnts.funcdesc_offset & ~1),
sgot->contents sgot->contents
+ (eh->fdpic_cnts.gotfuncdesc_offset & ~1)); + (eh->fdpic_cnts.gotfuncdesc_offset & ~1));
} }
else else
{ {
@ -12682,12 +12693,12 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
+ sgot->output_offset + sgot->output_offset
+ (eh->fdpic_cnts.gotfuncdesc_offset & ~1); + (eh->fdpic_cnts.gotfuncdesc_offset & ~1);
outrel.r_addend = 0; outrel.r_addend = 0;
if (h->dynindx == -1 && !bfd_link_pic(info)) if (h->dynindx == -1 && !bfd_link_pic (info))
if (h->root.type == bfd_link_hash_undefweak) if (h->root.type == bfd_link_hash_undefweak)
arm_elf_add_rofixup(output_bfd, globals->srofixup, -1); arm_elf_add_rofixup (output_bfd, globals->srofixup, -1);
else else
arm_elf_add_rofixup(output_bfd, globals->srofixup, arm_elf_add_rofixup (output_bfd, globals->srofixup,
outrel.r_offset); outrel.r_offset);
else else
elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel); elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
eh->fdpic_cnts.gotfuncdesc_offset |= 1; eh->fdpic_cnts.gotfuncdesc_offset |= 1;
@ -12697,7 +12708,7 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{ {
/* Such relocation on static function should not have been /* Such relocation on static function should not have been
emitted by the compiler. */ emitted by the compiler. */
abort(); return bfd_reloc_notsupported;
} }
} }
*unresolved_reloc_p = false; *unresolved_reloc_p = false;
@ -12707,15 +12718,18 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
{ {
if (h == NULL) if (h == NULL)
{ {
struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts(input_bfd); struct fdpic_local *local_fdpic_cnts = elf32_arm_local_fdpic_cnts (input_bfd);
Elf_Internal_Rela outrel; Elf_Internal_Rela outrel;
int dynindx = elf_section_data (sym_sec->output_section)->dynindx; int dynindx = elf_section_data (sym_sec->output_section)->dynindx;
int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1; int offset = local_fdpic_cnts[r_symndx].funcdesc_offset & ~1;
bfd_vma addr = dynreloc_value - sym_sec->output_section->vma; bfd_vma addr = dynreloc_value - sym_sec->output_section->vma;
bfd_vma seg = -1; bfd_vma seg = -1;
if (bfd_link_pic(info) && dynindx == 0) if (bfd_link_pic (info) && dynindx == 0)
abort(); {
* error_message = _("dynamic index information not available");
return bfd_reloc_dangerous;
}
/* Replace static FUNCDESC relocation with a /* Replace static FUNCDESC relocation with a
R_ARM_RELATIVE dynamic relocation or with a rofixup for R_ARM_RELATIVE dynamic relocation or with a rofixup for
@ -12724,18 +12738,18 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
outrel.r_offset = input_section->output_section->vma outrel.r_offset = input_section->output_section->vma
+ input_section->output_offset + rel->r_offset; + input_section->output_offset + rel->r_offset;
outrel.r_addend = 0; outrel.r_addend = 0;
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel); elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
else else
arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset); arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
bfd_put_32 (input_bfd, sgot->output_section->vma bfd_put_32 (input_bfd, sgot->output_section->vma
+ sgot->output_offset + offset, hit_data); + sgot->output_offset + offset, hit_data);
/* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */ /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */
arm_elf_fill_funcdesc(output_bfd, info, arm_elf_fill_funcdesc (output_bfd, info,
&local_fdpic_cnts[r_symndx].funcdesc_offset, &local_fdpic_cnts[r_symndx].funcdesc_offset,
dynindx, offset, addr, dynreloc_value, seg); dynindx, offset, addr, dynreloc_value, seg);
} }
else else
{ {
@ -12759,8 +12773,8 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
addr = 0; addr = 0;
} }
if (bfd_link_pic(info) && dynindx == 0) if (bfd_link_pic (info) && dynindx == 0)
abort(); abort ();
/* Replace static FUNCDESC relocation with a /* Replace static FUNCDESC relocation with a
R_ARM_RELATIVE dynamic relocation. */ R_ARM_RELATIVE dynamic relocation. */
@ -12768,18 +12782,18 @@ elf32_arm_final_link_relocate (reloc_howto_type * howto,
outrel.r_offset = input_section->output_section->vma outrel.r_offset = input_section->output_section->vma
+ input_section->output_offset + rel->r_offset; + input_section->output_offset + rel->r_offset;
outrel.r_addend = 0; outrel.r_addend = 0;
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel); elf32_arm_add_dynreloc (output_bfd, info, srelgot, &outrel);
else else
arm_elf_add_rofixup(output_bfd, globals->srofixup, outrel.r_offset); arm_elf_add_rofixup (output_bfd, globals->srofixup, outrel.r_offset);
bfd_put_32 (input_bfd, sgot->output_section->vma bfd_put_32 (input_bfd, sgot->output_section->vma
+ sgot->output_offset + offset, hit_data); + sgot->output_offset + offset, hit_data);
/* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */ /* Emit R_ARM_FUNCDESC_VALUE on funcdesc if not done yet. */
arm_elf_fill_funcdesc(output_bfd, info, arm_elf_fill_funcdesc (output_bfd, info,
&eh->fdpic_cnts.funcdesc_offset, &eh->fdpic_cnts.funcdesc_offset,
dynindx, offset, addr, dynreloc_value, seg); dynindx, offset, addr, dynreloc_value, seg);
} }
else else
{ {
@ -13414,8 +13428,9 @@ add_unwind_table_edit (arm_unwind_table_edit **head,
static _arm_elf_section_data *get_arm_elf_section_data (asection *); static _arm_elf_section_data *get_arm_elf_section_data (asection *);
/* Increase the size of EXIDX_SEC by ADJUST bytes. ADJUST mau be negative. */ /* Increase the size of EXIDX_SEC by ADJUST bytes. ADJUST mau be negative. */
static void static void
adjust_exidx_size(asection *exidx_sec, int adjust) adjust_exidx_size (asection *exidx_sec, int adjust)
{ {
asection *out_sec; asection *out_sec;
@ -13425,24 +13440,25 @@ adjust_exidx_size(asection *exidx_sec, int adjust)
bfd_set_section_size (exidx_sec, exidx_sec->size + adjust); bfd_set_section_size (exidx_sec, exidx_sec->size + adjust);
out_sec = exidx_sec->output_section; out_sec = exidx_sec->output_section;
/* Adjust size of output section. */ /* Adjust size of output section. */
bfd_set_section_size (out_sec, out_sec->size +adjust); bfd_set_section_size (out_sec, out_sec->size + adjust);
} }
/* Insert an EXIDX_CANTUNWIND marker at the end of a section. */ /* Insert an EXIDX_CANTUNWIND marker at the end of a section. */
static void static void
insert_cantunwind_after(asection *text_sec, asection *exidx_sec) insert_cantunwind_after (asection *text_sec, asection *exidx_sec)
{ {
struct _arm_elf_section_data *exidx_arm_data; struct _arm_elf_section_data *exidx_arm_data;
exidx_arm_data = get_arm_elf_section_data (exidx_sec); exidx_arm_data = get_arm_elf_section_data (exidx_sec);
add_unwind_table_edit ( add_unwind_table_edit
&exidx_arm_data->u.exidx.unwind_edit_list, (&exidx_arm_data->u.exidx.unwind_edit_list,
&exidx_arm_data->u.exidx.unwind_edit_tail, &exidx_arm_data->u.exidx.unwind_edit_tail,
INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX); INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
exidx_arm_data->additional_reloc_count++; exidx_arm_data->additional_reloc_count++;
adjust_exidx_size(exidx_sec, 8); adjust_exidx_size (exidx_sec, 8);
} }
/* Scan .ARM.exidx tables, and create a list describing edits which should be /* Scan .ARM.exidx tables, and create a list describing edits which should be
@ -13532,7 +13548,7 @@ elf32_arm_fix_exidx_coverage (asection **text_section_order,
if (sec->size == 0) if (sec->size == 0)
continue; continue;
insert_cantunwind_after(last_text_sec, last_exidx_sec); insert_cantunwind_after (last_text_sec, last_exidx_sec);
last_unwind_type = 0; last_unwind_type = 0;
continue; continue;
} }
@ -13616,7 +13632,7 @@ elf32_arm_fix_exidx_coverage (asection **text_section_order,
exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail; exidx_arm_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
if (deleted_exidx_bytes > 0) if (deleted_exidx_bytes > 0)
adjust_exidx_size(exidx_sec, -deleted_exidx_bytes); adjust_exidx_size (exidx_sec, - deleted_exidx_bytes);
last_exidx_sec = exidx_sec; last_exidx_sec = exidx_sec;
last_text_sec = sec; last_text_sec = sec;
@ -13625,7 +13641,7 @@ elf32_arm_fix_exidx_coverage (asection **text_section_order,
/* Add terminating CANTUNWIND entry. */ /* Add terminating CANTUNWIND entry. */
if (!bfd_link_relocatable (info) && last_exidx_sec if (!bfd_link_relocatable (info) && last_exidx_sec
&& last_unwind_type != 0) && last_unwind_type != 0)
insert_cantunwind_after(last_text_sec, last_exidx_sec); insert_cantunwind_after (last_text_sec, last_exidx_sec);
return true; return true;
} }
@ -14821,11 +14837,11 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, struct bfd_link_info *info)
static const char *aeabi_enum_names[] = static const char *aeabi_enum_names[] =
{ "", "variable-size", "32-bit", "" }; { "", "variable-size", "32-bit", "" };
const char *in_name = const char *in_name =
in_attr[i].i < ARRAY_SIZE(aeabi_enum_names) in_attr[i].i < ARRAY_SIZE (aeabi_enum_names)
? aeabi_enum_names[in_attr[i].i] ? aeabi_enum_names[in_attr[i].i]
: "<unknown>"; : "<unknown>";
const char *out_name = const char *out_name =
out_attr[i].i < ARRAY_SIZE(aeabi_enum_names) out_attr[i].i < ARRAY_SIZE (aeabi_enum_names)
? aeabi_enum_names[out_attr[i].i] ? aeabi_enum_names[out_attr[i].i]
: "<unknown>"; : "<unknown>";
_bfd_error_handler _bfd_error_handler
@ -15261,8 +15277,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
{ {
if (!elf32_arm_allocate_local_sym_info (abfd)) if (!elf32_arm_allocate_local_sym_info (abfd))
return false; return false;
elf32_arm_local_fdpic_cnts(abfd)[r_symndx].gotofffuncdesc_cnt += 1; elf32_arm_local_fdpic_cnts (abfd) [r_symndx].gotofffuncdesc_cnt += 1;
elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_offset = -1; elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_offset = -1;
} }
else else
{ {
@ -15276,9 +15292,9 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (h == NULL) if (h == NULL)
{ {
/* Such a relocation is not supposed to be generated /* Such a relocation is not supposed to be generated
by gcc on a static function. */ by gcc on a static function. */
/* Anyway if needed it could be handled. */ /* Anyway if needed it could be handled. */
abort(); return false;
} }
else else
{ {
@ -15293,8 +15309,8 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
{ {
if (!elf32_arm_allocate_local_sym_info (abfd)) if (!elf32_arm_allocate_local_sym_info (abfd))
return false; return false;
elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_cnt += 1; elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_cnt += 1;
elf32_arm_local_fdpic_cnts(abfd)[r_symndx].funcdesc_offset = -1; elf32_arm_local_fdpic_cnts (abfd) [r_symndx].funcdesc_offset = -1;
} }
else else
{ {
@ -15591,18 +15607,18 @@ elf32_arm_check_relocs (bfd *abfd, struct bfd_link_info *info,
if (elf32_arm_howto_from_type (r_type)->pc_relative) if (elf32_arm_howto_from_type (r_type)->pc_relative)
p->pc_count += 1; p->pc_count += 1;
p->count += 1; p->count += 1;
if (h == NULL && htab->fdpic_p && !bfd_link_pic(info) if (h == NULL && htab->fdpic_p && !bfd_link_pic (info)
&& r_type != R_ARM_ABS32 && r_type != R_ARM_ABS32_NOI) { && r_type != R_ARM_ABS32 && r_type != R_ARM_ABS32_NOI)
/* Here we only support R_ARM_ABS32 and R_ARM_ABS32_NOI {
that will become rofixup. */ /* Here we only support R_ARM_ABS32 and R_ARM_ABS32_NOI
/* This is due to the fact that we suppose all will become rofixup. */ that will become rofixup. */
fprintf(stderr, "FDPIC does not yet support %d relocation to become dynamic for executable\n", r_type); /* This is due to the fact that we suppose all will become rofixup. */
_bfd_error_handler _bfd_error_handler
(_("FDPIC does not yet support %s relocation" (_("FDPIC does not yet support %s relocation"
" to become dynamic for executable"), " to become dynamic for executable"),
elf32_arm_howto_table_1[r_type].name); elf32_arm_howto_table_1[r_type].name);
abort(); abort ();
} }
} }
} }
@ -15927,7 +15943,7 @@ elf32_arm_maybe_function_sym (const asymbol *sym, asection *sec,
default: default:
return 0; return 0;
} }
if ((sym->flags & BSF_LOCAL) if ((sym->flags & BSF_LOCAL)
&& bfd_is_arm_special_symbol_name (sym->name, && bfd_is_arm_special_symbol_name (sym->name,
BFD_ARM_SPECIAL_SYM_TYPE_ANY)) BFD_ARM_SPECIAL_SYM_TYPE_ANY))
@ -16313,7 +16329,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
{ {
/* Symbol musn't be exported. */ /* Symbol musn't be exported. */
if (h->dynindx != -1) if (h->dynindx != -1)
abort(); abort ();
/* We only allocate one function descriptor with its associated /* We only allocate one function descriptor with its associated
relocation. */ relocation. */
@ -16324,7 +16340,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
eh->fdpic_cnts.funcdesc_offset = s->size; eh->fdpic_cnts.funcdesc_offset = s->size;
s->size += 8; s->size += 8;
/* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */ /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1); elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
else else
htab->srofixup->size += 8; htab->srofixup->size += 8;
@ -16351,7 +16367,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
s->size += 8; s->size += 8;
/* We will add an R_ARM_FUNCDESC_VALUE relocation or two /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
rofixups. */ rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1); elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
else else
htab->srofixup->size += 8; htab->srofixup->size += 8;
@ -16362,7 +16378,7 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
R_ARM_RELATIVE/rofixup relocation on it. */ R_ARM_RELATIVE/rofixup relocation on it. */
eh->fdpic_cnts.gotfuncdesc_offset = s->size; eh->fdpic_cnts.gotfuncdesc_offset = s->size;
s->size += 4; s->size += 4;
if (h->dynindx == -1 && !bfd_link_pic(info)) if (h->dynindx == -1 && !bfd_link_pic (info))
htab->srofixup->size += 4; htab->srofixup->size += 4;
else else
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1); elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
@ -16387,13 +16403,13 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
s->size += 8; s->size += 8;
/* We will add an R_ARM_FUNCDESC_VALUE relocation or two /* We will add an R_ARM_FUNCDESC_VALUE relocation or two
rofixups. */ rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1); elf32_arm_allocate_dynrelocs (info, htab->root.srelgot, 1);
else else
htab->srofixup->size += 8; htab->srofixup->size += 8;
} }
} }
if (h->dynindx == -1 && !bfd_link_pic(info)) if (h->dynindx == -1 && !bfd_link_pic (info))
{ {
/* For FDPIC executable we replace R_ARM_RELATIVE with a rofixup. */ /* For FDPIC executable we replace R_ARM_RELATIVE with a rofixup. */
htab->srofixup->size += 4 * eh->fdpic_cnts.funcdesc_cnt; htab->srofixup->size += 4 * eh->fdpic_cnts.funcdesc_cnt;
@ -16560,9 +16576,9 @@ allocate_dynrelocs_for_symbol (struct elf_link_hash_entry *h, void * inf)
&& SYMBOL_REFERENCES_LOCAL (info, h)) && SYMBOL_REFERENCES_LOCAL (info, h))
elf32_arm_allocate_irelocs (info, sreloc, p->count); elf32_arm_allocate_irelocs (info, sreloc, p->count);
else if (h->dynindx != -1 else if (h->dynindx != -1
&& (!bfd_link_pic(info) || !info->symbolic || !h->def_regular)) && (!bfd_link_pic (info) || !info->symbolic || !h->def_regular))
elf32_arm_allocate_dynrelocs (info, sreloc, p->count); elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
else if (htab->fdpic_p && !bfd_link_pic(info)) else if (htab->fdpic_p && !bfd_link_pic (info))
htab->srofixup->size += 4 * p->count; htab->srofixup->size += 4 * p->count;
else else
elf32_arm_allocate_dynrelocs (info, sreloc, p->count); elf32_arm_allocate_dynrelocs (info, sreloc, p->count);
@ -16659,7 +16675,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
else if (p->count != 0) else if (p->count != 0)
{ {
srel = elf_section_data (p->sec)->sreloc; srel = elf_section_data (p->sec)->sreloc;
if (htab->fdpic_p && !bfd_link_pic(info)) if (htab->fdpic_p && !bfd_link_pic (info))
htab->srofixup->size += 4 * p->count; htab->srofixup->size += 4 * p->count;
else else
elf32_arm_allocate_dynrelocs (info, srel, p->count); elf32_arm_allocate_dynrelocs (info, srel, p->count);
@ -16670,7 +16686,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
} }
local_got = elf_local_got_refcounts (ibfd); local_got = elf_local_got_refcounts (ibfd);
if (!local_got) if (local_got == NULL)
continue; continue;
symtab_hdr = & elf_symtab_hdr (ibfd); symtab_hdr = & elf_symtab_hdr (ibfd);
@ -16699,7 +16715,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
s->size += 8; s->size += 8;
/* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */ /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, srel, 1); elf32_arm_allocate_dynrelocs (info, srel, 1);
else else
htab->srofixup->size += 8; htab->srofixup->size += 8;
@ -16714,14 +16730,14 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
s->size += 8; s->size += 8;
/* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */ /* We will add an R_ARM_FUNCDESC_VALUE relocation or two rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, srel, 1); elf32_arm_allocate_dynrelocs (info, srel, 1);
else else
htab->srofixup->size += 8; htab->srofixup->size += 8;
} }
/* We will add n R_ARM_RELATIVE relocations or n rofixups. */ /* We will add n R_ARM_RELATIVE relocations or n rofixups. */
if (bfd_link_pic(info)) if (bfd_link_pic (info))
elf32_arm_allocate_dynrelocs (info, srel, local_fdpic_cnts->funcdesc_cnt); elf32_arm_allocate_dynrelocs (info, srel, local_fdpic_cnts->funcdesc_cnt);
else else
htab->srofixup->size += 4 * local_fdpic_cnts->funcdesc_cnt; htab->srofixup->size += 4 * local_fdpic_cnts->funcdesc_cnt;
@ -16868,7 +16884,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
for them, it suffices to multiply the reloc count by the jump for them, it suffices to multiply the reloc count by the jump
slot size. */ slot size. */
if (htab->root.srelplt) if (htab->root.srelplt)
htab->sgotplt_jump_table_size = elf32_arm_compute_jump_table_size(htab); htab->sgotplt_jump_table_size = elf32_arm_compute_jump_table_size (htab);
if (htab->tls_trampoline) if (htab->tls_trampoline)
{ {
@ -17469,7 +17485,7 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
+ hgot->root.u.def.section->output_section->vma + hgot->root.u.def.section->output_section->vma
+ hgot->root.u.def.section->output_offset; + hgot->root.u.def.section->output_offset;
arm_elf_add_rofixup(output_bfd, htab->srofixup, got_value); arm_elf_add_rofixup (output_bfd, htab->srofixup, got_value);
/* Make sure we allocated and generated the same number of fixups. */ /* Make sure we allocated and generated the same number of fixups. */
BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size); BFD_ASSERT (htab->srofixup->reloc_count * 4 == htab->srofixup->size);
@ -17733,7 +17749,7 @@ elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
} }
else if (htab->fdpic_p) else if (htab->fdpic_p)
{ {
enum map_symbol_type type = using_thumb_only(htab) enum map_symbol_type type = using_thumb_only (htab)
? ARM_MAP_THUMB ? ARM_MAP_THUMB
: ARM_MAP_ARM; : ARM_MAP_ARM;
@ -17744,7 +17760,7 @@ elf32_arm_output_plt_map_1 (output_arch_syminfo *osi,
return false; return false;
if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16)) if (!elf32_arm_output_map_sym (osi, ARM_MAP_DATA, addr + 16))
return false; return false;
if (htab->plt_entry_size == 4 * ARRAY_SIZE(elf32_arm_fdpic_plt_entry)) if (htab->plt_entry_size == 4 * ARRAY_SIZE (elf32_arm_fdpic_plt_entry))
if (!elf32_arm_output_map_sym (osi, type, addr + 24)) if (!elf32_arm_output_map_sym (osi, type, addr + 24))
return false; return false;
} }
@ -19796,7 +19812,7 @@ elf32_arm_plt_size (const bfd *abfd, const bfd_byte *start, bfd_vma offset)
/* Respect Thumb stub if necessary. */ /* Respect Thumb stub if necessary. */
if (read_code16 (abfd, addr) == elf32_arm_plt_thumb_stub[0]) if (read_code16 (abfd, addr) == elf32_arm_plt_thumb_stub[0])
{ {
plt_size += 2 * ARRAY_SIZE(elf32_arm_plt_thumb_stub); plt_size += 2 * ARRAY_SIZE (elf32_arm_plt_thumb_stub);
} }
/* Strip immediate from first add. */ /* Strip immediate from first add. */
@ -19866,9 +19882,9 @@ elf32_arm_get_synthetic_symtab (bfd *abfd,
data = plt->contents; data = plt->contents;
if (data == NULL) if (data == NULL)
{ {
if (!bfd_get_full_section_contents(abfd, (asection *) plt, &data) || data == NULL) if (!bfd_get_full_section_contents (abfd, (asection *) plt, &data) || data == NULL)
return -1; return -1;
bfd_cache_section_contents((asection *) plt, data); bfd_cache_section_contents ((asection *) plt, data);
} }
count = relplt->size / hdr->sh_entsize; count = relplt->size / hdr->sh_entsize;