Back to index

cell-binutils  2.17cvs20070401
Defines | Functions | Variables
coff-stgo32.c File Reference
#include "bfd.h"
#include "coff-i386.c"
#include "go32stub.h"

Go to the source code of this file.

Defines

#define TARGET_SYM   go32stubbedcoff_vec
#define TARGET_NAME   "coff-go32-exe"
#define TARGET_UNDERSCORE   '_'
#define COFF_GO32_EXE
#define COFF_LONG_SECTION_NAMES
#define COFF_SUPPORT_GNU_LINKONCE
#define COFF_LONG_FILENAMES
#define COFF_SECTION_ALIGNMENT_ENTRIES
#define COFF_ADJUST_FILEHDR_IN_POST   adjust_filehdr_in_post
#define COFF_ADJUST_FILEHDR_OUT_PRE   adjust_filehdr_out_pre
#define COFF_ADJUST_FILEHDR_OUT_POST   adjust_filehdr_out_post
#define COFF_ADJUST_SCNHDR_IN_POST   adjust_scnhdr_in_post
#define COFF_ADJUST_SCNHDR_OUT_PRE   adjust_scnhdr_out_pre
#define COFF_ADJUST_SCNHDR_OUT_POST   adjust_scnhdr_out_post
#define COFF_ADJUST_AUX_IN_POST   adjust_aux_in_post
#define COFF_ADJUST_AUX_OUT_PRE   adjust_aux_out_pre
#define COFF_ADJUST_AUX_OUT_POST   adjust_aux_out_post
#define coff_bfd_copy_private_bfd_data   go32_stubbed_coff_bfd_copy_private_bfd_data
#define bfd_coff_go32stub   bfd_usrdata
#define _H(index)   (H_GET_16 (abfd, (header+index*2)))
#define ADJUST_VAL(val, diff)   if (val != 0) val += diff

Functions

static void adjust_filehdr_in_post PARAMS ((bfd *, PTR, PTR))
static void adjust_aux_in_post PARAMS ((bfd *, PTR, int, int, int, int, PTR))
static void create_go32_stub PARAMS ((bfd *))
static bfd_boolean
go32_stubbed_coff_bfd_copy_private_bfd_data 
PARAMS ((bfd *, bfd *))
static void adjust_filehdr_in_post (bfd *abfd, PTR src, PTR dst)
static void adjust_filehdr_out_pre (bfd *abfd, PTR in, PTR out)
static void adjust_filehdr_out_post (abfd, PTR in, out)
static void adjust_scnhdr_in_post (abfd, ext, PTR in)
static void adjust_scnhdr_out_pre (abfd, PTR in, out)
static void adjust_scnhdr_out_post (abfd, PTR in, out)
static void adjust_aux_in_post (abfd, ext1, int type, int class, indx, numaux, PTR in1)
static void adjust_aux_out_pre (abfd, PTR inp, int type, int class, indx, numaux, extp)
static void adjust_aux_out_post (abfd, PTR inp, int type, int class, indx, numaux, extp)
static void create_go32_stub (bfd *abfd)
static bfd_boolean go32_stubbed_coff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)

Variables

static const unsigned char stub_bytes [STUBSIZE]

Define Documentation

#define _H (   index)    (H_GET_16 (abfd, (header+index*2)))

Definition at line 108 of file coff-stgo32.c.

#define ADJUST_VAL (   val,
  diff 
)    if (val != 0) val += diff

Definition at line 128 of file coff-stgo32.c.

Definition at line 104 of file coff-stgo32.c.

Definition at line 92 of file coff-stgo32.c.

Definition at line 94 of file coff-stgo32.c.

Definition at line 93 of file coff-stgo32.c.

Definition at line 84 of file coff-stgo32.c.

Definition at line 86 of file coff-stgo32.c.

Definition at line 85 of file coff-stgo32.c.

Definition at line 88 of file coff-stgo32.c.

Definition at line 90 of file coff-stgo32.c.

Definition at line 89 of file coff-stgo32.c.

Definition at line 99 of file coff-stgo32.c.

#define COFF_GO32_EXE

Definition at line 40 of file coff-stgo32.c.

Definition at line 43 of file coff-stgo32.c.

Definition at line 41 of file coff-stgo32.c.

Value:
{ COFF_SECTION_NAME_EXACT_MATCH (".data"), \
  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_EXACT_MATCH (".text"), \
  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
{ COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi"), \
  COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }

Definition at line 45 of file coff-stgo32.c.

Definition at line 42 of file coff-stgo32.c.

#define TARGET_NAME   "coff-go32-exe"

Definition at line 38 of file coff-stgo32.c.

Definition at line 37 of file coff-stgo32.c.

#define TARGET_UNDERSCORE   '_'

Definition at line 39 of file coff-stgo32.c.


Function Documentation

static void adjust_aux_in_post ( abfd  ,
ext1  ,
int  type,
int  class,
indx  ,
numaux  ,
PTR  in1 
) [static]

Definition at line 227 of file coff-stgo32.c.

{
  union internal_auxent *in = (union internal_auxent *) in1;

  if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
    {
      ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, STUBSIZE);
    }
}
static void adjust_aux_out_post ( abfd  ,
PTR  inp,
int  type,
int  class,
indx  ,
numaux  ,
extp   
) [static]

Definition at line 263 of file coff-stgo32.c.

{
  union internal_auxent *in = (union internal_auxent *) inp;

  if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
    {
      ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, STUBSIZE);
    }
}
static void adjust_aux_out_pre ( abfd  ,
PTR  inp,
int  type,
int  class,
indx  ,
numaux  ,
extp   
) [static]

Definition at line 245 of file coff-stgo32.c.

{
  union internal_auxent *in = (union internal_auxent *) inp;

  if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
    {
      ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, -STUBSIZE);
    }
}
static void adjust_filehdr_in_post ( bfd abfd,
PTR  src,
PTR  dst 
) [static]

Definition at line 132 of file coff-stgo32.c.

{
  FILHDR *filehdr_src = (FILHDR *) src;
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;

  ADJUST_VAL (filehdr_dst->f_symptr, STUBSIZE);

  /* Save now the stub to be used later.  */
  bfd_coff_go32stub (abfd) = (PTR) bfd_alloc (abfd, (bfd_size_type) STUBSIZE);

  /* Since this function returns no status, I do not set here
     any bfd_error_...
     That means, before the use of bfd_coff_go32stub (), this value
     should be checked if it is != NULL.  */
  if (bfd_coff_go32stub (abfd) == NULL)
    return;
  memcpy (bfd_coff_go32stub (abfd), filehdr_src->stub, STUBSIZE);
}

Here is the call graph for this function:

static void adjust_filehdr_out_post ( abfd  ,
PTR  in,
out   
) [static]

Definition at line 177 of file coff-stgo32.c.

{
  struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
  /* Undo the above change.  */
  ADJUST_VAL (filehdr_in->f_symptr, STUBSIZE);
}
static void adjust_filehdr_out_pre ( bfd abfd,
PTR  in,
PTR  out 
) [static]

Definition at line 155 of file coff-stgo32.c.

{
  struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
  FILHDR *filehdr_out = (FILHDR *) out;

  /* Generate the stub.  */
  create_go32_stub (abfd);

  /* Copy the stub to the file header.  */
  if (bfd_coff_go32stub (abfd) != NULL)
    memcpy (filehdr_out->stub, bfd_coff_go32stub (abfd), STUBSIZE);
  else
    /* Use the default.  */
    memcpy (filehdr_out->stub, stub_bytes, STUBSIZE);

  ADJUST_VAL (filehdr_in->f_symptr, -STUBSIZE);
}

Here is the call graph for this function:

static void adjust_scnhdr_in_post ( abfd  ,
ext  ,
PTR  in 
) [static]

Definition at line 188 of file coff-stgo32.c.

{
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;

  ADJUST_VAL (scnhdr_int->s_scnptr, STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_relptr, STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_lnnoptr, STUBSIZE);
}
static void adjust_scnhdr_out_post ( abfd  ,
PTR  in,
out   
) [static]

Definition at line 214 of file coff-stgo32.c.

{
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;

  ADJUST_VAL (scnhdr_int->s_scnptr, STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_relptr, STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_lnnoptr, STUBSIZE);
}
static void adjust_scnhdr_out_pre ( abfd  ,
PTR  in,
out   
) [static]

Definition at line 201 of file coff-stgo32.c.

{
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;

  ADJUST_VAL (scnhdr_int->s_scnptr, -STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_relptr, -STUBSIZE);
  ADJUST_VAL (scnhdr_int->s_lnnoptr, -STUBSIZE);
}
static void create_go32_stub ( bfd abfd) [static]

Definition at line 293 of file coff-stgo32.c.

{
  /* Do it only once.  */
  if (bfd_coff_go32stub (abfd) == NULL)
    {
      char *stub;
      struct stat st;
      int f;
      unsigned char header[10];
      char magic[8];
      unsigned long coff_start;
      long exe_start;

      /* Check at first the environment variable $(GO32STUB).  */
      stub = getenv ("GO32STUB");
      /* Now check the environment variable $(STUB).  */
      if (stub == NULL)
       stub = getenv ("STUB");
      if (stub == NULL)
       goto stub_end;
      if (stat (stub, &st) != 0)
       goto stub_end;
#ifdef O_BINARY
      f = open (stub, O_RDONLY | O_BINARY);
#else
      f = open (stub, O_RDONLY);
#endif
      if (f < 0)
       goto stub_end;
      if (read (f, &header, sizeof (header)) < 0)
       {
         close (f);
         goto stub_end;
       }
      if (_H (0) != 0x5a4d) /* It is not an exe file.  */
       {
         close (f);
         goto stub_end;
       }
      /* Compute the size of the stub (it is every thing up
         to the beginning of the coff image).  */
      coff_start = (long) _H (2) * 512L;
      if (_H (1))
       coff_start += (long) _H (1) - 512L;

      /* Currently there is only a fixed stub size of 2048 bytes
         supported.  */
      if (coff_start != 2048)
       {
         close (f);
         goto stub_end;
       }
      exe_start = _H (4) * 16;
      if ((long) lseek (f, exe_start, SEEK_SET) != exe_start)
       {
         close (f);
         goto stub_end;
       }
      if (read (f, &magic, 8) != 8)
       {
         close (f);
         goto stub_end;
       }
      if (! CONST_STRNEQ (magic, "go32stub"))
       {
         close (f);
         goto stub_end;
       }
      /* Now we found a correct stub (hopefully).  */
      bfd_coff_go32stub (abfd)
       = (PTR) bfd_alloc (abfd, (bfd_size_type) coff_start);
      if (bfd_coff_go32stub (abfd) == NULL)
       {
         close (f);
         return;
       }
      lseek (f, 0L, SEEK_SET);
      if ((unsigned long) read (f, bfd_coff_go32stub (abfd), coff_start)
         != coff_start)
       {
         bfd_release (abfd, bfd_coff_go32stub (abfd));
         bfd_coff_go32stub (abfd) = NULL;
       }
      close (f);
    }
stub_end:
  /* There was something wrong above, so use now the standard builtin
     stub.  */
  if (bfd_coff_go32stub (abfd) == NULL)
    {
      bfd_coff_go32stub (abfd)
       = (PTR) bfd_alloc (abfd, (bfd_size_type) STUBSIZE);
      if (bfd_coff_go32stub (abfd) == NULL)
       return;
      memcpy (bfd_coff_go32stub (abfd), stub_bytes, STUBSIZE);
    }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static bfd_boolean go32_stubbed_coff_bfd_copy_private_bfd_data ( bfd ibfd,
bfd obfd 
) [static]

Definition at line 396 of file coff-stgo32.c.

{
  /* Check if both are the same targets.  */
  if (ibfd->xvec != obfd->xvec)
    return TRUE;

  /* Check if both have a valid stub.  */
  if (bfd_coff_go32stub (ibfd) == NULL
      || bfd_coff_go32stub (obfd) == NULL)
    return TRUE;

  /* Now copy the stub.  */
  memcpy (bfd_coff_go32stub (obfd), bfd_coff_go32stub (ibfd), STUBSIZE);

  return TRUE;
}
static void adjust_filehdr_in_post PARAMS ( (bfd *, PTR, PTR ) [static]
static void adjust_aux_in_post PARAMS ( (bfd *, PTR, int, int, int, int, PTR ) [static]
static void create_go32_stub PARAMS ( (bfd *)  ) [static]

Variable Documentation

Definition at line 113 of file coff-stgo32.c.