Line 1... |
Line 1... |
/* MIPS-specific support for 64-bit ELF
|
/* MIPS-specific support for 64-bit ELF
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
2007 Free Software Foundation, Inc.
|
2006, 2007, 2008 Free Software Foundation, Inc.
|
Ian Lance Taylor, Cygnus Support
|
Ian Lance Taylor, Cygnus Support
|
Linker support added by Mark Mitchell, CodeSourcery, LLC.
|
Linker support added by Mark Mitchell, CodeSourcery, LLC.
|
<mark@codesourcery.com>
|
<mark@codesourcery.com>
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
Line 1326... |
Line 1326... |
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
|
|
/* TLS relocations. */
|
/* TLS relocations. */
|
EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
|
EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
|
EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
|
EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
|
EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
|
|
|
HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
|
|
0, /* rightshift */
|
|
4, /* size (0 = byte, 1 = short, 2 = long) */
|
|
64, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_generic_reloc, /* special_function */
|
|
"R_MIPS_TLS_DTPMOD64", /* name */
|
|
TRUE, /* partial_inplace */
|
|
MINUS_ONE, /* src_mask */
|
|
MINUS_ONE, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
HOWTO (R_MIPS_TLS_DTPREL64, /* type */
|
HOWTO (R_MIPS_TLS_DTPREL64, /* type */
|
0, /* rightshift */
|
0, /* rightshift */
|
4, /* size (0 = byte, 1 = short, 2 = long) */
|
4, /* size (0 = byte, 1 = short, 2 = long) */
|
64, /* bitsize */
|
64, /* bitsize */
|
Line 1417... |
Line 1430... |
TRUE, /* partial_inplace */
|
TRUE, /* partial_inplace */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
|
|
|
/* TLS IE dynamic relocations. */
|
EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
|
EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
|
EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
|
|
|
HOWTO (R_MIPS_TLS_TPREL64, /* type */
|
|
0, /* rightshift */
|
|
4, /* size (0 = byte, 1 = short, 2 = long) */
|
|
64, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_generic_reloc, /* special_function */
|
|
"R_MIPS_TLS_TPREL64", /* name */
|
|
TRUE, /* partial_inplace */
|
|
MINUS_ONE, /* src_mask */
|
|
MINUS_ONE, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
/* TLS thread pointer offset. */
|
/* TLS thread pointer offset. */
|
HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
|
HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
|
0, /* rightshift */
|
0, /* rightshift */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
Line 1501... |
Line 1528... |
TRUE, /* partial_inplace */
|
TRUE, /* partial_inplace */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
|
|
/* A placeholder for MIPS16 reference to global offset table. */
|
/* A MIPS16 reference to the global offset table. */
|
EMPTY_HOWTO (R_MIPS16_GOT16),
|
HOWTO (R_MIPS16_GOT16, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_got16_reloc, /* special_function */
|
|
"R_MIPS16_GOT16", /* name */
|
|
TRUE, /* partial_inplace */
|
|
0x0000ffff, /* src_mask */
|
|
0x0000ffff, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
/* A placeholder for MIPS16 16 bit call through global offset table. */
|
/* A MIPS16 call through the global offset table. */
|
EMPTY_HOWTO (R_MIPS16_CALL16),
|
HOWTO (R_MIPS16_CALL16, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_generic_reloc, /* special_function */
|
|
"R_MIPS16_CALL16", /* name */
|
|
TRUE, /* partial_inplace */
|
|
0x0000ffff, /* src_mask */
|
|
0x0000ffff, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
/* MIPS16 high 16 bits of symbol value. */
|
/* MIPS16 high 16 bits of symbol value. */
|
HOWTO (R_MIPS16_HI16, /* type */
|
HOWTO (R_MIPS16_HI16, /* type */
|
16, /* rightshift */
|
16, /* rightshift */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
Line 1573... |
Line 1624... |
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* src_mask */
|
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
FALSE), /* pcrel_offset */
|
FALSE), /* pcrel_offset */
|
|
|
/* A placeholder for MIPS16 reference to global offset table. */
|
/* A MIPS16 reference to the global offset table. */
|
EMPTY_HOWTO (R_MIPS16_GOT16),
|
HOWTO (R_MIPS16_GOT16, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_got16_reloc, /* special_function */
|
|
"R_MIPS16_GOT16", /* name */
|
|
FALSE, /* partial_inplace */
|
|
0x0000ffff, /* src_mask */
|
|
0x0000ffff, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
/* A placeholder for MIPS16 16 bit call through global offset table. */
|
/* A MIPS16 call through the global offset table. */
|
EMPTY_HOWTO (R_MIPS16_CALL16),
|
HOWTO (R_MIPS16_CALL16, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
16, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_dont, /* complain_on_overflow */
|
|
_bfd_mips_elf_generic_reloc, /* special_function */
|
|
"R_MIPS16_CALL16", /* name */
|
|
FALSE, /* partial_inplace */
|
|
0x0000ffff, /* src_mask */
|
|
0x0000ffff, /* dst_mask */
|
|
FALSE), /* pcrel_offset */
|
|
|
/* MIPS16 high 16 bits of symbol value. */
|
/* MIPS16 high 16 bits of symbol value. */
|
HOWTO (R_MIPS16_HI16, /* type */
|
HOWTO (R_MIPS16_HI16, /* type */
|
16, /* rightshift */
|
16, /* rightshift */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
Line 1674... |
Line 1749... |
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
0, /* src_mask */
|
0, /* src_mask */
|
0x0000ffff, /* dst_mask */
|
0x0000ffff, /* dst_mask */
|
TRUE); /* pcrel_offset */
|
TRUE); /* pcrel_offset */
|
|
|
|
/* Originally a VxWorks extension, but now used for other systems too. */
|
|
static reloc_howto_type elf_mips_copy_howto =
|
|
HOWTO (R_MIPS_COPY, /* type */
|
|
0, /* rightshift */
|
|
0, /* this one is variable size */
|
|
0, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_bitfield, /* complain_on_overflow */
|
|
bfd_elf_generic_reloc, /* special_function */
|
|
"R_MIPS_COPY", /* name */
|
|
FALSE, /* partial_inplace */
|
|
0x0, /* src_mask */
|
|
0x0, /* dst_mask */
|
|
FALSE); /* pcrel_offset */
|
|
|
|
/* Originally a VxWorks extension, but now used for other systems too. */
|
|
static reloc_howto_type elf_mips_jump_slot_howto =
|
|
HOWTO (R_MIPS_JUMP_SLOT, /* type */
|
|
0, /* rightshift */
|
|
4, /* size (0 = byte, 1 = short, 2 = long) */
|
|
64, /* bitsize */
|
|
FALSE, /* pc_relative */
|
|
0, /* bitpos */
|
|
complain_overflow_bitfield, /* complain_on_overflow */
|
|
bfd_elf_generic_reloc, /* special_function */
|
|
"R_MIPS_JUMP_SLOT", /* name */
|
|
FALSE, /* partial_inplace */
|
|
0x0, /* src_mask */
|
|
0x0, /* dst_mask */
|
|
FALSE); /* pcrel_offset */
|
|
|
/* Swap in a MIPS 64-bit Rel reloc. */
|
/* Swap in a MIPS 64-bit Rel reloc. */
|
|
|
static void
|
static void
|
mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
|
mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
|
Elf64_Mips_Internal_Rela *dst)
|
Elf64_Mips_Internal_Rela *dst)
|
Line 2195... |
Line 2302... |
|
|
static const struct elf_reloc_map mips16_reloc_map[] =
|
static const struct elf_reloc_map mips16_reloc_map[] =
|
{
|
{
|
{ BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
|
|
{ BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
|
|
{ BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
|
{ BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
|
};
|
};
|
|
|
/* Given a BFD reloc type, return a howto structure. */
|
/* Given a BFD reloc type, return a howto structure. */
|
Line 2231... |
Line 2340... |
{
|
{
|
case BFD_RELOC_VTABLE_INHERIT:
|
case BFD_RELOC_VTABLE_INHERIT:
|
return &elf_mips_gnu_vtinherit_howto;
|
return &elf_mips_gnu_vtinherit_howto;
|
case BFD_RELOC_VTABLE_ENTRY:
|
case BFD_RELOC_VTABLE_ENTRY:
|
return &elf_mips_gnu_vtentry_howto;
|
return &elf_mips_gnu_vtentry_howto;
|
|
case BFD_RELOC_MIPS_COPY:
|
|
return &elf_mips_copy_howto;
|
|
case BFD_RELOC_MIPS_JUMP_SLOT:
|
|
return &elf_mips_jump_slot_howto;
|
default:
|
default:
|
bfd_set_error (bfd_error_bad_value);
|
bfd_set_error (bfd_error_bad_value);
|
return NULL;
|
return NULL;
|
}
|
}
|
}
|
}
|
Line 2266... |
Line 2379... |
return &elf_mips_gnu_vtentry_howto;
|
return &elf_mips_gnu_vtentry_howto;
|
if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
|
if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
|
return &elf_mips_gnu_rel16_s2;
|
return &elf_mips_gnu_rel16_s2;
|
if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
|
if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
|
return &elf_mips_gnu_rela16_s2;
|
return &elf_mips_gnu_rela16_s2;
|
|
if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
|
|
return &elf_mips_copy_howto;
|
|
if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
|
|
return &elf_mips_jump_slot_howto;
|
|
|
return NULL;
|
return NULL;
|
}
|
}
|
|
|
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
|
/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
|
Line 2286... |
Line 2403... |
case R_MIPS_GNU_REL16_S2:
|
case R_MIPS_GNU_REL16_S2:
|
if (rela_p)
|
if (rela_p)
|
return &elf_mips_gnu_rela16_s2;
|
return &elf_mips_gnu_rela16_s2;
|
else
|
else
|
return &elf_mips_gnu_rel16_s2;
|
return &elf_mips_gnu_rel16_s2;
|
|
case R_MIPS_COPY:
|
|
return &elf_mips_copy_howto;
|
|
case R_MIPS_JUMP_SLOT:
|
|
return &elf_mips_jump_slot_howto;
|
default:
|
default:
|
if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
|
if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
|
{
|
{
|
if (rela_p)
|
if (rela_p)
|
return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
|
return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
|
Line 3105... |
Line 3226... |
#define elf_backend_create_dynamic_sections \
|
#define elf_backend_create_dynamic_sections \
|
_bfd_mips_elf_create_dynamic_sections
|
_bfd_mips_elf_create_dynamic_sections
|
#define elf_backend_check_relocs _bfd_mips_elf_check_relocs
|
#define elf_backend_check_relocs _bfd_mips_elf_check_relocs
|
#define elf_backend_merge_symbol_attribute \
|
#define elf_backend_merge_symbol_attribute \
|
_bfd_mips_elf_merge_symbol_attribute
|
_bfd_mips_elf_merge_symbol_attribute
|
|
#define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
|
#define elf_backend_adjust_dynamic_symbol \
|
#define elf_backend_adjust_dynamic_symbol \
|
_bfd_mips_elf_adjust_dynamic_symbol
|
_bfd_mips_elf_adjust_dynamic_symbol
|
#define elf_backend_always_size_sections \
|
#define elf_backend_always_size_sections \
|
_bfd_mips_elf_always_size_sections
|
_bfd_mips_elf_always_size_sections
|
#define elf_backend_size_dynamic_sections \
|
#define elf_backend_size_dynamic_sections \
|
Line 3126... |
Line 3248... |
#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
|
#define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
|
#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
|
#define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
|
#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
|
#define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
|
#define elf_backend_copy_indirect_symbol \
|
#define elf_backend_copy_indirect_symbol \
|
_bfd_mips_elf_copy_indirect_symbol
|
_bfd_mips_elf_copy_indirect_symbol
|
#define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol
|
|
#define elf_backend_ignore_discarded_relocs \
|
#define elf_backend_ignore_discarded_relocs \
|
_bfd_mips_elf_ignore_discarded_relocs
|
_bfd_mips_elf_ignore_discarded_relocs
|
#define elf_backend_mips_irix_compat elf64_mips_irix_compat
|
#define elf_backend_mips_irix_compat elf64_mips_irix_compat
|
#define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
|
#define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
|
#define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap
|
#define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap
|
Line 3144... |
Line 3265... |
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
|
/* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
|
work better/work only in RELA, so we default to this. */
|
work better/work only in RELA, so we default to this. */
|
#define elf_backend_may_use_rel_p 1
|
#define elf_backend_may_use_rel_p 1
|
#define elf_backend_may_use_rela_p 1
|
#define elf_backend_may_use_rela_p 1
|
#define elf_backend_default_use_rela_p 1
|
#define elf_backend_default_use_rela_p 1
|
|
#define elf_backend_rela_plts_and_copies_p 0
|
|
#define elf_backend_plt_readonly 1
|
|
#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
|
|
|
#define elf_backend_sign_extend_vma TRUE
|
#define elf_backend_sign_extend_vma TRUE
|
|
|
#define elf_backend_write_section _bfd_mips_elf_write_section
|
#define elf_backend_write_section _bfd_mips_elf_write_section
|
|
|
Line 3158... |
Line 3282... |
#define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
|
#define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
|
#define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook
|
#define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook
|
#define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
|
#define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
|
#define bfd_elf64_bfd_get_relocated_section_contents \
|
#define bfd_elf64_bfd_get_relocated_section_contents \
|
_bfd_elf_mips_get_relocated_section_contents
|
_bfd_elf_mips_get_relocated_section_contents
|
|
#define bfd_elf64_mkobject _bfd_mips_elf_mkobject
|
#define bfd_elf64_bfd_link_hash_table_create \
|
#define bfd_elf64_bfd_link_hash_table_create \
|
_bfd_mips_elf_link_hash_table_create
|
_bfd_mips_elf_link_hash_table_create
|
#define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
|
#define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
|
#define bfd_elf64_bfd_merge_private_bfd_data \
|
#define bfd_elf64_bfd_merge_private_bfd_data \
|
_bfd_mips_elf_merge_private_bfd_data
|
_bfd_mips_elf_merge_private_bfd_data
|