Expand GOT slots based on whether we are emitting C64 relocations.
This patch only has infrastructure changes, i.e. it only makes
got_header_size a function and adjusts across architectures.
bfd/ChangeLog:
2020-10-20 Siddhesh Poyarekar <siddesh.poyarekar@arm.com>
Tamar Christina <tamar.christina@arm.com>
* elf-bfd.h (elf_backend_data): Make got_header_size a
function. Add callbacks to all targets that use it.
* elflink.c (_bfd_elf_create_got_section,
bfd_elf_gc_common_finalize_got_offsets,
_bfd_elf_common_section): Adjust got_header_size usage.
+2020-10-20 Siddhesh Poyarekar <siddesh.poyarekar@arm.com>
+ Tamar Christina <tamar.christina@arm.com>
+
+ * elf-bfd.h (elf_backend_data): Make got_header_size a
+ function. Add callbacks to all targets that use it.
+ * elflink.c (_bfd_elf_create_got_section,
+ bfd_elf_gc_common_finalize_got_offsets,
+ _bfd_elf_common_section): Adjust got_header_size usage.
+
2020-10-20 Siddhesh Poyarekar <siddesh.poyarekar@arm.com>
* elfxx-aarch64.c (reencode_ldst_pos_imm): Support loads and
/* An array of target specific special sections. */
const struct bfd_elf_special_section *special_sections;
- /* The size in bytes of the header for the GOT. This includes the
- so-called reserved entries on some systems. */
- bfd_vma got_header_size;
+ /* The size in bytes of the header for the GOT using configuration in INFO.
+ This includes the so-called reserved entries on some systems. */
+ bfd_vma (*got_header_size) (struct bfd_link_info * info);
/* The size of the GOT entry for the symbol pointed to by H if non-NULL,
otherwise by the local symbol with index SYMNDX in IBFD. */
extern asection *_bfd_elf_common_section
(asection *);
+extern bfd_vma _bfd_elf_default_got_header_size
+(struct bfd_link_info *);
+
extern bfd_vma _bfd_elf_default_got_elt_size
(bfd *, struct bfd_link_info *, struct elf_link_hash_entry *, bfd *,
unsigned long);
return FALSE;
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
return TRUE;
}
MN10300_ELF_DATA);
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+_bfd_mn10300_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define bfd_elf32_mkobject mn10300_elf_mkobject
#ifndef ELF_ARCH
_bfd_mn10300_copy_indirect_symbol
#define elf_backend_reloc_type_class \
_bfd_mn10300_elf_reloc_type_class
+#define elf_backend_got_header_size \
+ _bfd_mn10300_elf_got_header_size
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
#define elf_backend_dtrel_excludes_plt 1
#include "elf32-target.h"
|| htab->target_os != is_vxworks
|| elf_vxworks_add_dynamic_entries (output_bfd, info)));
}
+
+/* Determine the size of the header of for the GOT section. */
+
+bfd_vma
+elf_vxworks_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4 * 3;
+}
bfd_boolean elf_vxworks_finish_dynamic_entry (bfd *, Elf_Internal_Dyn *);
bfd_boolean _bfd_elf_maybe_vxworks_add_dynamic_tags
(bfd *, struct bfd_link_info *, bfd_boolean);
+bfd_vma elf_vxworks_got_header_size (struct bfd_link_info* info);
#define elf_backend_size_info arc_elf32_size_info
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_arc_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
/* GDB expects general purpose registers to be in section .reg. However Linux
kernel doesn't create this section and instead writes registers to NOTE
section. It is up to the binutils to create a pseudo-section .reg from the
#define elf_backend_finish_dynamic_sections elf_arc_finish_dynamic_sections
#define elf_backend_size_dynamic_sections elf_arc_size_dynamic_sections
+#define elf_backend_got_header_size elf_arc_got_header_size
#define elf_backend_can_gc_sections 1
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_rela_plts_and_copies_p 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_may_use_rel_p 0
sgot = htab->root.sgotplt;
srel = htab->root.srelplt;
- got_header_size = get_elf_backend_data (output_bfd)->got_header_size;
+ got_header_size
+ = get_elf_backend_data (output_bfd)->got_header_size (info);
plt_header_size = htab->plt_header_size;
}
BFD_ASSERT (splt != NULL && srel != NULL);
sym->flags |= BSF_KEEP;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_arm_backend_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#undef elf_backend_copy_special_section_fields
#define elf_backend_copy_special_section_fields elf32_arm_copy_special_section_fields
#define elf_backend_add_symbol_hook elf32_arm_add_symbol_hook
#define elf_backend_count_additional_relocs elf32_arm_count_additional_relocs
#define elf_backend_symbol_processing elf32_arm_backend_symbol_processing
+#define elf_backend_got_header_size elf32_arm_backend_got_header_size
#define elf_backend_can_refcount 1
#define elf_backend_can_gc_sections 1
#define elf_backend_default_use_rela_p 0
#define elf_backend_dtrel_excludes_plt 1
-#define elf_backend_got_header_size 12
#define elf_backend_extern_protected_data 1
#undef elf_backend_obj_attrs_vendor
return plt->vma + 4 * ARRAY_SIZE (elf32_arm_symbian_plt_entry) * i;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_arm_symbian_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#undef elf32_bed
#define elf32_bed elf32_arm_symbian_bed
/* There is no .got section for BPABI objects, and hence no header. */
#undef elf_backend_got_header_size
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elf32_arm_symbian_got_header_size
/* Similarly, there is no .got.plt section. */
#undef elf_backend_want_got_plt
}
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
/* This is the machine-specific part. Create and initialize section
data for the got. */
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+bfinfdpic_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
/* Set the right machine number for a Blackfin ELF file. */
return FALSE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_bfin_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
struct bfd_elf_special_section const elf32_bfin_special_sections[] =
{
{ ".l1.text", 8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf32_bfin_got_header_size
#define elf_backend_rela_normal 1
#include "elf32-target.h"
#define elf32_bed elf32_bfinfdpic_bed
#undef elf_backend_got_header_size
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size bfinfdpic_got_header_size
#undef elf_backend_relocate_section
#define elf_backend_relocate_section bfinfdpic_relocate_section
return FALSE;
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
return TRUE;
}
}
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+_bfd_cr16_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
/* Definitions for setting CR16 target vector. */
#define TARGET_LITTLE_SYM cr16_elf32_vec
#define TARGET_LITTLE_NAME "elf32-cr16"
_bfd_cr16_elf_finish_dynamic_sections
#define elf_backend_reloc_type_class _bfd_cr16_elf_reloc_type_class
+#define elf_backend_got_header_size _bfd_cr16_elf_got_header_size
#define elf_backend_want_got_plt 1
}
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_cris_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
/* The elf_backend_got_elt_size worker. For one symbol, we can have up to
two GOT entries from three types with two different sizes. We handle
it as a single entry, so we can use the regular offset-calculation
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
-#define elf_backend_got_elt_size elf_cris_got_elt_size
+#define elf_backend_got_header_size elf_cris_got_header_size
+#define elf_backend_got_elt_size elf_cris_got_elt_size
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_want_dynrelro 1
}
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
/* This is the machine-specific part. Create and initialize section
data for the got. */
return TRUE;
}
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+frv_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
#define ELF_ARCH bfd_arch_frv
#define ELF_MACHINE_CODE EM_CYGNUS_FRV
#define ELF_MAXPAGESIZE 0x1000
#define bfd_elf32_bfd_print_private_bfd_data frv_elf_print_private_bfd_data
#define elf_backend_want_got_sym 1
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size frv_elf_got_header_size
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
return type;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_hppa_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8;
+}
+
/* Misc BFD support code. */
#define bfd_elf32_bfd_is_local_label_name elf_hppa_is_local_label_name
#define bfd_elf32_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 8
+#define elf_backend_got_header_size elf32_hppa_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_i386_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define TARGET_LITTLE_SYM i386_elf32_vec
#define TARGET_LITTLE_NAME "elf32-i386"
#define ELF_ARCH bfd_arch_i386
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf_i386_got_header_size
#define elf_backend_plt_alignment 4
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_extern_protected_data 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+lm32_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
#define ELF_ARCH bfd_arch_lm32
#define ELF_TARGET_ID LM32_ELF_DATA
#define elf_backend_plt_readonly 1
#define elf_backend_want_got_plt 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size lm32_elf_got_header_size
#define elf_backend_dtrel_excludes_plt 1
#define bfd_elf32_bfd_link_hash_table_create lm32_elf_link_hash_table_create
#define elf_backend_check_relocs lm32_elf_check_relocs
default: return reloc_class_normal;
}
}
-\f
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+m32r_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define ELF_ARCH bfd_arch_m32r
#define ELF_TARGET_ID M32R_ELF_DATA
#define ELF_MACHINE_CODE EM_M32R
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size m32r_elf_got_header_size
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_may_use_rel_p 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_m68k_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define TARGET_BIG_SYM m68k_elf32_vec
#define TARGET_BIG_NAME "elf32-m68k"
#define ELF_MACHINE_CODE EM_68K
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf32_m68k_got_header_size
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+microblaze_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define TARGET_LITTLE_SYM microblaze_elf32_le_vec
#define TARGET_LITTLE_NAME "elf32-microblazeel"
#define elf_backend_can_refcount 1
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size microblaze_elf_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
/* Function to read in symbolic data. */
_bfd_mips_elf_read_ecoff_info
};
-\f
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_mips_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4 * MIPS_RESERVED_GOTNO;
+}
+
#define ELF_ARCH bfd_arch_mips
#define ELF_TARGET_ID MIPS_ELF_DATA
#define ELF_MACHINE_CODE EM_MIPS
#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
-#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
+#define elf_backend_got_header_size elf32_mips_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_may_use_rel_p 1
#define elf_backend_may_use_rela_p 0
#undef elf_backend_default_use_rela_p
#define elf_backend_default_use_rela_p 1
#undef elf_backend_got_header_size
-#define elf_backend_got_header_size (4 * 3)
+#define elf_backend_got_header_size elf_vxworks_got_header_size
#undef elf_backend_dtrel_excludes_plt
#define elf_backend_dtrel_excludes_plt 1
}
/* End TLS model conversion. */
+\f
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+nds32_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
#define ELF_ARCH bfd_arch_nds32
#define ELF_MACHINE_CODE EM_NDS32
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size nds32_elf_got_header_size
#define elf_backend_may_use_rel_p 1
#define elf_backend_default_use_rela_p 1
#define elf_backend_may_use_rela_p 1
return FALSE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+nios2_elf32_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
/* Implement elf_backend_special_sections. */
const struct bfd_elf_special_section elf32_nios2_special_sections[] =
{
#define TARGET_BIG_SYM nios2_elf32_be_vec
#define TARGET_BIG_NAME "elf32-bignios2"
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size nios2_elf32_got_header_size
#define elf_backend_default_execstack 0
#include "elf32-target.h"
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+or1k_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
#define ELF_ARCH bfd_arch_or1k
#define ELF_MACHINE_CODE EM_OR1K
#define elf_backend_plt_readonly 1
#define elf_backend_want_got_plt 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size or1k_elf_got_header_size
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_want_dynrelro 1
#undef elf_backend_plt_readonly
#define elf_backend_plt_readonly 1
#undef elf_backend_got_header_size
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf_vxworks_got_header_size
#undef elf_backend_dtrel_excludes_plt
#define elf_backend_dtrel_excludes_plt 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_s390_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#define TARGET_BIG_SYM s390_elf32_vec
#define TARGET_BIG_NAME "elf32-s390"
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf_s390_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
return s7_elf32_score_new_section_hook (abfd, sec);
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_score_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4 * SCORE_RESERVED_GOTNO;
+}
+
/* s3_s7: don't need to split. */
#define elf_backend_grok_psinfo _bfd_score_elf_grok_psinfo
#define elf_backend_can_gc_sections 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size (4 * SCORE_RESERVED_GOTNO)
+#define elf_backend_got_header_size elf32_score_got_header_size
#define elf_backend_plt_header_size 0
#define elf_backend_collect TRUE
#define elf_backend_type_change_ok TRUE
return DW_EH_PE_datarel | DW_EH_PE_sdata4;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+sh_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 12;
+}
+
#if !defined SH_TARGET_ALREADY_DEFINED
#define TARGET_BIG_SYM sh_elf32_vec
#define TARGET_BIG_NAME "elf32-sh"
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size sh_elf_got_header_size
#define elf_backend_dtrel_excludes_plt 1
#define elf_backend_linux_prpsinfo32_ugid16 TRUE
}
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_sparc_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4;
+}
+
#define TARGET_BIG_SYM sparc_elf32_vec
#define TARGET_BIG_NAME "elf32-sparc"
#define ELF_ARCH bfd_arch_sparc
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size 4
+#define elf_backend_got_header_size elf32_sparc_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#undef elf_backend_plt_readonly
#define elf_backend_plt_readonly 1
#undef elf_backend_got_header_size
-#define elf_backend_got_header_size 12
+#define elf_backend_got_header_size elf_vxworks_got_header_size
#undef elf_backend_dtrel_excludes_plt
#define elf_backend_dtrel_excludes_plt 1
#undef elf_backend_add_symbol_hook
For static executables, we don't reserve anything. */
plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
- got_section_offset = plt_index + bed->got_header_size / 4;
+ got_section_offset = plt_index + bed->got_header_size (info) / 4;
got_dp_offset = got_section_offset + htab->params.dsbt_size;
rela_offset = plt_index * sizeof (Elf32_External_Rela);
#define elf32_bed elf32_tic6x_bed
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_tic6x_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8;
+}
+
#define TARGET_LITTLE_SYM tic6x_elf32_le_vec
#define TARGET_LITTLE_NAME "elf32-tic6x-le"
#define TARGET_BIG_SYM tic6x_elf32_be_vec
#define elf_backend_want_dynrelro 1
#define elf_backend_plt_readonly 1
#define elf_backend_rela_normal 1
-#define elf_backend_got_header_size 8
+#define elf_backend_got_header_size elf32_tic6x_got_header_size
#define elf_backend_fake_sections elf32_tic6x_fake_sections
#define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
#define elf_backend_create_dynamic_sections \
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+tilegx_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4;
+}
#define ELF_ARCH bfd_arch_tilegx
#define ELF_TARGET_ID TILEGX_ELF_DATA
/* Align PLT mod 64 byte L2 line size. */
#define elf_backend_plt_alignment 6
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size 4
+#define elf_backend_got_header_size tilegx_elf_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_default_execstack 0
htab->sgot = s;
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
if (bed->want_got_plt)
{
|| htab->splt->size == 0)
&& (htab->sgot == NULL
|| (htab->sgot->size
- == get_elf_backend_data (output_bfd)->got_header_size)))
+ == get_elf_backend_data (output_bfd)->
+ got_header_size (info))))
htab->sgotplt->size = 0;
}
return count;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+tilepro_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return GOT_ENTRY_SIZE;
+}
+
#define ELF_ARCH bfd_arch_tilepro
#define ELF_TARGET_ID TILEPRO_ELF_DATA
#define ELF_MACHINE_CODE EM_TILEPRO
/* Align PLT mod 64 byte L2 line size. */
#define elf_backend_plt_alignment 6
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size GOT_ENTRY_SIZE
+#define elf_backend_got_header_size tilepro_elf_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_default_execstack 0
return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_vax_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 16;
+}
+
#define TARGET_LITTLE_SYM vax_elf32_vec
#define TARGET_LITTLE_NAME "elf32-vax"
#define ELF_MACHINE_CODE EM_VAX
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 16
+#define elf_backend_got_header_size elf_vax_got_header_size
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
return cache_ptr->howto != NULL;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_wasm32_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
#define ELF_ARCH bfd_arch_wasm32
#define ELF_TARGET_ID EM_WEBASSEMBLY
#define ELF_MACHINE_CODE EM_WEBASSEMBLY
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elf32_wasm32_got_header_size
#include "elf32-target.h"
return ok;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_xtensa_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4;
+}
+
/* The default literal sections should always be marked as "code" (i.e.,
SHF_EXECINSTR). This is particularly important for the Linux kernel
module loader so that the literals are not placed after the text. */
#define elf_backend_can_gc_sections 1
#define elf_backend_can_refcount 1
#define elf_backend_plt_readonly 1
-#define elf_backend_got_header_size 4
+#define elf_backend_got_header_size elf_xtensa_got_header_size
#define elf_backend_want_dynbss 0
#define elf_backend_want_got_plt 1
#define elf_backend_dtrel_excludes_plt 1
return reloc_class_normal;
}
}
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf64_alpha_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
\f
static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
{
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elf64_alpha_got_header_size
#define elf_backend_dtrel_excludes_plt 1
#include "elf64-target.h"
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf64_hppa_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
{
{ STRING_COMMA_LEN (".tbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_HP_TLS },
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elf64_hppa_got_header_size
#define elf_backend_type_change_ok TRUE
#define elf_backend_get_symbol_type elf64_hppa_elf_get_symbol_type
#define elf_backend_reloc_type_class elf64_hppa_reloc_type_class
(abfd, sizeof (struct elf64_ia64_vms_obj_tdata), IA64_ELF_DATA);
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf64_ia64_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
/* Size-dependent data and functions. */
static const struct elf_size_info elf64_ia64_vms_size_info = {
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
#define elf_backend_plt_alignment 5
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elf64_ia64_got_header_size
#define elf_backend_want_got_plt 1
#define elf_backend_may_use_rel_p 1
#define elf_backend_may_use_rela_p 1
}
}
}
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf64_mips_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8 * MIPS_RESERVED_GOTNO;
+}
\f
/* ECOFF swapping routines. These are used when dealing with the
.mdebug section, which is in the ECOFF debugging format. */
#define elf_backend_grok_prstatus elf64_mips_grok_prstatus
#define elf_backend_grok_psinfo elf64_mips_grok_psinfo
-#define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
+#define elf_backend_got_header_size elf64_mips_got_header_size
#define elf_backend_want_dynrelro 1
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
#define elf_backend_want_plt_sym 0
#define elf_backend_plt_alignment 3
#define elf_backend_plt_not_loaded 1
-#define elf_backend_got_header_size 8
+#define elf_backend_got_header_size ppc64_elf_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_can_gc_sections 1
#define elf_backend_can_refcount 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+bfd_vma
+ppc64_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8;
+}
+
#include "elf64-target.h"
/* FreeBSD support */
(struct bfd_link_info *);
bfd_boolean ppc64_elf_build_stubs
(struct bfd_link_info *, char **);
+bfd_vma ppc64_elf_got_header_size
+ (struct struct bfd_link_info *)
\ No newline at end of file
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_s390_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 24;
+}
+
bfd_boolean
bfd_elf_s390_set_options (struct bfd_link_info *info,
struct s390_elf_params *params)
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size 24
+#define elf_backend_got_header_size elf_s390_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
}
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf64_sparc_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8;
+}
+
/* Relocations in the 64 bit SPARC ELF ABI are more complex than in
standard ELF, because R_SPARC_OLO10 has secondary addend in
ELF64_R_TYPE_DATA field. This structure is used to redirect the
#define elf_backend_want_got_plt 0
#define elf_backend_plt_readonly 0
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size 8
+#define elf_backend_got_header_size elf64_sparc_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
return TRUE;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+tilegx_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 8;
+}
#define ELF_ARCH bfd_arch_tilegx
#define ELF_TARGET_ID TILEGX_ELF_DATA
/* Align PLT mod 64 byte L2 line size. */
#define elf_backend_plt_alignment 6
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size 8
+#define elf_backend_got_header_size tilegx_elf_got_header_size
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_default_execstack 0
return _bfd_x86_elf_link_setup_gnu_properties (info, &init_table);
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf_x86_64_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return GOT_ENTRY_SIZE * 3;
+}
+
static const struct bfd_elf_special_section
elf_x86_64_special_sections[]=
{
#define elf_backend_want_got_plt 1
#define elf_backend_plt_readonly 1
#define elf_backend_want_plt_sym 0
-#define elf_backend_got_header_size (GOT_ENTRY_SIZE*3)
+#define elf_backend_got_header_size elf_x86_64_got_header_size
#define elf_backend_rela_normal 1
#define elf_backend_plt_alignment 4
#define elf_backend_extern_protected_data 1
}
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
if (bed->want_got_sym)
{
if (bed->want_got_plt)
gotoff = 0;
else
- gotoff = bed->got_header_size;
+ gotoff = bed->got_header_size (info);
/* Do the local .got entries first. */
for (i = info->input_bfds; i; i = i->link.next)
return bfd_com_section_ptr;
}
+/* Determine the size of the header of for the GOT section. */
+
+bfd_vma
+_bfd_elf_default_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
bfd_vma
_bfd_elf_default_got_elt_size (bfd *abfd,
struct bfd_link_info *info ATTRIBUTE_UNUSED,
}
}
\f
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elf32_mips_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 4 * MIPS_RESERVED_GOTNO;
+}
+
/* Depending on the target vector we generate some version of Irix
executables or "normal" MIPS ELF ABI executables. */
static irix_compat_t
elf_n32_mips_grok_freebsd_prstatus
#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
-#define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
+#define elf_backend_got_header_size elf32_mips_got_header_size
#define elf_backend_want_dynrelro 1
/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
}
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
return TRUE;
}
bfd_elfNN_swap_symbol_out (abfd, &newsym, cdst, shndx);
}
+/* Define the size of a GOT header, which is the minimum size of the GOT section
+ when one is needed. */
+
+static bfd_vma
+elfNN_aarch64_got_header_size (struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{
+ return GOT_ENTRY_SIZE * 3;
+}
+
/* We use this so we can override certain functions
(though currently we don't). */
#define elf_backend_merge_gnu_properties \
elfNN_aarch64_merge_gnu_properties
+#define elf_backend_got_header_size \
+ elfNN_aarch64_got_header_size
+
#define elf_backend_can_refcount 1
#define elf_backend_can_gc_sections 1
#define elf_backend_plt_readonly 1
#define elf_backend_default_use_rela_p 1
#define elf_backend_rela_normal 1
#define elf_backend_dtrel_excludes_plt 1
-#define elf_backend_got_header_size (GOT_ENTRY_SIZE * 3)
#define elf_backend_default_execstack 0
#define elf_backend_extern_protected_data 1
#define elf_backend_hash_symbol elf_aarch64_hash_symbol
ignore_errors (const char *fmt ATTRIBUTE_UNUSED, ...)
{
}
+
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+elfNN_ia64_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
\f
#define TARGET_LITTLE_SYM ia64_elfNN_le_vec
#define TARGET_LITTLE_NAME "elfNN-ia64-little"
#define elf_backend_can_gc_sections 1
#define elf_backend_want_plt_sym 0
#define elf_backend_plt_alignment 5
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size elfNN_ia64_got_header_size
#define elf_backend_want_got_plt 1
#define elf_backend_may_use_rel_p 1
#define elf_backend_may_use_rela_p 1
htab->sgot = s;
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
if (bed->want_got_plt)
{
|| htab->elf.splt->size == 0)
&& (htab->elf.sgot == NULL
|| (htab->elf.sgot->size
- == get_elf_backend_data (output_bfd)->got_header_size)))
+ == get_elf_backend_data (output_bfd)->
+ got_header_size (info))))
htab->elf.sgotplt->size = 0;
}
return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
}
+/* Determine the size of the header of for the GOT section. */
+
+static bfd_vma
+riscv_elf_got_header_size (struct bfd_link_info* info ATTRIBUTE_UNUSED)
+{
+ return ARCH_SIZE / 8;
+}
+
#define TARGET_LITTLE_SYM riscv_elfNN_vec
#define TARGET_LITTLE_NAME "elfNN-littleriscv"
#define elf_backend_plt_sym_val riscv_elf_plt_sym_val
#define elf_backend_grok_prstatus riscv_elf_grok_prstatus
#define elf_backend_grok_psinfo riscv_elf_grok_psinfo
+#define elf_backend_got_header_size riscv_elf_got_header_size
#define elf_backend_object_p riscv_elf_object_p
#define elf_info_to_howto_rel NULL
#define elf_info_to_howto riscv_info_to_howto_rela
#define elf_backend_plt_readonly 1
#define elf_backend_plt_alignment 4
#define elf_backend_want_plt_sym 1
-#define elf_backend_got_header_size (ARCH_SIZE / 8)
#define elf_backend_want_dynrelro 1
#define elf_backend_rela_normal 1
#define elf_backend_default_execstack 0
are reserved. */
if (htab->root.target_os != is_vxworks)
htab->plt_got_index
- += (get_elf_backend_data (dynobj)->got_header_size
+ += (get_elf_backend_data (dynobj)->got_header_size (info)
/ MIPS_ELF_GOT_SIZE (dynobj));
/* On VxWorks, also allocate room for the header's
#define elf_backend_core_find_build_id _bfd_elfNN_core_find_build_id
#endif
#ifndef elf_backend_got_header_size
-#define elf_backend_got_header_size 0
+#define elf_backend_got_header_size _bfd_elf_default_got_header_size
#endif
#ifndef elf_backend_got_elt_size
#define elf_backend_got_elt_size _bfd_elf_default_got_elt_size
htab->sgot = s;
/* The first bit of the global offset table is the header. */
- s->size += bed->got_header_size;
+ s->size += bed->got_header_size (info);
if (bed->want_got_plt)
{
|| htab->elf.splt->size == 0)
&& (htab->elf.sgot == NULL
|| (htab->elf.sgot->size
- == get_elf_backend_data (output_bfd)->got_header_size)))
+ == get_elf_backend_data (output_bfd)->
+ got_header_size (info))))
htab->elf.sgotplt->size = 0;
}