Stop using bfd_usrdata in libbfd.
	* coff-stgo32.c (bfd_coff_go32stub): Remove.
	(stub_bytes, comment): Replace STUBSIZE by GO32_STUBSIZE.
	(adjust_filehdr_in_post): Declare the abfd parameter as unused.
	Replace STUBSIZE by GO32_STUBSIZE.  Save now the stub in
	filehdr_dst->u.go32.stub.  New comment with the reason.
	(adjust_filehdr_out_pre): Replace STUBSIZE by GO32_STUBSIZE.
	Substitute the removed macro bfd_coff_go32stub.
	(adjust_filehdr_out_post, adjust_scnhdr_in_post, adjust_scnhdr_out_pre)
	(adjust_scnhdr_out_post, adjust_aux_in_post, adjust_aux_out_pre)
	(adjust_aux_out_post): Replace STUBSIZE by GO32_STUBSIZE.
	(create_go32_stub, go32_stubbed_coff_bfd_copy_private_bfd_data):
	Replace STUBSIZE by GO32_STUBSIZE.  Substitute the removed macro
	bfd_coff_go32stub.
	* coffcode.h (coff_mkobject_hook): Initialize coff->go32stub.
	* libcoff-in.h (coff_data_type): New field go32stub.
	* libcoff.h: Regenerated.

include/coff/
	Stop using bfd_usrdata in libbfd.
	* go32exe.h (struct external_filehdr_go32_exe <stub>, FILHSZ): Replace
	STUBSIZE by GO32_STUBSIZE.
	(STUBSIZE): Move the definition ...
	* internal.h (GO32_STUBSIZE): ... here and rename it.
	(struct internal_filehdr <go32stub>, F_GO32STUB): New.
This commit is contained in:
Jan Kratochvil
2009-08-10 21:56:42 +00:00
parent e39e47bd25
commit 9bf609ecf2
8 changed files with 98 additions and 57 deletions

View File

@ -102,9 +102,6 @@ static bfd_boolean
#include "coff-i386.c"
/* I hold in the usrdata the stub. */
#define bfd_coff_go32stub bfd_usrdata
/* This macro is used, because I cannot assume the endianess of the
host system. */
#define _H(index) (H_GET_16 (abfd, (header+index*2)))
@ -112,7 +109,7 @@ static bfd_boolean
/* These bytes are a 2048-byte DOS executable, which loads the COFF
image into memory and then runs it. It is called 'stub'. */
static const unsigned char stub_bytes[STUBSIZE] =
static const unsigned char stub_bytes[GO32_STUBSIZE] =
{
#include "go32stub.h"
};
@ -120,7 +117,7 @@ static const unsigned char stub_bytes[STUBSIZE] =
/*
I have not commented each swap function below, because the
technique is in any function the same. For the ...in function,
all the pointers are adjusted by adding STUBSIZE and for the
all the pointers are adjusted by adding GO32_STUBSIZE and for the
...out function, it is subtracted first and after calling the
standard swap function it is reset to the old value. */
@ -132,26 +129,20 @@ static const unsigned char stub_bytes[STUBSIZE] =
static void
adjust_filehdr_in_post (abfd, src, dst)
bfd *abfd;
bfd *abfd ATTRIBUTE_UNUSED;
PTR src;
PTR dst;
{
FILHDR *filehdr_src = (FILHDR *) src;
struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
ADJUST_VAL (filehdr_dst->f_symptr, STUBSIZE);
ADJUST_VAL (filehdr_dst->f_symptr, GO32_STUBSIZE);
/* Save now the stub to be used later. FIXME: Memory leak as the caller
coff_object_p does bfd_release afterwards. */
bfd_coff_go32stub (abfd) = bfd_malloc ((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);
/* Save now the stub to be used later. Put the stub data to FILEHDR_DST
first as coff_data (abfd) still does not exist. It may not even be ever
created as we are just checking the file format of ABFD. */
memcpy (filehdr_dst->go32stub, filehdr_src->stub, GO32_STUBSIZE);
filehdr_dst->f_flags |= F_GO32STUB;
}
static void
@ -167,13 +158,13 @@ adjust_filehdr_out_pre (abfd, in, out)
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);
if (coff_data (abfd)->go32stub != NULL)
memcpy (filehdr_out->stub, coff_data (abfd)->go32stub, GO32_STUBSIZE);
else
/* Use the default. */
memcpy (filehdr_out->stub, stub_bytes, STUBSIZE);
memcpy (filehdr_out->stub, stub_bytes, GO32_STUBSIZE);
ADJUST_VAL (filehdr_in->f_symptr, -STUBSIZE);
ADJUST_VAL (filehdr_in->f_symptr, -GO32_STUBSIZE);
}
static void
@ -184,7 +175,7 @@ adjust_filehdr_out_post (abfd, in, out)
{
struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
/* Undo the above change. */
ADJUST_VAL (filehdr_in->f_symptr, STUBSIZE);
ADJUST_VAL (filehdr_in->f_symptr, GO32_STUBSIZE);
}
static void
@ -195,9 +186,9 @@ adjust_scnhdr_in_post (abfd, ext, in)
{
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);
ADJUST_VAL (scnhdr_int->s_scnptr, GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_relptr, GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_lnnoptr, GO32_STUBSIZE);
}
static void
@ -208,9 +199,9 @@ adjust_scnhdr_out_pre (abfd, in, out)
{
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);
ADJUST_VAL (scnhdr_int->s_scnptr, -GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_relptr, -GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_lnnoptr, -GO32_STUBSIZE);
}
static void
@ -221,9 +212,9 @@ adjust_scnhdr_out_post (abfd, in, out)
{
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);
ADJUST_VAL (scnhdr_int->s_scnptr, GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_relptr, GO32_STUBSIZE);
ADJUST_VAL (scnhdr_int->s_lnnoptr, GO32_STUBSIZE);
}
static void
@ -240,7 +231,7 @@ adjust_aux_in_post (abfd, ext1, type, class, indx, numaux, in1)
if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
{
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, STUBSIZE);
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, GO32_STUBSIZE);
}
}
@ -258,7 +249,7 @@ adjust_aux_out_pre (abfd, inp, type, class, indx, numaux, extp)
if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
{
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, -STUBSIZE);
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, -GO32_STUBSIZE);
}
}
@ -276,7 +267,7 @@ adjust_aux_out_post (abfd, inp, type, class, indx, numaux, extp)
if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
{
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, STUBSIZE);
ADJUST_VAL (in->x_sym.x_fcnary.x_fcn.x_lnnoptr, GO32_STUBSIZE);
}
}
@ -297,7 +288,7 @@ create_go32_stub (abfd)
bfd *abfd;
{
/* Do it only once. */
if (bfd_coff_go32stub (abfd) == NULL)
if (coff_data (abfd)->go32stub == NULL)
{
char *stub;
struct stat st;
@ -363,32 +354,31 @@ create_go32_stub (abfd)
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)
coff_data (abfd)->go32stub = bfd_alloc (abfd, (bfd_size_type) coff_start);
if (coff_data (abfd)->go32stub == NULL)
{
close (f);
return;
}
lseek (f, 0L, SEEK_SET);
if ((unsigned long) read (f, bfd_coff_go32stub (abfd), coff_start)
if ((unsigned long) read (f, coff_data (abfd)->go32stub, coff_start)
!= coff_start)
{
bfd_release (abfd, bfd_coff_go32stub (abfd));
bfd_coff_go32stub (abfd) = NULL;
bfd_release (abfd, coff_data (abfd)->go32stub);
coff_data (abfd)->go32stub = NULL;
}
close (f);
}
stub_end:
/* There was something wrong above, so use now the standard builtin
stub. */
if (bfd_coff_go32stub (abfd) == NULL)
if (coff_data (abfd)->go32stub == NULL)
{
bfd_coff_go32stub (abfd)
= (PTR) bfd_alloc (abfd, (bfd_size_type) STUBSIZE);
if (bfd_coff_go32stub (abfd) == NULL)
coff_data (abfd)->go32stub
= bfd_alloc (abfd, (bfd_size_type) GO32_STUBSIZE);
if (coff_data (abfd)->go32stub == NULL)
return;
memcpy (bfd_coff_go32stub (abfd), stub_bytes, STUBSIZE);
memcpy (coff_data (abfd)->go32stub, stub_bytes, GO32_STUBSIZE);
}
}
@ -405,17 +395,19 @@ go32_stubbed_coff_bfd_copy_private_bfd_data (ibfd, obfd)
return TRUE;
/* Check if we have a source stub. */
if (bfd_coff_go32stub (ibfd) == NULL)
if (coff_data (ibfd)->go32stub == NULL)
return TRUE;
/* As adjust_filehdr_out_pre may get called only after this function,
optionally allocate the output stub. */
if (bfd_coff_go32stub (obfd) == NULL)
bfd_coff_go32stub (obfd) = bfd_alloc (obfd, (bfd_size_type) STUBSIZE);
if (coff_data (obfd)->go32stub == NULL)
coff_data (obfd)->go32stub = bfd_alloc (obfd,
(bfd_size_type) GO32_STUBSIZE);
/* Now copy the stub. */
if (bfd_coff_go32stub (obfd) != NULL)
memcpy (bfd_coff_go32stub (obfd), bfd_coff_go32stub (ibfd), STUBSIZE);
if (coff_data (obfd)->go32stub != NULL)
memcpy (coff_data (obfd)->go32stub, coff_data (ibfd)->go32stub,
GO32_STUBSIZE);
return TRUE;
}