Back to index

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

Go to the source code of this file.

Classes

struct  elf_reloc_map

Defines

#define USE_REL   1
#define bfd_elf32_bfd_reloc_type_lookup   elf32_dlx_reloc_type_lookup
#define bfd_elf32_bfd_reloc_name_lookup   elf32_dlx_reloc_name_lookup
#define elf_info_to_howto   elf32_dlx_info_to_howto
#define elf_info_to_howto_rel   elf32_dlx_info_to_howto_rel
#define elf_backend_check_relocs   elf32_dlx_check_relocs
#define TARGET_BIG_SYM   bfd_elf32_dlx_big_vec
#define TARGET_BIG_NAME   "elf32-dlx"
#define ELF_ARCH   bfd_arch_dlx
#define ELF_MACHINE_CODE   EM_DLX
#define ELF_MAXPAGESIZE   1 /* FIXME: This number is wrong, It should be the page size in bytes. */

Functions

int set_dlx_skip_hi16_flag (int)
static bfd_reloc_status_type _bfd_dlx_elf_hi16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message)
static bfd_reloc_status_type elf32_dlx_relocate16 (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static bfd_reloc_status_type elf32_dlx_relocate26 (bfd *abfd, arelent *reloc_entry, asymbol *symbol, void *data, asection *input_section, bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
static bfd_boolean elf32_dlx_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, const Elf_Internal_Rela *relocs)
static reloc_howto_type * elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
static reloc_howto_type * elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
static reloc_howto_type * dlx_rtype_to_howto (unsigned int r_type)
static void elf32_dlx_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr ATTRIBUTE_UNUSED, Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
static void elf32_dlx_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, Elf_Internal_Rela *dst)

Variables

static int skip_dlx_elf_hi16_reloc = 0
static reloc_howto_type dlx_elf_howto_table []
static reloc_howto_type elf_dlx_gnu_rel16_s2
static reloc_howto_type elf_dlx_gnu_rel26_s2
static reloc_howto_type elf_dlx_reloc_16_hi
static reloc_howto_type elf_dlx_reloc_16_lo
static struct elf_reloc_map []

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

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

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

#define ELF_ARCH   bfd_arch_dlx

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

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

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

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

#define ELF_MACHINE_CODE   EM_DLX

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

#define ELF_MAXPAGESIZE   1 /* FIXME: This number is wrong, It should be the page size in bytes. */

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

#define TARGET_BIG_NAME   "elf32-dlx"

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

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

#define USE_REL   1

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


Function Documentation

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

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

{
  bfd_reloc_status_type ret;
  bfd_vma relocation;

  /* If the skip flag is set then we simply do the generic relocating, this
     is more of a hack for dlx gas/gld, so we do not need to do the %hi/%lo
     fixup like mips gld did.   */
  if (skip_dlx_elf_hi16_reloc)
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
                          input_section, output_bfd, error_message);

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

  ret = bfd_reloc_ok;

  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    ret = bfd_reloc_undefined;

  relocation = (bfd_is_com_section (symbol->section)) ? 0 : symbol->value;
  relocation += symbol->section->output_section->vma;
  relocation += symbol->section->output_offset;
  relocation += reloc_entry->addend;
  relocation += bfd_get_16 (abfd, (bfd_byte *)data + reloc_entry->address);

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

  bfd_put_16 (abfd, (short)((relocation >> 16) & 0xFFFF),
              (bfd_byte *)data + reloc_entry->address);

  return ret;
}

Here is the call graph for this function:

static reloc_howto_type* dlx_rtype_to_howto ( unsigned int  r_type) [static]

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

{
  switch (r_type)
    {
    case R_DLX_RELOC_16_PCREL:
      return & elf_dlx_gnu_rel16_s2;
    case R_DLX_RELOC_26_PCREL:
      return & elf_dlx_gnu_rel26_s2;
    case R_DLX_RELOC_16_HI:
      return & elf_dlx_reloc_16_hi;
    case R_DLX_RELOC_16_LO:
      return & elf_dlx_reloc_16_lo;
    default:
      BFD_ASSERT (r_type < (unsigned int) R_DLX_max);
      return & dlx_elf_howto_table[r_type];
    }
}

Here is the caller graph for this function:

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

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

{
  Elf_Internal_Shdr *symtab_hdr;
  struct elf_link_hash_entry **sym_hashes, **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;
       }

      switch (ELF32_R_TYPE (rel->r_info))
        {
        /* This relocation describes the C++ object vtable hierarchy.
           Reconstruct it for later use during GC.  */
        case R_DLX_GNU_VTINHERIT:
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
            return FALSE;
          break;

        /* This relocation describes which C++ vtable entries are actually
           used.  Record for later use during GC.  */
        case R_DLX_GNU_VTENTRY:
          if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
            return FALSE;
          break;
        }
    }

  return TRUE;
}

Here is the call graph for this function:

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

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

{
  abort ();
}
static void elf32_dlx_info_to_howto_rel ( bfd *abfd  ATTRIBUTE_UNUSED,
arelent cache_ptr,
Elf_Internal_Rela dst 
) [static]

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

{
  unsigned int r_type;

  r_type = ELF32_R_TYPE (dst->r_info);
  cache_ptr->howto = dlx_rtype_to_howto (r_type);
  return;
}

Here is the call graph for this function:

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

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

{
  unsigned int i;

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

  if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0)
    return &elf_dlx_gnu_rel16_s2;
  if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0)
    return &elf_dlx_gnu_rel26_s2;
  if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0)
    return &elf_dlx_reloc_16_hi;
  if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0)
    return &elf_dlx_reloc_16_lo;

  return NULL;
}

Here is the call graph for this function:

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

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

{
  unsigned int i;

  for (i = 0; i < sizeof (dlx_reloc_map) / sizeof (struct elf_reloc_map); i++)
    if (dlx_reloc_map[i].bfd_reloc_val == code)
      return &dlx_elf_howto_table[(int) dlx_reloc_map[i].elf_reloc_val];

  switch (code)
    {
    default:
      bfd_set_error (bfd_error_bad_value);
      return NULL;
    case BFD_RELOC_16_PCREL_S2:
      return &elf_dlx_gnu_rel16_s2;
    case BFD_RELOC_DLX_JMP26:
      return &elf_dlx_gnu_rel26_s2;
    case BFD_RELOC_HI16_S:
      return &elf_dlx_reloc_16_hi;
    case BFD_RELOC_LO16:
      return &elf_dlx_reloc_16_lo;
    }
}

Here is the call graph for this function:

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

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

{
  unsigned long insn, vallo, allignment;
  int           val;

  /* HACK: I think this first condition is necessary when producing
     relocatable output.  After the end of HACK, the code is identical
     to bfd_elf_generic_reloc().  I would _guess_ the first change
     belongs there rather than here.  martindo 1998-10-23.  */

  if (skip_dlx_elf_hi16_reloc)
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
                                 input_section, output_bfd, error_message);

  /* Check undefined section and undefined symbols.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  /* Can not support a long jump to sections other then .text.  */
  if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
    {
      fprintf (stderr,
              "BFD Link Error: branch (PC rel16) to section (%s) not supported\n",
              symbol->section->output_section->name);
      return bfd_reloc_undefined;
    }

  insn  = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
  allignment = 1 << (input_section->output_section->alignment_power - 1);
  vallo = insn & 0x0000FFFF;

  if (vallo & 0x8000)
    vallo = ~(vallo | 0xFFFF0000) + 1;

  /* vallo points to the vma of next instruction.  */
  vallo += (((unsigned long)(input_section->output_section->vma +
                           input_section->output_offset) +
            allignment) & ~allignment);

  /* val is the displacement (PC relative to next instruction).  */
  val =  (symbol->section->output_offset +
         symbol->section->output_section->vma +
         symbol->value) - vallo;

  if (abs ((int) val) > 0x00007FFF)
    return bfd_reloc_outofrange;

  insn  = (insn & 0xFFFF0000) | (val & 0x0000FFFF);

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

  return bfd_reloc_ok;
}

Here is the call graph for this function:

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

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

{
  unsigned long insn, vallo, allignment;
  int           val;

  /* HACK: I think this first condition is necessary when producing
     relocatable output.  After the end of HACK, the code is identical
     to bfd_elf_generic_reloc().  I would _guess_ the first change
     belongs there rather than here.  martindo 1998-10-23.  */

  if (skip_dlx_elf_hi16_reloc)
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
                                 input_section, output_bfd, error_message);

  /* Check undefined section and undefined symbols.  */
  if (bfd_is_und_section (symbol->section)
      && output_bfd == (bfd *) NULL)
    return bfd_reloc_undefined;

  /* Can not support a long jump to sections other then .text   */
  if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
    {
      fprintf (stderr,
              "BFD Link Error: jump (PC rel26) to section (%s) not supported\n",
              symbol->section->output_section->name);
      return bfd_reloc_undefined;
    }

  insn  = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
  allignment = 1 << (input_section->output_section->alignment_power - 1);
  vallo = insn & 0x03FFFFFF;

  if (vallo & 0x03000000)
    vallo = ~(vallo | 0xFC000000) + 1;

  /* vallo is the vma for the next instruction.  */
  vallo += (((unsigned long) (input_section->output_section->vma +
                           input_section->output_offset) +
            allignment) & ~allignment);

  /* val is the displacement (PC relative to next instruction).  */
  val = (symbol->section->output_offset +
        symbol->section->output_section->vma + symbol->value)
    - vallo;

  if (abs ((int) val) > 0x01FFFFFF)
    return bfd_reloc_outofrange;

  insn  = (insn & 0xFC000000) | (val & 0x03FFFFFF);
  bfd_put_32 (abfd, insn,
              (bfd_byte *) data + reloc_entry->address);

  return bfd_reloc_ok;
}

Here is the call graph for this function:

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

{
  skip_dlx_elf_hi16_reloc = flag;
  return flag;
}

Here is the caller graph for this function:


Variable Documentation

reloc_howto_type dlx_elf_howto_table[] [static]

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

reloc_howto_type elf_dlx_gnu_rel16_s2 [static]
Initial value:
  HOWTO (R_DLX_RELOC_16_PCREL,  
        0,                     
        1,                     
        16,                    
        TRUE,                  
        0,                     
        complain_overflow_signed, 
        elf32_dlx_relocate16,  
        "R_DLX_RELOC_16_PCREL",
        TRUE,                  
        0xffff,                
        0xffff,                
        TRUE)

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

reloc_howto_type elf_dlx_gnu_rel26_s2 [static]
Initial value:
  HOWTO (R_DLX_RELOC_26_PCREL,  
        0,                     
        2,                     
        26,                    
        TRUE,                  
        0,                     
        complain_overflow_dont,
        elf32_dlx_relocate26,  
        "R_DLX_RELOC_26_PCREL",
        TRUE,                  
        0xffff,                
        0xffff,                
        TRUE)

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

reloc_howto_type elf_dlx_reloc_16_hi [static]
Initial value:
  HOWTO (R_DLX_RELOC_16_HI,     
        16,                    
        2,                     
        32,                    
        FALSE,                 
        0,                     
        complain_overflow_dont,
        _bfd_dlx_elf_hi16_reloc,
        "R_DLX_RELOC_16_HI",   
        TRUE,                  
        0xFFFF,                
        0xffff,                
        FALSE)

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

reloc_howto_type elf_dlx_reloc_16_lo [static]
Initial value:
  HOWTO (R_DLX_RELOC_16_LO,     
        0,                     
        1,                     
        16,                    
        FALSE,                 
        0,                     
        complain_overflow_dont,
        bfd_elf_generic_reloc, 
        "R_DLX_RELOC_16_LO",   
        TRUE,                  
        0xffff,                
        0xffff,                
        FALSE)

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

struct elf_reloc_map[] [static]
Initial value:
{
  { BFD_RELOC_NONE,           R_DLX_NONE },
  { BFD_RELOC_16,             R_DLX_RELOC_16 },
  { BFD_RELOC_32,             R_DLX_RELOC_32 },
  { BFD_RELOC_DLX_HI16_S,     R_DLX_RELOC_16_HI },
  { BFD_RELOC_DLX_LO16,       R_DLX_RELOC_16_LO },
  { BFD_RELOC_VTABLE_INHERIT,      R_DLX_GNU_VTINHERIT },
  { BFD_RELOC_VTABLE_ENTRY, R_DLX_GNU_VTENTRY }
}

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

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