Line 1... |
Line 1... |
/* MIPS-specific support for 32-bit ELF
|
/* MIPS-specific support for 32-bit ELF
|
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
2003, 2004, 2005, 2007 Free Software Foundation, Inc.
|
2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
|
|
Most of the information added by Ian Lance Taylor, Cygnus Support,
|
Most of the information added by Ian Lance Taylor, Cygnus Support,
|
<ian@cygnus.com>.
|
<ian@cygnus.com>.
|
N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
|
N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
|
<mark@codesourcery.com>
|
<mark@codesourcery.com>
|
Line 769... |
Line 769... |
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 873... |
Line 897... |
FALSE, /* partial_inplace */
|
FALSE, /* partial_inplace */
|
0, /* src_mask */
|
0, /* src_mask */
|
0, /* dst_mask */
|
0, /* dst_mask */
|
FALSE); /* pcrel_offset */
|
FALSE); /* 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 */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
32, /* 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 */
|
|
|
/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
|
/* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
|
dangerous relocation. */
|
dangerous relocation. */
|
|
|
static bfd_boolean
|
static bfd_boolean
|
mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
|
mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
|
Line 947... |
Line 1003... |
|| (symbol->flags & BSF_SECTION_SYM) != 0))
|
|| (symbol->flags & BSF_SECTION_SYM) != 0))
|
{
|
{
|
if (relocatable)
|
if (relocatable)
|
{
|
{
|
/* Make up a value. */
|
/* Make up a value. */
|
*pgp = symbol->section->output_section->vma + 0x4000;
|
*pgp = symbol->section->output_section->vma /*+ 0x4000*/;
|
_bfd_set_gp_value (output_bfd, *pgp);
|
_bfd_set_gp_value (output_bfd, *pgp);
|
}
|
}
|
else if (!mips_elf_assign_gp (output_bfd, pgp))
|
else if (!mips_elf_assign_gp (output_bfd, pgp))
|
{
|
{
|
*error_message =
|
*error_message =
|
Line 1203... |
Line 1259... |
{ BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
|
{ BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
|
{ BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
|
{ BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
|
{ BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
|
{ BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
|
{ BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
|
{ BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
|
{ BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
|
{ BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
|
|
{ BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
|
{ BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
|
{ BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
|
{ BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
|
{ BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
|
{ BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
|
{ BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
|
{ BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
|
{ BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
|
{ BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
|
{ BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
|
Line 1222... |
Line 1279... |
|
|
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 1271... |
Line 1330... |
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_32_PCREL:
|
case BFD_RELOC_32_PCREL:
|
return &elf_mips_gnu_pcrel32;
|
return &elf_mips_gnu_pcrel32;
|
|
case BFD_RELOC_MIPS_COPY:
|
|
return &elf_mips_copy_howto;
|
|
case BFD_RELOC_MIPS_JUMP_SLOT:
|
|
return &elf_mips_jump_slot_howto;
|
}
|
}
|
}
|
}
|
|
|
static reloc_howto_type *
|
static reloc_howto_type *
|
bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
Line 1304... |
Line 1367... |
return &elf_mips_gnu_rel16_s2;
|
return &elf_mips_gnu_rel16_s2;
|
if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
|
if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
|
return &elf_mips_gnu_vtinherit_howto;
|
return &elf_mips_gnu_vtinherit_howto;
|
if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
|
if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
|
return &elf_mips_gnu_vtentry_howto;
|
return &elf_mips_gnu_vtentry_howto;
|
|
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 1324... |
Line 1391... |
return &elf_mips_gnu_vtentry_howto;
|
return &elf_mips_gnu_vtentry_howto;
|
case R_MIPS_GNU_REL16_S2:
|
case R_MIPS_GNU_REL16_S2:
|
return &elf_mips_gnu_rel16_s2;
|
return &elf_mips_gnu_rel16_s2;
|
case R_MIPS_PC32:
|
case R_MIPS_PC32:
|
return &elf_mips_gnu_pcrel32;
|
return &elf_mips_gnu_pcrel32;
|
|
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)
|
return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
|
return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
|
BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
|
BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
|
return &elf_mips_howto_table_rel[r_type];
|
return &elf_mips_howto_table_rel[r_type];
|
Line 1377... |
Line 1448... |
mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
|
mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
|
{
|
{
|
if (SGI_COMPAT (abfd))
|
if (SGI_COMPAT (abfd))
|
return (sym->flags & BSF_SECTION_SYM) == 0;
|
return (sym->flags & BSF_SECTION_SYM) == 0;
|
else
|
else
|
return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
|
return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
|
|| bfd_is_und_section (bfd_get_section (sym))
|
|| bfd_is_und_section (bfd_get_section (sym))
|
|| bfd_is_com_section (bfd_get_section (sym)));
|
|| bfd_is_com_section (bfd_get_section (sym)));
|
}
|
}
|
|
|
/* Set the right machine number for a MIPS ELF file. */
|
/* Set the right machine number for a MIPS ELF file. */
|
Line 1556... |
Line 1627... |
#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 1577... |
Line 1649... |
#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_grok_prstatus elf32_mips_grok_prstatus
|
#define elf_backend_grok_prstatus elf32_mips_grok_prstatus
|
#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
|
#define elf_backend_grok_psinfo elf32_mips_grok_psinfo
|
#define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
|
#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 (4 * MIPS_RESERVED_GOTNO)
|
#define elf_backend_may_use_rel_p 1
|
#define elf_backend_may_use_rel_p 1
|
#define elf_backend_may_use_rela_p 0
|
#define elf_backend_may_use_rela_p 0
|
#define elf_backend_default_use_rela_p 0
|
#define elf_backend_default_use_rela_p 0
|
#define elf_backend_sign_extend_vma TRUE
|
#define elf_backend_sign_extend_vma TRUE
|
|
#define elf_backend_plt_readonly 1
|
|
#define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
|
|
|
#define elf_backend_discard_info _bfd_mips_elf_discard_info
|
#define elf_backend_discard_info _bfd_mips_elf_discard_info
|
#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_write_section _bfd_mips_elf_write_section
|
#define elf_backend_mips_irix_compat elf32_mips_irix_compat
|
#define elf_backend_mips_irix_compat elf32_mips_irix_compat
|
#define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
|
#define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
|
#define bfd_elf32_bfd_is_local_label_name \
|
#define bfd_elf32_bfd_is_local_label_name \
|
mips_elf_is_local_label_name
|
mips_elf_is_local_label_name
|
#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
|
#define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
|
#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
|
#define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
|
#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
|
#define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
|
#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
|
#define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
|
#define bfd_elf32_bfd_get_relocated_section_contents \
|
#define bfd_elf32_bfd_get_relocated_section_contents \
|
_bfd_elf_mips_get_relocated_section_contents
|
_bfd_elf_mips_get_relocated_section_contents
|
|
#define bfd_elf32_mkobject _bfd_mips_elf_mkobject
|
#define bfd_elf32_bfd_link_hash_table_create \
|
#define bfd_elf32_bfd_link_hash_table_create \
|
_bfd_mips_elf_link_hash_table_create
|
_bfd_mips_elf_link_hash_table_create
|
#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
|
#define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
|
#define bfd_elf32_bfd_merge_private_bfd_data \
|
#define bfd_elf32_bfd_merge_private_bfd_data \
|
_bfd_mips_elf_merge_private_bfd_data
|
_bfd_mips_elf_merge_private_bfd_data
|
Line 1649... |
Line 1724... |
#define elf32_bed elf32_tradbed
|
#define elf32_bed elf32_tradbed
|
|
|
/* Include the target file again for this target. */
|
/* Include the target file again for this target. */
|
#include "elf32-target.h"
|
#include "elf32-target.h"
|
|
|
|
|
/* Specific to VxWorks. */
|
|
static reloc_howto_type mips_vxworks_copy_howto_rela =
|
|
HOWTO (R_MIPS_COPY, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
32, /* 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 */
|
|
|
|
/* Specific to VxWorks. */
|
|
static reloc_howto_type mips_vxworks_jump_slot_howto_rela =
|
|
HOWTO (R_MIPS_JUMP_SLOT, /* type */
|
|
0, /* rightshift */
|
|
2, /* size (0 = byte, 1 = short, 2 = long) */
|
|
32, /* 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 */
|
|
|
|
/* Implement elf_backend_bfd_reloc_type_lookup for VxWorks. */
|
|
|
|
static reloc_howto_type *
|
|
mips_vxworks_bfd_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
|
|
{
|
|
switch (code)
|
|
{
|
|
case BFD_RELOC_MIPS_COPY:
|
|
return &mips_vxworks_copy_howto_rela;
|
|
case BFD_RELOC_MIPS_JUMP_SLOT:
|
|
return &mips_vxworks_jump_slot_howto_rela;
|
|
default:
|
|
return bfd_elf32_bfd_reloc_type_lookup (abfd, code);
|
|
}
|
|
}
|
|
|
|
static reloc_howto_type *
|
|
mips_vxworks_bfd_reloc_name_lookup (bfd *abfd, const char *r_name)
|
|
{
|
|
if (strcasecmp (mips_vxworks_copy_howto_rela.name, r_name) == 0)
|
|
return &mips_vxworks_copy_howto_rela;
|
|
if (strcasecmp (mips_vxworks_jump_slot_howto_rela.name, r_name) == 0)
|
|
return &mips_vxworks_jump_slot_howto_rela;
|
|
|
|
return bfd_elf32_bfd_reloc_name_lookup (abfd, r_name);
|
|
}
|
|
|
|
/* Implement elf_backend_mips_rtype_to_lookup for VxWorks. */
|
|
|
|
static reloc_howto_type *
|
|
mips_vxworks_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
|
|
{
|
|
switch (r_type)
|
|
{
|
|
case R_MIPS_COPY:
|
|
return &mips_vxworks_copy_howto_rela;
|
|
case R_MIPS_JUMP_SLOT:
|
|
return &mips_vxworks_jump_slot_howto_rela;
|
|
default:
|
|
return mips_elf32_rtype_to_howto (r_type, rela_p);
|
|
}
|
|
}
|
|
|
|
/* Implement elf_backend_final_write_processing for VxWorks. */
|
/* Implement elf_backend_final_write_processing for VxWorks. */
|
|
|
static void
|
static void
|
mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
|
mips_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
|
{
|
{
|
Line 1757... |
Line 1756... |
|
|
#undef elf_backend_want_got_plt
|
#undef elf_backend_want_got_plt
|
#define elf_backend_want_got_plt 1
|
#define elf_backend_want_got_plt 1
|
#undef elf_backend_want_plt_sym
|
#undef elf_backend_want_plt_sym
|
#define elf_backend_want_plt_sym 1
|
#define elf_backend_want_plt_sym 1
|
#undef elf_backend_got_symbol_offset
|
|
#define elf_backend_got_symbol_offset 0
|
|
#undef elf_backend_want_dynbss
|
|
#define elf_backend_want_dynbss 1
|
|
#undef elf_backend_may_use_rel_p
|
#undef elf_backend_may_use_rel_p
|
#define elf_backend_may_use_rel_p 0
|
#define elf_backend_may_use_rel_p 0
|
#undef elf_backend_may_use_rela_p
|
#undef elf_backend_may_use_rela_p
|
#define elf_backend_may_use_rela_p 1
|
#define elf_backend_may_use_rela_p 1
|
#undef elf_backend_default_use_rela_p
|
#undef elf_backend_default_use_rela_p
|
#define elf_backend_default_use_rela_p 1
|
#define elf_backend_default_use_rela_p 1
|
#undef elf_backend_got_header_size
|
#undef elf_backend_got_header_size
|
#define elf_backend_got_header_size (4 * 3)
|
#define elf_backend_got_header_size (4 * 3)
|
#undef elf_backend_plt_readonly
|
#undef elf_backend_plt_sym_val
|
#define elf_backend_plt_readonly 1
|
|
|
|
#undef bfd_elf32_bfd_reloc_type_lookup
|
|
#define bfd_elf32_bfd_reloc_type_lookup \
|
|
mips_vxworks_bfd_reloc_type_lookup
|
|
#undef bfd_elf32_bfd_reloc_name_lookup
|
|
#define bfd_elf32_bfd_reloc_name_lookup \
|
|
mips_vxworks_bfd_reloc_name_lookup
|
|
#undef elf_backend_mips_rtype_to_howto
|
|
#define elf_backend_mips_rtype_to_howto \
|
|
mips_vxworks_rtype_to_howto
|
|
#undef elf_backend_adjust_dynamic_symbol
|
|
#define elf_backend_adjust_dynamic_symbol \
|
|
_bfd_mips_vxworks_adjust_dynamic_symbol
|
|
#undef elf_backend_finish_dynamic_symbol
|
#undef elf_backend_finish_dynamic_symbol
|
#define elf_backend_finish_dynamic_symbol \
|
#define elf_backend_finish_dynamic_symbol \
|
_bfd_mips_vxworks_finish_dynamic_symbol
|
_bfd_mips_vxworks_finish_dynamic_symbol
|
#undef bfd_elf32_bfd_link_hash_table_create
|
#undef bfd_elf32_bfd_link_hash_table_create
|
#define bfd_elf32_bfd_link_hash_table_create \
|
#define bfd_elf32_bfd_link_hash_table_create \
|