Back to index

cell-binutils  2.17cvs20070401
Classes | Defines | Functions | Variables
elfn32-mips.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "bfdlink.h"
#include "genlink.h"
#include "elf-bfd.h"
#include "elfxx-mips.h"
#include "elf/mips.h"
#include "coff/sym.h"
#include "coff/symconst.h"
#include "coff/internal.h"
#include "coff/ecoff.h"
#include "coff/mips.h"
#include "ecoffswap.h"
#include "elf32-target.h"

Go to the source code of this file.

Classes

struct  elf_reloc_map

Defines

#define ECOFF_SIGNED_32
#define ABI_N32_P(abfd)   ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
#define SGI_COMPAT(abfd)   (elf_n32_mips_irix_compat (abfd) != ict_none)
#define MIPS_RESERVED_GOTNO   (2)
#define MINUS_ONE   (((bfd_vma)0) - 1)
#define ELF_ARCH   bfd_arch_mips
#define ELF_MACHINE_CODE   EM_MIPS
#define elf_backend_collect   TRUE
#define elf_backend_type_change_ok   TRUE
#define elf_backend_can_gc_sections   TRUE
#define elf_info_to_howto   mips_info_to_howto_rela
#define elf_info_to_howto_rel   mips_info_to_howto_rel
#define elf_backend_sym_is_global   mips_elf_sym_is_global
#define elf_backend_object_p   mips_elf_n32_object_p
#define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
#define elf_backend_section_processing   _bfd_mips_elf_section_processing
#define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
#define elf_backend_fake_sections   _bfd_mips_elf_fake_sections
#define elf_backend_section_from_bfd_section   _bfd_mips_elf_section_from_bfd_section
#define elf_backend_add_symbol_hook   _bfd_mips_elf_add_symbol_hook
#define elf_backend_link_output_symbol_hook   _bfd_mips_elf_link_output_symbol_hook
#define elf_backend_create_dynamic_sections   _bfd_mips_elf_create_dynamic_sections
#define elf_backend_check_relocs   _bfd_mips_elf_check_relocs
#define elf_backend_merge_symbol_attribute   _bfd_mips_elf_merge_symbol_attribute
#define elf_backend_adjust_dynamic_symbol   _bfd_mips_elf_adjust_dynamic_symbol
#define elf_backend_always_size_sections   _bfd_mips_elf_always_size_sections
#define elf_backend_size_dynamic_sections   _bfd_mips_elf_size_dynamic_sections
#define elf_backend_init_index_section   _bfd_elf_init_1_index_section
#define elf_backend_relocate_section   _bfd_mips_elf_relocate_section
#define elf_backend_finish_dynamic_symbol   _bfd_mips_elf_finish_dynamic_symbol
#define elf_backend_finish_dynamic_sections   _bfd_mips_elf_finish_dynamic_sections
#define elf_backend_final_write_processing   _bfd_mips_elf_final_write_processing
#define elf_backend_additional_program_headers   _bfd_mips_elf_additional_program_headers
#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_sweep_hook   _bfd_mips_elf_gc_sweep_hook
#define elf_backend_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_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_may_use_rel_p   1
#define elf_backend_may_use_rela_p   1
#define elf_backend_default_use_rela_p   1
#define elf_backend_sign_extend_vma   TRUE
#define elf_backend_discard_info   _bfd_mips_elf_discard_info
#define elf_backend_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   elf_n32_mips_irix_compat
#define elf_backend_mips_rtype_to_howto   mips_elf_n32_rtype_to_howto
#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_new_section_hook   _bfd_mips_elf_new_section_hook
#define bfd_elf32_set_section_contents   _bfd_mips_elf_set_section_contents
#define bfd_elf32_bfd_get_relocated_section_contents   _bfd_elf_mips_get_relocated_section_contents
#define bfd_elf32_bfd_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_merge_private_bfd_data   _bfd_mips_elf_merge_private_bfd_data
#define bfd_elf32_bfd_set_private_flags   _bfd_mips_elf_set_private_flags
#define bfd_elf32_bfd_print_private_bfd_data   _bfd_mips_elf_print_private_bfd_data
#define bfd_elf32_bfd_relax_section   _bfd_mips_relax_section
#define TARGET_LITTLE_SYM   bfd_elf32_nlittlemips_vec
#define TARGET_LITTLE_NAME   "elf32-nlittlemips"
#define TARGET_BIG_SYM   bfd_elf32_nbigmips_vec
#define TARGET_BIG_NAME   "elf32-nbigmips"
#define ELF_MAXPAGESIZE   0x10000
#define ELF_COMMONPAGESIZE   0x1000
#define TARGET_LITTLE_SYM   bfd_elf32_ntradlittlemips_vec
#define TARGET_LITTLE_NAME   "elf32-ntradlittlemips"
#define TARGET_BIG_SYM   bfd_elf32_ntradbigmips_vec
#define TARGET_BIG_NAME   "elf32-ntradbigmips"
#define ELF_MAXPAGESIZE   0x10000
#define ELF_COMMONPAGESIZE   0x1000
#define elf32_bed   elf32_tradbed

Functions

static bfd_boolean mips_elf_assign_gp (bfd *, bfd_vma *)
static bfd_reloc_status_type mips_elf_final_gp (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *)
static bfd_reloc_status_type mips_elf_gprel16_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **)
static bfd_reloc_status_type mips_elf_literal_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **)
static bfd_reloc_status_type mips_elf_gprel32_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **)
static bfd_reloc_status_type gprel32_with_gp (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma)
static bfd_reloc_status_type mips_elf_shift6_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **)
static bfd_reloc_status_type mips16_gprel_reloc (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **)
static reloc_howto_type * bfd_elf32_bfd_reloc_type_lookup (bfd *, bfd_reloc_code_real_type)
static reloc_howto_type * mips_elf_n32_rtype_to_howto (unsigned int, bfd_boolean)
static void mips_info_to_howto_rel (bfd *, arelent *, Elf_Internal_Rela *)
static void mips_info_to_howto_rela (bfd *, arelent *, Elf_Internal_Rela *)
static bfd_boolean mips_elf_sym_is_global (bfd *, asymbol *)
static bfd_boolean mips_elf_n32_object_p (bfd *)
static bfd_boolean elf32_mips_grok_prstatus (bfd *, Elf_Internal_Note *)
static bfd_boolean elf32_mips_grok_psinfo (bfd *, Elf_Internal_Note *)
static irix_compat_t elf_n32_mips_irix_compat (bfd *)
static bfd_reloc_status_type mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, asymbol *symbol, void *data ATTRIBUTE_UNUSED, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static reloc_howto_type * bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
static reloc_howto_type * bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
static void mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, Elf_Internal_Rela *dst)
static bfd_boolean mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)

Variables

const bfd_target bfd_elf32_nbigmips_vec
const bfd_target bfd_elf32_nlittlemips_vec
static reloc_howto_type elf_mips_howto_table_rel []
static reloc_howto_type elf_mips_howto_table_rela []
static reloc_howto_type elf_mips16_howto_table_rel []
static reloc_howto_type elf_mips16_howto_table_rela []
static reloc_howto_type elf_mips_gnu_vtinherit_howto
static reloc_howto_type elf_mips_gnu_vtentry_howto
static reloc_howto_type elf_mips_gnu_rel16_s2
static reloc_howto_type elf_mips_gnu_rela16_s2
static struct elf_reloc_map []
static struct ecoff_debug_swap

Class Documentation

struct elf_reloc_map

Definition at line 403 of file elf32-dlx.c.

Class Members
bfd_reloc_code_real_type bfd_reloc_val
bfd_reloc_code_real_type bfd_val
unsigned char elf_reloc_val
int elf_reloc_val
unsigned char howto_index

Define Documentation

#define ABI_N32_P (   abfd)    ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)

Definition at line 89 of file elfn32-mips.c.

Definition at line 2411 of file elfn32-mips.c.

Definition at line 2407 of file elfn32-mips.c.

Definition at line 2409 of file elfn32-mips.c.

Definition at line 2412 of file elfn32-mips.c.

Definition at line 2415 of file elfn32-mips.c.

Definition at line 2417 of file elfn32-mips.c.

Definition at line 2414 of file elfn32-mips.c.

Definition at line 2404 of file elfn32-mips.c.

Definition at line 2403 of file elfn32-mips.c.

Definition at line 2405 of file elfn32-mips.c.

Definition at line 2406 of file elfn32-mips.c.

#define ECOFF_SIGNED_32

Definition at line 47 of file elfn32-mips.c.

#define elf32_bed   elf32_tradbed

Definition at line 2447 of file elfn32-mips.c.

#define ELF_ARCH   bfd_arch_mips

Definition at line 2338 of file elfn32-mips.c.

Definition at line 2354 of file elfn32-mips.c.

Definition at line 2376 of file elfn32-mips.c.

Definition at line 2362 of file elfn32-mips.c.

Definition at line 2364 of file elfn32-mips.c.

Definition at line 2343 of file elfn32-mips.c.

Definition at line 2359 of file elfn32-mips.c.

#define elf_backend_collect   TRUE

Definition at line 2341 of file elfn32-mips.c.

Definition at line 2381 of file elfn32-mips.c.

Definition at line 2357 of file elfn32-mips.c.

Definition at line 2394 of file elfn32-mips.c.

Definition at line 2397 of file elfn32-mips.c.

#define elf_backend_ecoff_debug_swap   &mips_elf32_ecoff_debug_swap

Definition at line 2386 of file elfn32-mips.c.

Definition at line 2351 of file elfn32-mips.c.

Definition at line 2374 of file elfn32-mips.c.

Definition at line 2372 of file elfn32-mips.c.

Definition at line 2370 of file elfn32-mips.c.

Definition at line 2379 of file elfn32-mips.c.

Definition at line 2380 of file elfn32-mips.c.

Definition at line 2388 of file elfn32-mips.c.

Definition at line 2384 of file elfn32-mips.c.

Definition at line 2385 of file elfn32-mips.c.

Definition at line 2383 of file elfn32-mips.c.

Definition at line 2398 of file elfn32-mips.c.

Definition at line 2368 of file elfn32-mips.c.

Definition at line 2355 of file elfn32-mips.c.

#define elf_backend_may_use_rel_p   1

Definition at line 2392 of file elfn32-mips.c.

Definition at line 2393 of file elfn32-mips.c.

Definition at line 2360 of file elfn32-mips.c.

Definition at line 2401 of file elfn32-mips.c.

Definition at line 2402 of file elfn32-mips.c.

Definition at line 2378 of file elfn32-mips.c.

Definition at line 2347 of file elfn32-mips.c.

Definition at line 2369 of file elfn32-mips.c.

Definition at line 2352 of file elfn32-mips.c.

Definition at line 2350 of file elfn32-mips.c.

Definition at line 2349 of file elfn32-mips.c.

Definition at line 2395 of file elfn32-mips.c.

Definition at line 2366 of file elfn32-mips.c.

Definition at line 2346 of file elfn32-mips.c.

Definition at line 2348 of file elfn32-mips.c.

Definition at line 2342 of file elfn32-mips.c.

Definition at line 2400 of file elfn32-mips.c.

#define ELF_COMMONPAGESIZE   0x1000

Definition at line 2446 of file elfn32-mips.c.

#define ELF_COMMONPAGESIZE   0x1000

Definition at line 2446 of file elfn32-mips.c.

Definition at line 2344 of file elfn32-mips.c.

Definition at line 2345 of file elfn32-mips.c.

#define ELF_MACHINE_CODE   EM_MIPS

Definition at line 2339 of file elfn32-mips.c.

#define ELF_MAXPAGESIZE   0x10000

Definition at line 2445 of file elfn32-mips.c.

#define ELF_MAXPAGESIZE   0x10000

Definition at line 2445 of file elfn32-mips.c.

#define MINUS_ONE   (((bfd_vma)0) - 1)

Definition at line 101 of file elfn32-mips.c.

#define MIPS_RESERVED_GOTNO   (2)

Definition at line 97 of file elfn32-mips.c.

Definition at line 93 of file elfn32-mips.c.

#define TARGET_BIG_NAME   "elf32-nbigmips"

Definition at line 2443 of file elfn32-mips.c.

#define TARGET_BIG_NAME   "elf32-ntradbigmips"

Definition at line 2443 of file elfn32-mips.c.

Definition at line 2442 of file elfn32-mips.c.

Definition at line 2442 of file elfn32-mips.c.

#define TARGET_LITTLE_NAME   "elf32-nlittlemips"

Definition at line 2441 of file elfn32-mips.c.

#define TARGET_LITTLE_NAME   "elf32-ntradlittlemips"

Definition at line 2441 of file elfn32-mips.c.

Definition at line 2440 of file elfn32-mips.c.

Definition at line 2440 of file elfn32-mips.c.


Function Documentation

static reloc_howto_type* bfd_elf32_bfd_reloc_name_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
const char *  r_name 
) [static]

Definition at line 2085 of file elfn32-mips.c.

{
  unsigned int i;

  for (i = 0;
       i < (sizeof (elf_mips_howto_table_rela)
           / sizeof (elf_mips_howto_table_rela[0]));
       i++)
    if (elf_mips_howto_table_rela[i].name != NULL
       && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
      return &elf_mips_howto_table_rela[i];

  for (i = 0;
       i < (sizeof (elf_mips16_howto_table_rela)
           / sizeof (elf_mips16_howto_table_rela[0]));
       i++)
    if (elf_mips16_howto_table_rela[i].name != NULL
       && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
      return &elf_mips16_howto_table_rela[i];

  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
    return &elf_mips_gnu_vtinherit_howto;
  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
    return &elf_mips_gnu_vtentry_howto;
  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
    return &elf_mips_gnu_rel16_s2;
  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
    return &elf_mips_gnu_rela16_s2;

  return NULL;
}

Here is the call graph for this function:

static reloc_howto_type* bfd_elf32_bfd_reloc_type_lookup ( bfd ,
bfd_reloc_code_real_type   
) [static]
static reloc_howto_type* bfd_elf32_bfd_reloc_type_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
bfd_reloc_code_real_type  code 
) [static]

Definition at line 2049 of file elfn32-mips.c.

{
  unsigned int i;
  /* FIXME: We default to RELA here instead of choosing the right
     relocation variant.  */
  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;

  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
       i++)
    {
      if (mips_reloc_map[i].bfd_val == code)
       return &howto_table[(int) mips_reloc_map[i].elf_val];
    }

  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
       i++)
    {
      if (mips16_reloc_map[i].bfd_val == code)
       return &howto16_table[(int) mips16_reloc_map[i].elf_val];
    }

  switch (code)
    {
    case BFD_RELOC_VTABLE_INHERIT:
      return &elf_mips_gnu_vtinherit_howto;
    case BFD_RELOC_VTABLE_ENTRY:
      return &elf_mips_gnu_vtentry_howto;
    default:
      bfd_set_error (bfd_error_bad_value);
      return NULL;
    }
}

Here is the call graph for this function:

static bfd_boolean elf32_mips_grok_prstatus ( bfd abfd,
Elf_Internal_Note note 
) [static]

Definition at line 2225 of file elfn32-mips.c.

{
  int offset;
  unsigned int size;

  switch (note->descsz)
    {
      default:
       return FALSE;

      case 440:             /* Linux/MIPS N32 */
       /* pr_cursig */
       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);

       /* pr_pid */
       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);

       /* pr_reg */
       offset = 72;
       size = 360;

       break;
    }

  /* Make a ".reg/999" section.  */
  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
                                     note->descpos + offset);
}

Here is the call graph for this function:

static bfd_boolean elf32_mips_grok_psinfo ( bfd abfd,
Elf_Internal_Note note 
) [static]

Definition at line 2255 of file elfn32-mips.c.

{
  switch (note->descsz)
    {
      default:
       return FALSE;

      case 128:             /* Linux/MIPS elf_prpsinfo */
       elf_tdata (abfd)->core_program
        = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
       elf_tdata (abfd)->core_command
        = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
    }

  /* Note that for some reason, a spurious space is tacked
     onto the end of the args in some (at least one anyway)
     implementations, so strip it off if it exists.  */

  {
    char *command = elf_tdata (abfd)->core_command;
    int n = strlen (command);

    if (0 < n && command[n - 1] == ' ')
      command[n - 1] = '\0';
  }

  return TRUE;
}

Here is the call graph for this function:

static irix_compat_t elf_n32_mips_irix_compat ( bfd abfd) [static]

Definition at line 2287 of file elfn32-mips.c.

{
  if ((abfd->xvec == &bfd_elf32_nbigmips_vec)
      || (abfd->xvec == &bfd_elf32_nlittlemips_vec))
    return ict_irix6;
  else
    return ict_none;
}
static bfd_reloc_status_type gprel32_with_gp ( bfd abfd,
asymbol symbol,
arelent reloc_entry,
asection input_section,
bfd_boolean  relocatable,
void *  data,
bfd_vma  gp 
) [static]

Definition at line 1872 of file elfn32-mips.c.

{
  bfd_vma relocation;
  unsigned long val;

  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;

  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
    return bfd_reloc_outofrange;

  if (reloc_entry->howto->src_mask == 0)
    val = 0;
  else
    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);

  /* Set val to the offset into the section or symbol.  */
  val += reloc_entry->addend;

  /* Adjust val for the final section location and GP value.  If we
     are producing relocatable output, we don't want to do this for
     an external symbol.  */
  if (! relocatable
      || (symbol->flags & BSF_SECTION_SYM) != 0)
    val += relocation - gp;

  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);

  if (relocatable)
    reloc_entry->address += input_section->output_offset;

  return bfd_reloc_ok;
}

Here is the caller graph for this function:

static bfd_reloc_status_type mips16_gprel_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **  error_message 
) [static]

Definition at line 1935 of file elfn32-mips.c.

{
  bfd_boolean relocatable;
  bfd_reloc_status_type ret;
  bfd_byte *location;
  bfd_vma gp;

  /* If we're relocating, and this is an external symbol, we don't want
     to change anything.  */
  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (symbol->flags & BSF_LOCAL) != 0)
    {
      reloc_entry->address += input_section->output_offset;
      return bfd_reloc_ok;
    }

  if (output_bfd != NULL)
    relocatable = TRUE;
  else
    {
      relocatable = FALSE;
      output_bfd = symbol->section->output_section->owner;
    }

  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
                        &gp);
  if (ret != bfd_reloc_ok)
    return ret;

  location = (bfd_byte *) data + reloc_entry->address;
  _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
                               location);
  ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
                                   input_section, relocatable,
                                   data, gp);
  _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
                             location);

  return ret;
}

Here is the call graph for this function:

static bfd_boolean mips_elf_assign_gp ( bfd output_bfd,
bfd_vma pgp 
) [static]

Definition at line 1674 of file elfn32-mips.c.

{
  unsigned int count;
  asymbol **sym;
  unsigned int i;

  /* If we've already figured out what GP will be, just return it.  */
  *pgp = _bfd_get_gp_value (output_bfd);
  if (*pgp)
    return TRUE;

  count = bfd_get_symcount (output_bfd);
  sym = bfd_get_outsymbols (output_bfd);

  /* The linker script will have created a symbol named `_gp' with the
     appropriate value.  */
  if (sym == NULL)
    i = count;
  else
    {
      for (i = 0; i < count; i++, sym++)
       {
         register const char *name;

         name = bfd_asymbol_name (*sym);
         if (*name == '_' && strcmp (name, "_gp") == 0)
           {
             *pgp = bfd_asymbol_value (*sym);
             _bfd_set_gp_value (output_bfd, *pgp);
             break;
           }
       }
    }

  if (i >= count)
    {
      /* Only get the error once.  */
      *pgp = 4;
      _bfd_set_gp_value (output_bfd, *pgp);
      return FALSE;
    }

  return TRUE;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type mips_elf_final_gp ( bfd output_bfd,
asymbol symbol,
bfd_boolean  relocatable,
char **  error_message,
bfd_vma pgp 
) [static]

Definition at line 1726 of file elfn32-mips.c.

{
  if (bfd_is_und_section (symbol->section)
      && ! relocatable)
    {
      *pgp = 0;
      return bfd_reloc_undefined;
    }

  *pgp = _bfd_get_gp_value (output_bfd);
  if (*pgp == 0
      && (! relocatable
         || (symbol->flags & BSF_SECTION_SYM) != 0))
    {
      if (relocatable)
       {
         /* Make up a value.  */
         *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
         _bfd_set_gp_value (output_bfd, *pgp);
       }
      else if (!mips_elf_assign_gp (output_bfd, pgp))
       {
         *error_message =
           (char *) _("GP relative relocation when _gp not defined");
         return bfd_reloc_dangerous;
       }
    }

  return bfd_reloc_ok;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type mips_elf_gprel16_reloc ( bfd ,
arelent ,
asymbol ,
void *  ,
asection ,
bfd ,
char **   
) [static]
static bfd_reloc_status_type mips_elf_gprel16_reloc ( bfd *abfd  ATTRIBUTE_UNUSED,
arelent reloc_entry,
asymbol symbol,
void *data  ATTRIBUTE_UNUSED,
asection input_section,
bfd output_bfd,
char **error_message  ATTRIBUTE_UNUSED 
) [static]

Definition at line 1762 of file elfn32-mips.c.

{
  bfd_boolean relocatable;
  bfd_reloc_status_type ret;
  bfd_vma gp;

  if (output_bfd != NULL)
    relocatable = TRUE;
  else
    {
      relocatable = FALSE;
      output_bfd = symbol->section->output_section->owner;
    }

  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
                        &gp);
  if (ret != bfd_reloc_ok)
    return ret;

  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
                                   input_section, relocatable,
                                   data, gp);
}

Here is the call graph for this function:

static bfd_reloc_status_type mips_elf_gprel32_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **  error_message 
) [static]

Definition at line 1833 of file elfn32-mips.c.

{
  bfd_boolean relocatable;
  bfd_reloc_status_type ret;
  bfd_vma gp;

  /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (symbol->flags & BSF_LOCAL) != 0)
    {
      *error_message = (char *)
       _("32bits gp relative relocation occurs for an external symbol");
      return bfd_reloc_outofrange;
    }

  if (output_bfd != NULL)
    {
      relocatable = TRUE;
      gp = _bfd_get_gp_value (output_bfd);
    }
  else
    {
      relocatable = FALSE;
      output_bfd = symbol->section->output_section->owner;

      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
                            error_message, &gp);
      if (ret != bfd_reloc_ok)
       return ret;
    }

  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
                       relocatable, data, gp);
}

Here is the call graph for this function:

static bfd_reloc_status_type mips_elf_literal_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **  error_message 
) [static]

Definition at line 1792 of file elfn32-mips.c.

{
  bfd_boolean relocatable;
  bfd_reloc_status_type ret;
  bfd_vma gp;

  /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
  if (output_bfd != NULL
      && (symbol->flags & BSF_SECTION_SYM) == 0
      && (symbol->flags & BSF_LOCAL) != 0)
    {
      *error_message = (char *)
       _("literal relocation occurs for an external symbol");
      return bfd_reloc_outofrange;
    }

  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
  if (output_bfd != NULL)
    relocatable = TRUE;
  else
    {
      relocatable = FALSE;
      output_bfd = symbol->section->output_section->owner;
    }

  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
                        &gp);
  if (ret != bfd_reloc_ok)
    return ret;

  return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
                                   input_section, relocatable,
                                   data, gp);
}

Here is the call graph for this function:

static bfd_boolean mips_elf_n32_object_p ( bfd abfd) [static]

Definition at line 2204 of file elfn32-mips.c.

{
  unsigned long mach;

  /* Irix 5 and 6 are broken.  Object file symbol tables are not always
     sorted correctly such that local symbols precede global symbols,
     and the sh_info field in the symbol table is not always right.  */
  if (SGI_COMPAT (abfd))
    elf_bad_symtab (abfd) = TRUE;

  mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
  bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);

  if (! ABI_N32_P(abfd))
    return FALSE;

  return TRUE;
}

Here is the call graph for this function:

static reloc_howto_type * mips_elf_n32_rtype_to_howto ( unsigned int  r_type,
bfd_boolean  rela_p 
) [static]

Definition at line 2121 of file elfn32-mips.c.

{
  switch (r_type)
    {
    case R_MIPS_GNU_VTINHERIT:
      return &elf_mips_gnu_vtinherit_howto;
    case R_MIPS_GNU_VTENTRY:
      return &elf_mips_gnu_vtentry_howto;
    case R_MIPS_GNU_REL16_S2:
      if (rela_p)
       return &elf_mips_gnu_rela16_s2;
      else
       return &elf_mips_gnu_rel16_s2;
    default:
      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
       {
         if (rela_p)
           return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
         else
           return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
       }
      BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
      if (rela_p)
       return &elf_mips_howto_table_rela[r_type];
      else
       return &elf_mips_howto_table_rel[r_type];
      break;
    }
}

Here is the caller graph for this function:

static bfd_reloc_status_type mips_elf_shift6_reloc ( bfd abfd,
arelent reloc_entry,
asymbol symbol,
void *  data,
asection input_section,
bfd output_bfd,
char **  error_message 
) [static]

Definition at line 1917 of file elfn32-mips.c.

{
  if (reloc_entry->howto->partial_inplace)
    {
      reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
                          | (reloc_entry->addend & 0x00000800) >> 9);
    }

  return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
                                  input_section, output_bfd,
                                  error_message);
}

Here is the call graph for this function:

static bfd_boolean mips_elf_sym_is_global ( bfd ,
asymbol  
) [static]
static bfd_boolean mips_elf_sym_is_global ( bfd *abfd  ATTRIBUTE_UNUSED,
asymbol sym 
) [static]

Definition at line 2191 of file elfn32-mips.c.

{
  if (SGI_COMPAT (abfd))
    return (sym->flags & BSF_SECTION_SYM) == 0;
  else
    return ((sym->flags & (BSF_GLOBAL | BSF_WEAK)) != 0
           || bfd_is_und_section (bfd_get_section (sym))
           || bfd_is_com_section (bfd_get_section (sym)));
}
static void mips_info_to_howto_rel ( bfd abfd,
arelent cache_ptr,
Elf_Internal_Rela dst 
) [static]

Definition at line 2154 of file elfn32-mips.c.

{
  unsigned int r_type;

  r_type = ELF32_R_TYPE (dst->r_info);
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);

  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
     value for the object file.  We get the addend now, rather than
     when we do the relocation, because the symbol manipulations done
     by the linker may cause us to lose track of the input BFD.  */
  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
      && (r_type == (unsigned int) R_MIPS_GPREL16
         || r_type == (unsigned int) R_MIPS_LITERAL))
    cache_ptr->addend = elf_gp (abfd);
}

Here is the call graph for this function:

static void mips_info_to_howto_rela ( bfd ,
arelent ,
Elf_Internal_Rela  
) [static]
static void mips_info_to_howto_rela ( bfd *abfd  ATTRIBUTE_UNUSED,
arelent cache_ptr,
Elf_Internal_Rela dst 
) [static]

Definition at line 2174 of file elfn32-mips.c.

{
  unsigned int r_type;

  r_type = ELF32_R_TYPE (dst->r_info);
  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
  cache_ptr->addend = dst->r_addend;
}

Here is the call graph for this function:


Variable Documentation

Definition at line 2298 of file elfn32-mips.c.

reloc_howto_type elf_mips16_howto_table_rel[] [static]

Definition at line 1462 of file elfn32-mips.c.

reloc_howto_type elf_mips16_howto_table_rela[] [static]

Definition at line 1534 of file elfn32-mips.c.

reloc_howto_type elf_mips_gnu_rel16_s2 [static]
Initial value:
  HOWTO (R_MIPS_GNU_REL16_S2,      
        2,                  
        2,                  
        16,                 
        TRUE,               
        0,                  
        complain_overflow_signed, 
        _bfd_mips_elf_generic_reloc, 
        "R_MIPS_GNU_REL16_S2",     
        TRUE,               
        0x0000ffff,         
        0x0000ffff,         
        TRUE)

Definition at line 1639 of file elfn32-mips.c.

reloc_howto_type elf_mips_gnu_rela16_s2 [static]
Initial value:
  HOWTO (R_MIPS_GNU_REL16_S2,      
        2,                  
        2,                  
        16,                 
        TRUE,               
        0,                  
        complain_overflow_signed, 
        _bfd_mips_elf_generic_reloc, 
        "R_MIPS_GNU_REL16_S2",     
        FALSE,                     
        0,                  
        0x0000ffff,         
        TRUE)

Definition at line 1655 of file elfn32-mips.c.

reloc_howto_type elf_mips_gnu_vtentry_howto [static]
Initial value:
  HOWTO (R_MIPS_GNU_VTENTRY,       
        0,                  
        2,                  
        0,                  
        FALSE,                     
        0,                  
        complain_overflow_dont, 
        _bfd_elf_rel_vtable_reloc_fn, 
        "R_MIPS_GNU_VTENTRY",      
        FALSE,                     
        0,                  
        0,                  
        FALSE)

Definition at line 1623 of file elfn32-mips.c.

reloc_howto_type elf_mips_gnu_vtinherit_howto [static]
Initial value:
  HOWTO (R_MIPS_GNU_VTINHERIT,     
        0,                  
        2,                  
        0,                  
        FALSE,                     
        0,                  
        complain_overflow_dont, 
        NULL,               
        "R_MIPS_GNU_VTINHERIT", 
        FALSE,                     
        0,                  
        0,                  
        FALSE)

Definition at line 1607 of file elfn32-mips.c.

reloc_howto_type elf_mips_howto_table_rel[] [static]

Definition at line 105 of file elfn32-mips.c.

reloc_howto_type elf_mips_howto_table_rela[] [static]

Definition at line 776 of file elfn32-mips.c.

static struct elf_reloc_map [static]

Definition at line 1986 of file elfn32-mips.c.