Back to index

cell-binutils  2.17cvs20070401
Defines | Functions | Variables
elf32-mt.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "elf-bfd.h"
#include "elf/mt.h"
#include "elf32-target.h"

Go to the source code of this file.

Defines

#define TARGET_BIG_SYM   bfd_elf32_mt_vec
#define TARGET_BIG_NAME   "elf32-mt"
#define ELF_ARCH   bfd_arch_mt
#define ELF_MACHINE_CODE   EM_MT
#define ELF_MAXPAGESIZE   1 /* No pages on the MT. */
#define elf_info_to_howto_rel   NULL
#define elf_info_to_howto   mt_info_to_howto_rela
#define elf_backend_relocate_section   mt_elf_relocate_section
#define bfd_elf32_bfd_reloc_type_lookup   mt_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup   mt_reloc_name_lookup
#define elf_backend_check_relocs   mt_elf_check_relocs
#define elf_backend_object_p   mt_elf_object_p
#define elf_backend_rela_normal   1
#define elf_backend_can_gc_sections   1
#define bfd_elf32_bfd_set_private_flags   mt_elf_set_private_flags
#define bfd_elf32_bfd_copy_private_bfd_data   mt_elf_copy_private_bfd_data
#define bfd_elf32_bfd_merge_private_bfd_data   mt_elf_merge_private_bfd_data
#define bfd_elf32_bfd_print_private_bfd_data   mt_elf_print_private_bfd_data

Functions

static reloc_howto_type * mt_reloc_type_lookup (bfd *, bfd_reloc_code_real_type)
static void mt_info_to_howto_rela (bfd *, arelent *, Elf_Internal_Rela *)
static bfd_reloc_status_type mt_elf_relocate_hi16 (bfd *, Elf_Internal_Rela *, bfd_byte *, bfd_vma)
static bfd_reloc_status_type mt_final_link_relocate (reloc_howto_type *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, bfd_vma)
static bfd_boolean mt_elf_relocate_section (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **)
static reloc_howto_type * mt_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
static reloc_howto_type * mt_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
static void mt_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, Elf_Internal_Rela *dst)
static bfd_boolean mt_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info, bfd *input_bfd, asection *input_section, bfd_byte *contents, Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms, asection **local_sections)
static bfd_boolean mt_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, const Elf_Internal_Rela *relocs)
static int elf32_mt_machine (bfd *abfd)
static bfd_boolean mt_elf_object_p (bfd *abfd)
static bfd_boolean mt_elf_set_private_flags (bfd *abfd, flagword flags)
static bfd_boolean mt_elf_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
static bfd_boolean mt_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
static bfd_boolean mt_elf_print_private_bfd_data (bfd *abfd, void *ptr)

Variables

static reloc_howto_type mt_elf_howto_table []

Define Documentation

Definition at line 620 of file elf32-mt.c.

Definition at line 621 of file elf32-mt.c.

Definition at line 622 of file elf32-mt.c.

Definition at line 611 of file elf32-mt.c.

Definition at line 610 of file elf32-mt.c.

Definition at line 619 of file elf32-mt.c.

#define ELF_ARCH   bfd_arch_mt

Definition at line 601 of file elf32-mt.c.

Definition at line 617 of file elf32-mt.c.

Definition at line 613 of file elf32-mt.c.

Definition at line 614 of file elf32-mt.c.

#define elf_backend_rela_normal   1

Definition at line 615 of file elf32-mt.c.

Definition at line 608 of file elf32-mt.c.

Definition at line 606 of file elf32-mt.c.

Definition at line 605 of file elf32-mt.c.

#define ELF_MACHINE_CODE   EM_MT

Definition at line 602 of file elf32-mt.c.

#define ELF_MAXPAGESIZE   1 /* No pages on the MT. */

Definition at line 603 of file elf32-mt.c.

#define TARGET_BIG_NAME   "elf32-mt"

Definition at line 599 of file elf32-mt.c.

Definition at line 598 of file elf32-mt.c.


Function Documentation

static int elf32_mt_machine ( bfd abfd) [static]

Definition at line 475 of file elf32-mt.c.

{
  switch (elf_elfheader (abfd)->e_flags & EF_MT_CPU_MASK)
    {
    case EF_MT_CPU_MRISC:   return bfd_mach_ms1;
    case EF_MT_CPU_MRISC2:  return bfd_mach_mrisc2;
    case EF_MT_CPU_MS2:            return bfd_mach_ms2;
    }

  return bfd_mach_ms1;
}

Here is the caller graph for this function:

static bfd_boolean mt_elf_check_relocs ( bfd abfd,
struct bfd_link_info info,
asection sec,
const Elf_Internal_Rela relocs 
) [static]

Definition at line 431 of file elf32-mt.c.

{
  Elf_Internal_Shdr *           symtab_hdr;
  struct elf_link_hash_entry ** sym_hashes;
  struct elf_link_hash_entry ** sym_hashes_end;
  const Elf_Internal_Rela *     rel;
  const Elf_Internal_Rela *     rel_end;
  
  if (info->relocatable)
    return TRUE;
  
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
  sym_hashes = elf_sym_hashes (abfd);
  sym_hashes_end = sym_hashes + symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
  if (!elf_bad_symtab (abfd))
    sym_hashes_end -= symtab_hdr->sh_info;
  
  rel_end = relocs + sec->reloc_count;
  for (rel = relocs; rel < rel_end; rel++)
    {
      struct elf_link_hash_entry *h;
      unsigned long r_symndx;
      
      r_symndx = ELF32_R_SYM (rel->r_info);
      if (r_symndx < symtab_hdr->sh_info)
        h = NULL;
      else
       {
         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
         while (h->root.type == bfd_link_hash_indirect
               || h->root.type == bfd_link_hash_warning)
           h = (struct elf_link_hash_entry *) h->root.u.i.link;
       }
    }

  return TRUE;
}
static bfd_boolean mt_elf_copy_private_bfd_data ( bfd ibfd,
bfd obfd 
) [static]

Definition at line 507 of file elf32-mt.c.

{
  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
    return TRUE;
  
  BFD_ASSERT (!elf_flags_init (obfd)
             || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags);

  elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags;
  elf_flags_init (obfd) = TRUE;
  return TRUE;
}
static bfd_boolean mt_elf_merge_private_bfd_data ( bfd ibfd,
bfd obfd 
) [static]

Definition at line 525 of file elf32-mt.c.

{
  flagword     old_flags, new_flags;
  bfd_boolean  ok = TRUE;

  /* Check if we have the same endianess.  */
  if (_bfd_generic_verify_endian_match (ibfd, obfd) == FALSE)
    return FALSE;

  /* If they're not both mt, then merging is meaningless, so just
     don't do it.  */
  if (strcmp (ibfd->arch_info->arch_name, "mt") != 0)
    return TRUE;
  if (strcmp (obfd->arch_info->arch_name, "mt") != 0)
    return TRUE;

  new_flags = elf_elfheader (ibfd)->e_flags;
  old_flags = elf_elfheader (obfd)->e_flags;

#ifdef DEBUG
  _bfd_error_handler ("%B: old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s",
                    ibfd, old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no");
#endif

  if (!elf_flags_init (obfd))
    {
      old_flags = new_flags;
      elf_flags_init (obfd) = TRUE;
    }
  else if ((new_flags & EF_MT_CPU_MASK) != (old_flags & EF_MT_CPU_MASK))
    {
      /* CPU has changed.  This is invalid, because MRISC, MRISC2 and
        MS2 are not subsets of each other.   */
      ok = FALSE;
    }
  
  if (ok)
    {
      obfd->arch_info = ibfd->arch_info;
      elf_elfheader (obfd)->e_flags = old_flags;
    }

  return ok;
}

Here is the call graph for this function:

static bfd_boolean mt_elf_object_p ( bfd abfd) [static]

Definition at line 488 of file elf32-mt.c.

Here is the call graph for this function:

static bfd_boolean mt_elf_print_private_bfd_data ( bfd abfd,
void *  ptr 
) [static]

Definition at line 571 of file elf32-mt.c.

{
  FILE *   file = (FILE *) ptr;
  flagword flags;

  BFD_ASSERT (abfd != NULL && ptr != NULL);
  
  /* Print normal ELF private data.  */
  _bfd_elf_print_private_bfd_data (abfd, ptr);

  flags = elf_elfheader (abfd)->e_flags;
  fprintf (file, _("private flags = 0x%lx:"), (long)flags);

  switch (flags & EF_MT_CPU_MASK)
    {
    default:
    case EF_MT_CPU_MRISC:   fprintf (file, " ms1-16-002");     break;
    case EF_MT_CPU_MRISC2:  fprintf (file, " ms1-16-003");     break;
    case EF_MT_CPU_MS2:     fprintf (file, " ms2");     break;
    }

  fputc ('\n', file);

  return TRUE;
}

Here is the call graph for this function:

bfd_reloc_status_type mt_elf_relocate_hi16 ( bfd input_bfd,
Elf_Internal_Rela relhi,
bfd_byte contents,
bfd_vma  value 
) [static]

Definition at line 208 of file elf32-mt.c.

{
  bfd_vma insn;

  insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);

  value += relhi->r_addend;
  value >>= 16;
  insn = ((insn & ~0xFFFF) | value);

  bfd_put_32 (input_bfd, insn, contents + relhi->r_offset);
  return bfd_reloc_ok;
}

Here is the caller graph for this function:

static bfd_boolean mt_elf_relocate_section ( bfd ,
struct bfd_link_info ,
bfd ,
asection ,
bfd_byte ,
Elf_Internal_Rela ,
Elf_Internal_Sym *  ,
asection **   
) [static]
static bfd_boolean mt_elf_relocate_section ( bfd *output_bfd  ATTRIBUTE_UNUSED,
struct bfd_link_info info,
bfd input_bfd,
asection input_section,
bfd_byte contents,
Elf_Internal_Rela relocs,
Elf_Internal_Sym *  local_syms,
asection **  local_sections 
) [static]

Definition at line 294 of file elf32-mt.c.

{
  Elf_Internal_Shdr *           symtab_hdr;
  struct elf_link_hash_entry ** sym_hashes;
  Elf_Internal_Rela *           rel;
  Elf_Internal_Rela *           relend;

  symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr;
  sym_hashes = elf_sym_hashes (input_bfd);
  relend     = relocs + input_section->reloc_count;

  for (rel = relocs; rel < relend; rel ++)
    {
      reloc_howto_type *           howto;
      unsigned long                r_symndx;
      Elf_Internal_Sym *           sym;
      asection *                   sec;
      struct elf_link_hash_entry * h;
      bfd_vma                      relocation;
      bfd_reloc_status_type        r;
      const char *                 name = NULL;
      int                          r_type;
      
      r_type = ELF32_R_TYPE (rel->r_info);

      r_symndx = ELF32_R_SYM (rel->r_info);

      howto  = mt_elf_howto_table + ELF32_R_TYPE (rel->r_info);
      h      = NULL;
      sym    = NULL;
      sec    = NULL;
      
      if (r_symndx < symtab_hdr->sh_info)
       {
         sym = local_syms + r_symndx;
         sec = local_sections [r_symndx];
         relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
         
         name = bfd_elf_string_from_elf_section
           (input_bfd, symtab_hdr->sh_link, sym->st_name);
         name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name;
       }
      else
       {
         bfd_boolean unresolved_reloc;
         bfd_boolean warned;

         RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
                               r_symndx, symtab_hdr, sym_hashes,
                               h, sec, relocation,
                               unresolved_reloc, warned);

         name = h->root.root.string;
       }

      if (sec != NULL && elf_discarded_section (sec))
       {
         /* For relocs against symbols from removed linkonce sections,
            or sections discarded by a linker script, we just want the
            section contents zeroed.  Avoid any special processing.  */
         _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
         rel->r_info = 0;
         rel->r_addend = 0;
         continue;
       }

      if (info->relocatable)
       continue;

      /* Finally, the sole MT-specific part.  */
      switch (r_type)
        {
        case R_MT_HI16:
          r = mt_elf_relocate_hi16 (input_bfd, rel, contents, relocation);
          break;
       default:
          r = mt_final_link_relocate (howto, input_bfd, input_section,
                                     contents, rel, relocation);
          break;
        }


      if (r != bfd_reloc_ok)
       {
         const char * msg = (const char *) NULL;

         switch (r)
           {
           case bfd_reloc_overflow:
             r = info->callbacks->reloc_overflow
              (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0,
               input_bfd, input_section, rel->r_offset);
             break;
             
           case bfd_reloc_undefined:
             r = info->callbacks->undefined_symbol
              (info, name, input_bfd, input_section, rel->r_offset, TRUE);
             break;
             
           case bfd_reloc_outofrange:
             msg = _("internal error: out of range error");
             break;

           case bfd_reloc_dangerous:
             msg = _("internal error: dangerous relocation");
             break;

           default:
             msg = _("internal error: unknown error");
             break;
           }

         if (msg)
           r = info->callbacks->warning
             (info, msg, name, input_bfd, input_section, rel->r_offset);

         if (! r)
           return FALSE;
       }
    }

  return TRUE;
}

Here is the call graph for this function:

static bfd_boolean mt_elf_set_private_flags ( bfd abfd,
flagword  flags 
) [static]

Definition at line 498 of file elf32-mt.c.

{
  elf_elfheader (abfd)->e_flags = flags;
  elf_flags_init (abfd) = TRUE;
  return TRUE;
}
static bfd_reloc_status_type mt_final_link_relocate ( reloc_howto_type *  howto,
bfd input_bfd,
asection input_section,
bfd_byte contents,
Elf_Internal_Rela rel,
bfd_vma  relocation 
) [static]

Definition at line 247 of file elf32-mt.c.

{
  return _bfd_final_link_relocate (howto, input_bfd, input_section,
                               contents, rel->r_offset,
                               relocation, rel->r_addend);
}

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 232 of file elf32-mt.c.

{
  unsigned int r_type;

  r_type = ELF32_R_TYPE (dst->r_info);
  cache_ptr->howto = & mt_elf_howto_table [r_type];
}
static reloc_howto_type* mt_reloc_name_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
const char *  r_name 
) [static]

Definition at line 191 of file elf32-mt.c.

{
  unsigned int i;

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

  return NULL;
}

Here is the call graph for this function:

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

Definition at line 158 of file elf32-mt.c.

{
  /* Note that the mt_elf_howto_table is indxed by the R_
     constants.  Thus, the order that the howto records appear in the
     table *must* match the order of the relocation types defined in
     include/elf/mt.h.  */

  switch (code)
    {
    case BFD_RELOC_NONE:
      return &mt_elf_howto_table[ (int) R_MT_NONE];
    case BFD_RELOC_16:
      return &mt_elf_howto_table[ (int) R_MT_16];
    case BFD_RELOC_32:
      return &mt_elf_howto_table[ (int) R_MT_32];
    case BFD_RELOC_32_PCREL:
      return &mt_elf_howto_table[ (int) R_MT_32_PCREL];
    case BFD_RELOC_16_PCREL:
      return &mt_elf_howto_table[ (int) R_MT_PC16];
    case BFD_RELOC_HI16:
      return &mt_elf_howto_table[ (int) R_MT_HI16];
    case BFD_RELOC_LO16:
      return &mt_elf_howto_table[ (int) R_MT_LO16];

    default:
      /* Pacify gcc -Wall.  */
      return NULL;
    }
  return NULL;
}

Variable Documentation

reloc_howto_type mt_elf_howto_table[] [static]

Definition at line 46 of file elf32-mt.c.