Back to index

cell-binutils  2.17cvs20070401
Defines | Functions | Variables
mipsbsd.c File Reference
#include "bfd.h"
#include "sysdep.h"
#include "libbfd.h"
#include "libaout.h"
#include "aout-target.h"

Go to the source code of this file.

Defines

#define N_HEADER_IN_TEXT(x)   1
#define N_SHARED_LIB(x)   0
#define N_TXTADDR(x)
#define N_DATADDR(x)   (N_TXTADDR(x)+N_TXTSIZE(x))
#define TEXT_START_ADDR   4096
#define TARGET_PAGE_SIZE   4096
#define SEGMENT_SIZE   TARGET_PAGE_SIZE
#define DEFAULT_ARCH   bfd_arch_mips
#define MACHTYPE_OK(mtype)
#define MY_symbol_leading_char   '\0'
#define MY(OP)   CONCAT2 (mipsbsd_,OP)
#define SET_ARCH_MACH(ABFD, EXEC)
#define MY_write_object_contents   MY(write_object_contents)
#define MY_bfd_reloc_type_lookup   mipsbsd_reloc_type_lookup
#define MY_bfd_reloc_name_lookup   mipsbsd_reloc_name_lookup
#define MY_canonicalize_reloc   mipsbsd_canonicalize_reloc
#define MY_bfd_link_hash_table_create   _bfd_generic_link_hash_table_create
#define MY_bfd_link_add_symbols   _bfd_generic_link_add_symbols
#define MY_final_link_callback   unused
#define MY_bfd_final_link   _bfd_generic_final_link
#define MY_backend_data   &MY(backend_data)
#define MY_BFD_TARGET
#define MIPS_RELOC_32   0
#define MIPS_RELOC_JMP   1
#define MIPS_RELOC_WDISP16   2
#define MIPS_RELOC_HI16   3
#define MIPS_RELOC_HI16_S   4
#define MIPS_RELOC_LO16   5

Functions

static void MY (set_arch_mach)
static void MY() choose_reloc_size (bfd *abfd)
static bfd_boolean MY() write_object_contents (bfd *abfd)
static bfd_reloc_status_type mips_fix_jmp_addr (abfd, arelent *reloc_entry, struct bfd_symbol *symbol, data, asection *input_section, bfd *output_bfd, error_message)
static bfd_reloc_status_type
mips_fix_hi16_s 
PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **))
static bfd_reloc_status_type mips_fix_hi16_s (abfd, arelent *reloc_entry, asymbol *symbol, data, input_section, bfd *output_bfd, error_message)
static reloc_howto_type *MY() reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
static reloc_howto_type *MY() reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
long MY() canonicalize_reloc (bfd *abfd, sec_ptr section, arelent **relptr, asymbol **symbols)
static struct aout_backend_data MY (backend_data)

Variables

static reloc_howto_type mips_howto_table_ext []
const bfd_target aout_mips_big_vec
const bfd_target aout_mips_little_vec

Define Documentation

Definition at line 33 of file mipsbsd.c.

#define MACHTYPE_OK (   mtype)
Value:
((mtype) == M_UNKNOWN \
                         || (mtype) == M_MIPS1 || (mtype) == M_MIPS2)

Definition at line 34 of file mipsbsd.c.

#define MIPS_RELOC_32   0

Definition at line 182 of file mipsbsd.c.

#define MIPS_RELOC_HI16   3

Definition at line 185 of file mipsbsd.c.

#define MIPS_RELOC_HI16_S   4

Definition at line 186 of file mipsbsd.c.

#define MIPS_RELOC_JMP   1

Definition at line 183 of file mipsbsd.c.

#define MIPS_RELOC_LO16   5

Definition at line 187 of file mipsbsd.c.

#define MIPS_RELOC_WDISP16   2

Definition at line 184 of file mipsbsd.c.

#define MY (   OP)    CONCAT2 (mipsbsd_,OP)

Definition at line 41 of file mipsbsd.c.

#define MY_backend_data   &MY(backend_data)
#define MY_bfd_reloc_name_lookup   mipsbsd_reloc_name_lookup
#define MY_bfd_reloc_type_lookup   mipsbsd_reloc_type_lookup
#define MY_BFD_TARGET
#define MY_canonicalize_reloc   mipsbsd_canonicalize_reloc
#define MY_final_link_callback   unused
#define MY_symbol_leading_char   '\0'

Definition at line 36 of file mipsbsd.c.

#define N_DATADDR (   x)    (N_TXTADDR(x)+N_TXTSIZE(x))

Definition at line 29 of file mipsbsd.c.

#define N_HEADER_IN_TEXT (   x)    1

Definition at line 23 of file mipsbsd.c.

#define N_SHARED_LIB (   x)    0

Definition at line 24 of file mipsbsd.c.

#define N_TXTADDR (   x)
Value:
(N_MAGIC(x) != ZMAGIC ? (x).a_entry :     /* object file or NMAGIC */\
           TEXT_START_ADDR + EXEC_BYTES_SIZE     /* no padding */\
    )

Definition at line 25 of file mipsbsd.c.

Definition at line 32 of file mipsbsd.c.

#define SET_ARCH_MACH (   ABFD,
  EXEC 
)
Value:
MY(set_arch_mach) (ABFD, N_MACHTYPE (EXEC)); \
  MY(choose_reloc_size) (ABFD);

Definition at line 48 of file mipsbsd.c.

#define TARGET_PAGE_SIZE   4096

Definition at line 31 of file mipsbsd.c.

#define TEXT_START_ADDR   4096

Definition at line 30 of file mipsbsd.c.


Function Documentation

long MY() canonicalize_reloc ( bfd abfd,
sec_ptr  section,
arelent **  relptr,
asymbol **  symbols 
)

Definition at line 349 of file mipsbsd.c.

{
  arelent *tblptr = section->relocation;
  unsigned int count, c;
  extern reloc_howto_type NAME(aout,ext_howto_table)[];

  /* If we have already read in the relocation table, return the values.  */
  if (section->flags & SEC_CONSTRUCTOR)
    {
      arelent_chain *chain = section->constructor_chain;

      for (count = 0; count < section->reloc_count; count++)
       {
         *relptr++ = &chain->relent;
         chain = chain->next;
       }
      *relptr = 0;
      return section->reloc_count;
    }

  if (tblptr && section->reloc_count)
    {
      for (count = 0; count++ < section->reloc_count;)
       *relptr++ = tblptr++;
      *relptr = 0;
      return section->reloc_count;
    }

  if (!NAME(aout,slurp_reloc_table) (abfd, section, symbols))
    return -1;
  tblptr = section->relocation;

  /* fix up howto entries.  */
  for (count = 0; count++ < section->reloc_count;)
    {
      c = tblptr->howto - NAME(aout,ext_howto_table);
      tblptr->howto = &mips_howto_table_ext[c];

      *relptr++ = tblptr++;
    }
  *relptr = 0;
  return section->reloc_count;
}

Here is the call graph for this function:

static void MY() choose_reloc_size ( bfd abfd) [static]

Definition at line 111 of file mipsbsd.c.

{
  switch (bfd_get_arch (abfd))
    {
    case bfd_arch_sparc:
    case bfd_arch_mips:
      obj_reloc_entry_size (abfd) = RELOC_EXT_SIZE;
      break;
    default:
      obj_reloc_entry_size (abfd) = RELOC_STD_SIZE;
      break;
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_reloc_status_type mips_fix_hi16_s ( abfd  ,
arelent reloc_entry,
asymbol symbol,
data  ,
input_section  ,
bfd output_bfd,
error_message   
) [static]

Definition at line 248 of file mipsbsd.c.

{
  bfd_vma relocation;

  /* If this is a partial relocation, just continue.  */
  if (output_bfd != (bfd *)NULL)
    return bfd_reloc_continue;

  /* If this is an undefined symbol, return error.  */
  if (bfd_is_und_section (symbol->section)
      && (symbol->flags & BSF_WEAK) == 0)
    return bfd_reloc_undefined;

  /* Work out which section the relocation is targeted at and the
     initial relocation command value.  */
  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

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

  if (relocation & 0x8000)
    reloc_entry->addend += 0x10000;

  return bfd_reloc_continue;
}
static bfd_reloc_status_type mips_fix_jmp_addr ( abfd  ,
arelent reloc_entry,
struct bfd_symbol symbol,
data  ,
asection input_section,
bfd output_bfd,
error_message   
) [static]

Definition at line 197 of file mipsbsd.c.

{
  bfd_vma relocation, pc;

  /* If this is a partial relocation, just continue.  */
  if (output_bfd != (bfd *)NULL)
    return bfd_reloc_continue;

  /* If this is an undefined symbol, return error */
  if (bfd_is_und_section (symbol->section)
      && (symbol->flags & BSF_WEAK) == 0)
    return bfd_reloc_undefined;

  /* Work out which section the relocation is targeted at and the
     initial relocation command value.  */
  if (bfd_is_com_section (symbol->section))
    relocation = 0;
  else
    relocation = symbol->value;

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

  pc = input_section->output_section->vma + input_section->output_offset +
    reloc_entry->address + 4;

  if ((relocation & 0xF0000000) != (pc & 0xF0000000))
    return bfd_reloc_overflow;

  return bfd_reloc_continue;
}
static void MY ( set_arch_mach  ) [static]

Definition at line 51 of file mipsbsd.c.

{
  enum bfd_architecture arch;
  unsigned int machine;

  /* Determine the architecture and machine type of the object file.  */
  switch (machtype)
    {
    case M_MIPS1:
      arch = bfd_arch_mips;
      machine = bfd_mach_mips3000;
      break;

    case M_MIPS2:
      arch = bfd_arch_mips;
      machine = bfd_mach_mips4000;
      break;

    default:
      arch = bfd_arch_obscure;
      machine = 0;
      break;
    }

  bfd_set_arch_mach (abfd, arch, machine);
}
static struct aout_backend_data MY ( backend_data  ) [static, read]
static bfd_reloc_status_type mips_fix_hi16_s PARAMS ( (bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)  ) [static]
static reloc_howto_type* MY() reloc_name_lookup ( bfd *abfd  ATTRIBUTE_UNUSED,
const char *  r_name 
) [static]

Definition at line 331 of file mipsbsd.c.

{
  unsigned int i;

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

  return NULL;
}

Here is the call graph for this function:

static reloc_howto_type* MY() reloc_type_lookup ( bfd abfd,
bfd_reloc_code_real_type  code 
) [static]

Definition at line 304 of file mipsbsd.c.

Here is the call graph for this function:

static bfd_boolean MY() write_object_contents ( bfd abfd) [static]

Definition at line 131 of file mipsbsd.c.

{
  struct external_exec exec_bytes;
  struct internal_exec *execp = exec_hdr (abfd);

  /* Magic number, maestro, please!  */
  switch (bfd_get_arch (abfd))
    {
    case bfd_arch_m68k:
      switch (bfd_get_mach (abfd))
       {
       case bfd_mach_m68010:
         N_SET_MACHTYPE (*execp, M_68010);
         break;
       default:
       case bfd_mach_m68020:
         N_SET_MACHTYPE (*execp, M_68020);
         break;
       }
      break;
    case bfd_arch_sparc:
      N_SET_MACHTYPE (*execp, M_SPARC);
      break;
    case bfd_arch_i386:
      N_SET_MACHTYPE (*execp, M_386);
      break;
    case bfd_arch_mips:
      switch (bfd_get_mach (abfd))
       {
       case bfd_mach_mips4000:
       case bfd_mach_mips6000:
         N_SET_MACHTYPE (*execp, M_MIPS2);
         break;
       default:
         N_SET_MACHTYPE (*execp, M_MIPS1);
         break;
       }
      break;
    default:
      N_SET_MACHTYPE (*execp, M_UNKNOWN);
    }

  MY (choose_reloc_size) (abfd);

  WRITE_HEADERS (abfd, execp);

  return TRUE;
}

Here is the call graph for this function:


Variable Documentation

Definition at line 456 of file mipsbsd.c.

Definition at line 415 of file mipsbsd.c.

reloc_howto_type mips_howto_table_ext[] [static]
Initial value:
 {
  {MIPS_RELOC_32,      0, 2, 32, FALSE, 0,  complain_overflow_bitfield, 0,
       "32",       FALSE, 0, 0xffffffff, FALSE},
  {MIPS_RELOC_JMP,     2, 2, 26, FALSE, 0, complain_overflow_dont,
       mips_fix_jmp_addr,
       "MIPS_JMP", FALSE, 0, 0x03ffffff, FALSE},
  {MIPS_RELOC_WDISP16, 2, 2, 16, TRUE,  0, complain_overflow_signed, 0,
       "WDISP16",  FALSE, 0, 0x0000ffff, FALSE},
  {MIPS_RELOC_HI16,   16, 2, 16, FALSE, 0, complain_overflow_bitfield, 0,
       "HI16",     FALSE, 0, 0x0000ffff, FALSE},
  {MIPS_RELOC_HI16_S, 16, 2, 16, FALSE, 0, complain_overflow_bitfield,
        mips_fix_hi16_s,
        "HI16_S",   FALSE, 0, 0x0000ffff, FALSE},
  {MIPS_RELOC_LO16,    0, 2, 16, FALSE, 0, complain_overflow_dont, 0,
       "LO16",     FALSE, 0, 0x0000ffff, FALSE},
}

Definition at line 286 of file mipsbsd.c.