* aout-adobe.c, cpu-h8300.c, mipsbsd.c, srec.c: lint -Wall.
This commit is contained in:
parent
df2a1bd7d9
commit
8f8fefccf5
3 changed files with 492 additions and 136 deletions
|
@ -112,6 +112,8 @@ aout_adobe_object_p (abfd)
|
|||
take just about any a.out file as an Adobe a.out file. FIXME! */
|
||||
|
||||
if (N_BADMAG (anexec)) {
|
||||
extern char *getenv ();
|
||||
|
||||
targ = getenv ("GNUTARGET");
|
||||
if (targ && !strcmp (targ, a_out_adobe_vec.name))
|
||||
; /* Just continue anyway, if specifically set to this format */
|
||||
|
@ -275,7 +277,7 @@ aout_adobe_write_object_contents (abfd)
|
|||
bfd *abfd;
|
||||
{
|
||||
struct external_exec swapped_hdr;
|
||||
static struct external_segdesc sentinel[1] = {0};
|
||||
static struct external_segdesc sentinel[1]; /* Initialized to zero */
|
||||
asection *sect;
|
||||
|
||||
exec_hdr (abfd)->a_info = ZMAGIC;
|
||||
|
@ -475,6 +477,10 @@ DEFUN(aout_adobe_sizeof_headers,(ignore_abfd, ignore),
|
|||
#define aout_32_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
|
||||
#define aout_32_bfd_relax_section bfd_generic_relax_section
|
||||
#define aout_32_bfd_seclet_link bfd_generic_seclet_link
|
||||
#define aout_32_bfd_reloc_type_lookup \
|
||||
((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
|
||||
#define aout_32_bfd_make_debug_symbol \
|
||||
((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
|
||||
|
||||
bfd_target a_out_adobe_vec =
|
||||
{
|
||||
|
@ -501,6 +507,6 @@ bfd_target a_out_adobe_vec =
|
|||
{bfd_false, aout_adobe_write_object_contents, /* bfd_write_contents */
|
||||
_bfd_write_archive_contents, bfd_false},
|
||||
|
||||
JUMP_TABLE(aout_32)
|
||||
};
|
||||
|
||||
JUMP_TABLE(aout_32),
|
||||
(PTR) 0
|
||||
};
|
||||
|
|
|
@ -32,6 +32,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#define PAGE_SIZE 4096
|
||||
#define SEGMENT_SIZE PAGE_SIZE
|
||||
#define DEFAULT_ARCH bfd_arch_mips
|
||||
#define MACHTYPE_OK(mtype) ((mtype) == M_UNKNOWN \
|
||||
|| (mtype) == M_MIPS1 || (mtype) == M_MIPS2)
|
||||
#define MY_symbol_leading_char '\0'
|
||||
|
||||
#define MY(OP) CAT(mipsbsd_,OP)
|
||||
|
@ -210,18 +212,18 @@ mips_fix_hi16_s (abfd,reloc_entry,symbol,data,input_section,output_bfd)
|
|||
}
|
||||
|
||||
static reloc_howto_type mips_howto_table_ext[] = {
|
||||
MIPS_RELOC_32, 0, 2, 32, false, 0, true, true, 0,
|
||||
"32", false, 0, 0xffffffff, false,
|
||||
MIPS_RELOC_JMP, 2, 2, 26, false, 0, false, true, 0,
|
||||
"MIPS_JMP", false, 0, 0x03ffffff, false,
|
||||
MIPS_RELOC_WDISP16, 2, 1, 16, true, 0, false, true, 0,
|
||||
"WDISP16", false, 0, 0x0000ffff, false,
|
||||
MIPS_RELOC_HI16, 16, 1, 16, false, 0, false, true, 0,
|
||||
"HI16", false, 0, 0x0000ffff, false,
|
||||
MIPS_RELOC_HI16_S, 16, 1, 16, false, 0, false, true, mips_fix_hi16_s,
|
||||
"HI16_S", false, 0, 0x0000ffff, false,
|
||||
MIPS_RELOC_LO16, 0, 1, 16, false, 0, false, true, 0,
|
||||
"LO16", false, 0, 0x0000ffff, false,
|
||||
{MIPS_RELOC_32, 0, 2, 32, false, 0, true, true, 0,
|
||||
"32", false, 0, 0xffffffff, false},
|
||||
{MIPS_RELOC_JMP, 2, 2, 26, false, 0, false, true, 0,
|
||||
"MIPS_JMP", false, 0, 0x03ffffff, false},
|
||||
{MIPS_RELOC_WDISP16, 2, 1, 16, true, 0, false, true, 0,
|
||||
"WDISP16", false, 0, 0x0000ffff, false},
|
||||
{MIPS_RELOC_HI16, 16, 1, 16, false, 0, false, true, 0,
|
||||
"HI16", false, 0, 0x0000ffff, false},
|
||||
{MIPS_RELOC_HI16_S, 16, 1, 16, false, 0, false, true, mips_fix_hi16_s,
|
||||
"HI16_S", false, 0, 0x0000ffff, false},
|
||||
{MIPS_RELOC_LO16, 0, 1, 16, false, 0, false, true, 0,
|
||||
"LO16", false, 0, 0x0000ffff, false},
|
||||
};
|
||||
|
||||
static reloc_howto_type *
|
||||
|
@ -229,7 +231,6 @@ MY(reloc_howto_type_lookup) (abfd, code)
|
|||
bfd *abfd;
|
||||
bfd_reloc_code_real_type code;
|
||||
{
|
||||
extern reloc_howto_type NAME(aout,ext_howto_table)[];
|
||||
|
||||
if (bfd_get_arch (abfd) != bfd_arch_mips)
|
||||
return 0;
|
||||
|
|
587
bfd/srec.c
587
bfd/srec.c
|
@ -1,5 +1,5 @@
|
|||
/* BFD back-end for s-record objects.
|
||||
Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
|
||||
Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
|
||||
|
||||
This file is part of BFD, the Binary File Descriptor library.
|
||||
|
@ -20,14 +20,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
/*
|
||||
SUBSECTION
|
||||
S-record handling
|
||||
S-Record handling
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
S-records cannot hold anything but addresses and data, so
|
||||
that's all that we implement.
|
||||
Ordinary S-Records cannot hold anything but addresses and
|
||||
data, so that's all that we implement.
|
||||
|
||||
The only interesting thing is that s-records may come out of
|
||||
The only interesting thing is that S-Records may come out of
|
||||
order and there is no header, so an initial scan is required
|
||||
to discover the minimum and maximum addresses used to create
|
||||
the vma and size of the only section we create. We
|
||||
|
@ -69,7 +69,38 @@ DESCRIPTION
|
|||
o checksum
|
||||
is the sum of all the raw byte data in the record, from the length
|
||||
upwards, modulo 256 and subtracted from 255.
|
||||
|
||||
|
||||
|
||||
SUBSECTION
|
||||
Symbol S-Record handling
|
||||
|
||||
DESCRIPTION
|
||||
Some ICE equipment understands an addition to the standard
|
||||
S-Record format; symbols and their addresses can be sent
|
||||
before the data.
|
||||
|
||||
The format of this is:
|
||||
($$ <modulename>
|
||||
(<space> <symbol> <address>)*)
|
||||
$$
|
||||
|
||||
so a short symbol table could look like:
|
||||
|
||||
EXAMPLE
|
||||
$$ flash.x
|
||||
$$ flash.c
|
||||
_port6 $0
|
||||
_delay $4
|
||||
_start $14
|
||||
_etext $8036
|
||||
_edata $8036
|
||||
_end $8036
|
||||
$$
|
||||
|
||||
DESCRIPTION
|
||||
We allow symbols to be anywhere in the data stream - the module names
|
||||
are always ignored.
|
||||
|
||||
*/
|
||||
|
||||
#include "bfd.h"
|
||||
|
@ -137,6 +168,7 @@ struct srec_data_list_struct
|
|||
bfd_vma where;
|
||||
bfd_size_type size;
|
||||
struct srec_data_list_struct *next;
|
||||
|
||||
|
||||
} ;
|
||||
typedef struct srec_data_list_struct srec_data_list_type;
|
||||
|
@ -146,18 +178,63 @@ typedef struct srec_data_struct
|
|||
{
|
||||
srec_data_list_type *head;
|
||||
unsigned int type;
|
||||
|
||||
|
||||
int done_symbol_read;
|
||||
int count;
|
||||
asymbol *symbols;
|
||||
char *strings;
|
||||
int symbol_idx;
|
||||
int string_size;
|
||||
int string_idx;
|
||||
} tdata_type;
|
||||
|
||||
|
||||
|
||||
#define enda(x) (x->vma + x->size)
|
||||
/*
|
||||
called once per input s-record, used to work out vma and size of data.
|
||||
called once per input S-Record, used to work out vma and size of data.
|
||||
*/
|
||||
|
||||
static bfd_vma low,high;
|
||||
|
||||
static void
|
||||
size_symbols(abfd, buf, len, val)
|
||||
bfd *abfd;
|
||||
char *buf;
|
||||
int len;
|
||||
int val;
|
||||
{
|
||||
abfd->symcount ++;
|
||||
abfd->tdata.srec_data->string_size += len + 1;
|
||||
}
|
||||
|
||||
static void
|
||||
fillup_symbols(abfd, buf, len, val)
|
||||
bfd *abfd;
|
||||
char *buf;
|
||||
int len;
|
||||
int val;
|
||||
{
|
||||
if (!abfd->tdata.srec_data->done_symbol_read)
|
||||
{
|
||||
asymbol *p;
|
||||
if (abfd->tdata.srec_data->symbols == 0)
|
||||
{
|
||||
abfd->tdata.srec_data->symbols = (asymbol *)bfd_alloc(abfd, abfd->symcount * sizeof(asymbol));
|
||||
abfd->tdata.srec_data->strings = (char*)bfd_alloc(abfd, abfd->tdata.srec_data->string_size);
|
||||
abfd->tdata.srec_data->symbol_idx = 0;
|
||||
abfd->tdata.srec_data->string_idx = 0;
|
||||
}
|
||||
|
||||
p = abfd->tdata.srec_data->symbols + abfd->tdata.srec_data->symbol_idx++;
|
||||
p->the_bfd = abfd;
|
||||
p->name = abfd->tdata.srec_data->strings + abfd->tdata.srec_data->string_idx;
|
||||
memcpy((char *)(p->name), buf, len+1);
|
||||
abfd->tdata.srec_data->string_idx += len + 1;
|
||||
p->value = val;
|
||||
p->flags = BSF_EXPORT | BSF_GLOBAL;
|
||||
p->section = &bfd_abs_section;
|
||||
p->udata = 0;
|
||||
}
|
||||
}
|
||||
static void
|
||||
DEFUN(size_srec,(abfd, section, address, raw, length),
|
||||
bfd *abfd AND
|
||||
|
@ -174,7 +251,7 @@ DEFUN(size_srec,(abfd, section, address, raw, length),
|
|||
|
||||
|
||||
/*
|
||||
called once per input s-record, copies data from input into bfd_alloc'd area
|
||||
called once per input S-Record, copies data from input into bfd_alloc'd area
|
||||
*/
|
||||
|
||||
static void
|
||||
|
@ -187,8 +264,7 @@ unsigned int length)
|
|||
{
|
||||
unsigned int i;
|
||||
bfd_byte *dst =
|
||||
(bfd_byte *)(section->used_by_bfd) +
|
||||
address - section->vma;
|
||||
(bfd_byte *)(section->used_by_bfd) + address - section->vma;
|
||||
/* length -1 because we don't read in the checksum */
|
||||
for (i = 0; i < length -1 ; i++) {
|
||||
*dst = HEX(raw);
|
||||
|
@ -197,110 +273,229 @@ unsigned int length)
|
|||
}
|
||||
}
|
||||
|
||||
/* Pass over an s-record file, calling one of the above functions on each
|
||||
/* Pass over an S-Record file, calling one of the above functions on each
|
||||
record. */
|
||||
|
||||
static int white(x)
|
||||
char x;
|
||||
{
|
||||
return (x== ' ' || x == '\t' || x == '\n' || x == '\r');
|
||||
}
|
||||
static int
|
||||
skipwhite(src,abfd)
|
||||
char *src;
|
||||
bfd *abfd;
|
||||
{
|
||||
int eof = 0;
|
||||
while (white(*src) && !eof)
|
||||
{
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
return eof;
|
||||
}
|
||||
|
||||
static boolean
|
||||
DEFUN(srec_mkobject, (abfd),
|
||||
bfd *abfd)
|
||||
{
|
||||
if (abfd->tdata.srec_data == 0)
|
||||
{
|
||||
tdata_type *tdata = (tdata_type *)bfd_alloc(abfd, sizeof(tdata_type));
|
||||
abfd->tdata.srec_data = tdata;
|
||||
tdata->type = 1;
|
||||
tdata->head = (srec_data_list_type *)NULL;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
DEFUN(pass_over,(abfd, func, section),
|
||||
DEFUN(pass_over,(abfd, func, symbolfunc, section),
|
||||
bfd *abfd AND
|
||||
void (*func)() AND
|
||||
void (*symbolfunc)() AND
|
||||
asection *section)
|
||||
{
|
||||
unsigned int bytes_on_line;
|
||||
boolean eof = false;
|
||||
unsigned int bytes_on_line;
|
||||
boolean eof = false;
|
||||
|
||||
/* To the front of the file */
|
||||
bfd_seek(abfd, (file_ptr)0, SEEK_SET);
|
||||
while (eof == false)
|
||||
srec_mkobject(abfd);
|
||||
/* To the front of the file */
|
||||
bfd_seek(abfd, (file_ptr)0, SEEK_SET);
|
||||
while (eof == false)
|
||||
{
|
||||
char buffer[MAXCHUNK];
|
||||
char *src = buffer;
|
||||
char type;
|
||||
bfd_vma address = 0;
|
||||
|
||||
/* Find first 'S' or $ */
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
switch (*src)
|
||||
{
|
||||
char buffer[MAXCHUNK];
|
||||
char *src = buffer;
|
||||
char type;
|
||||
bfd_vma address = 0;
|
||||
default:
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
if (eof) return;
|
||||
break;
|
||||
|
||||
/* Find first 'S' */
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
while (*src!= 'S' && !eof) {
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
if (eof) break;
|
||||
src++;
|
||||
case '$':
|
||||
/* Inside a symbol definition - just ignore the module name */
|
||||
while (*src != '\n' && !eof)
|
||||
{
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
break;
|
||||
|
||||
/* Fetch the type and the length */
|
||||
bfd_read(src, 1, 3, abfd);
|
||||
case ' ':
|
||||
/* spaces - maybe just before a symbol */
|
||||
while (*src != '\n' && white(*src)) {
|
||||
eof = skipwhite(src, abfd);
|
||||
|
||||
type = *src++;
|
||||
{
|
||||
int val = 0;
|
||||
int slen = 0;
|
||||
char symbol[MAXCHUNK];
|
||||
|
||||
if (!ISHEX (src[0]) || !ISHEX (src[1]))
|
||||
break;
|
||||
/* get the symbol part */
|
||||
while (!eof && !white(*src) && slen < MAXCHUNK)
|
||||
{
|
||||
symbol[slen++] = *src;
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
symbol[slen] = 0;
|
||||
eof = skipwhite(src, abfd);
|
||||
/* skip the $ for the hex value */
|
||||
if (*src == '$')
|
||||
{
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
|
||||
bytes_on_line = HEX(src);
|
||||
/* Scan off the hex number */
|
||||
while (isxdigit(*src ))
|
||||
{
|
||||
val *= 16;
|
||||
if (isdigit(*src))
|
||||
val += *src - '0';
|
||||
else if (isupper(*src)) {
|
||||
val += *src - 'A' + 10;
|
||||
}
|
||||
else {
|
||||
val += *src - 'a' + 10;
|
||||
}
|
||||
eof = (boolean)(bfd_read(src, 1, 1, abfd) != 1);
|
||||
}
|
||||
symbolfunc(abfd, symbol, slen, val);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'S':
|
||||
src++;
|
||||
|
||||
if (bytes_on_line > MAXCHUNK/2)
|
||||
break;
|
||||
src+=2 ;
|
||||
/* Fetch the type and the length */
|
||||
bfd_read(src, 1, 3, abfd);
|
||||
|
||||
bfd_read(src, 1 , bytes_on_line * 2, abfd);
|
||||
type = *src++;
|
||||
|
||||
switch (type) {
|
||||
case '0':
|
||||
case '5':
|
||||
/* Prologue - ignore */
|
||||
break;
|
||||
case '3':
|
||||
address = HEX(src);
|
||||
src+=2;
|
||||
bytes_on_line--;
|
||||
if (!ISHEX (src[0]) || !ISHEX (src[1]))
|
||||
break;
|
||||
|
||||
bytes_on_line = HEX(src);
|
||||
|
||||
if (bytes_on_line > MAXCHUNK/2)
|
||||
break;
|
||||
src+=2 ;
|
||||
|
||||
bfd_read(src, 1 , bytes_on_line * 2, abfd);
|
||||
|
||||
switch (type) {
|
||||
case '0':
|
||||
case '5':
|
||||
/* Prologue - ignore */
|
||||
break;
|
||||
case '3':
|
||||
address = HEX(src);
|
||||
src+=2;
|
||||
bytes_on_line--;
|
||||
|
||||
case '2':
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
bytes_on_line--;
|
||||
case '1':
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
bytes_on_line-=2;
|
||||
func(abfd,section, address, src, bytes_on_line);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
case '2':
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
bytes_on_line--;
|
||||
case '1':
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
address = HEX(src) | (address<<8) ;
|
||||
src+=2;
|
||||
bytes_on_line-=2;
|
||||
func(abfd,section, address, src, bytes_on_line);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static bfd_target *
|
||||
object_p(abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
asection *section;
|
||||
/* We create one section called .text for all the contents,
|
||||
and allocate enough room for the entire file. */
|
||||
|
||||
section = bfd_make_section(abfd, ".text");
|
||||
section->_raw_size = 0;
|
||||
section->vma = 0xffffffff;
|
||||
low = 0xffffffff;
|
||||
high = 0;
|
||||
pass_over(abfd, size_srec, size_symbols, section);
|
||||
section->_raw_size = high - low;
|
||||
section->vma = low;
|
||||
section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
|
||||
|
||||
if (abfd->symcount)
|
||||
abfd->flags |= HAS_SYMS;
|
||||
return abfd->xvec;
|
||||
}
|
||||
|
||||
static bfd_target *
|
||||
DEFUN(srec_object_p, (abfd),
|
||||
bfd *abfd)
|
||||
{
|
||||
char b[4];
|
||||
asection *section;
|
||||
|
||||
srec_init();
|
||||
|
||||
bfd_seek(abfd, (file_ptr)0, SEEK_SET);
|
||||
bfd_read(b, 1, 4, abfd);
|
||||
|
||||
if (b[0] != 'S' || !ISHEX(b[1]) || !ISHEX(b[2]) || !ISHEX(b[3]))
|
||||
return (bfd_target*) NULL;
|
||||
return (bfd_target*) NULL;
|
||||
|
||||
/* We create one section called .text for all the contents,
|
||||
and allocate enough room for the entire file. */
|
||||
|
||||
section = bfd_make_section(abfd, ".text");
|
||||
section->_raw_size = 0;
|
||||
section->vma = 0xffffffff;
|
||||
low = 0xffffffff;
|
||||
high = 0;
|
||||
pass_over(abfd, size_srec, section);
|
||||
section->_raw_size = high - low;
|
||||
section->vma = low;
|
||||
section->flags = SEC_HAS_CONTENTS | SEC_LOAD | SEC_ALLOC;
|
||||
return object_p(abfd);
|
||||
}
|
||||
|
||||
|
||||
static bfd_target *
|
||||
DEFUN(symbolsrec_object_p, (abfd),
|
||||
bfd *abfd)
|
||||
{
|
||||
char b[4];
|
||||
|
||||
srec_init();
|
||||
|
||||
return abfd->xvec;
|
||||
bfd_seek(abfd, (file_ptr)0, SEEK_SET);
|
||||
bfd_read(b, 1, 4, abfd);
|
||||
|
||||
if (b[0] != '$' || b[1] != '$')
|
||||
return (bfd_target*) NULL;
|
||||
|
||||
return object_p(abfd);
|
||||
}
|
||||
|
||||
|
||||
|
@ -315,7 +510,8 @@ DEFUN(srec_get_section_contents,(abfd, section, location, offset, count),
|
|||
if (section->used_by_bfd == (PTR)NULL)
|
||||
{
|
||||
section->used_by_bfd = (PTR)bfd_alloc (abfd, section->_raw_size);
|
||||
pass_over(abfd, fillup, section);
|
||||
|
||||
pass_over(abfd, fillup, fillup_symbols, section);
|
||||
}
|
||||
(void) memcpy((PTR)location,
|
||||
(PTR)((char *)(section->used_by_bfd) + offset),
|
||||
|
@ -348,33 +544,34 @@ DEFUN(srec_set_section_contents,(abfd, section, location, offset, bytes_to_do),
|
|||
{
|
||||
tdata_type *tdata = abfd->tdata.srec_data;
|
||||
srec_data_list_type *entry = (srec_data_list_type *)
|
||||
bfd_alloc(abfd, sizeof(srec_data_list_type));
|
||||
bfd_alloc(abfd, sizeof(srec_data_list_type));
|
||||
|
||||
if ((section->flags & SEC_ALLOC)
|
||||
&& (section->flags & SEC_LOAD))
|
||||
{
|
||||
unsigned char *data = (unsigned char *) bfd_alloc(abfd, bytes_to_do);
|
||||
memcpy(data, location, bytes_to_do);
|
||||
|
||||
if ((section->vma + offset + bytes_to_do) <= 0xffff)
|
||||
{
|
||||
unsigned char *data = (unsigned char *) bfd_alloc(abfd, bytes_to_do);
|
||||
memcpy(data, location, bytes_to_do);
|
||||
|
||||
}
|
||||
else if ((section->vma + offset + bytes_to_do) <= 0xffffff
|
||||
&& tdata->type < 2)
|
||||
{
|
||||
tdata->type = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
tdata->type = 3;
|
||||
}
|
||||
if ((section->lma + offset + bytes_to_do) <= 0xffff)
|
||||
{
|
||||
|
||||
entry->data = data;
|
||||
entry->where = section->vma + offset;
|
||||
entry->size = bytes_to_do;
|
||||
entry->next = tdata->head;
|
||||
tdata->head = entry;
|
||||
}
|
||||
}
|
||||
else if ((section->lma + offset + bytes_to_do) <= 0xffffff
|
||||
&& tdata->type < 2)
|
||||
{
|
||||
tdata->type = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
tdata->type = 3;
|
||||
}
|
||||
|
||||
entry->data = data;
|
||||
entry->where = section->lma + offset;
|
||||
entry->size = bytes_to_do;
|
||||
entry->next = tdata->head;
|
||||
tdata->head = entry;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -506,33 +703,77 @@ DEFUN(srec_write_terminator,(abfd, tdata),
|
|||
abfd->start_address, buffer, buffer);
|
||||
}
|
||||
|
||||
static boolean
|
||||
DEFUN(srec_mkobject, (abfd),
|
||||
bfd *abfd)
|
||||
{
|
||||
tdata_type *tdata = (tdata_type *)bfd_alloc(abfd, sizeof(tdata_type));
|
||||
abfd->tdata.srec_data = tdata;
|
||||
tdata->type = 1;
|
||||
tdata->head = (srec_data_list_type *)NULL;
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
srec_write_symbols(abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
char buffer[MAXCHUNK];
|
||||
/* Dump out the symbols of a bfd */
|
||||
int i;
|
||||
int len = bfd_get_symcount(abfd);
|
||||
|
||||
if (len)
|
||||
{
|
||||
asymbol **table = bfd_get_outsymbols(abfd);
|
||||
sprintf(buffer, "$$ %s\r\n", abfd->filename);
|
||||
|
||||
bfd_write(buffer, strlen(buffer), 1, abfd);
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
asymbol *s = table[i];
|
||||
#if 0
|
||||
int len = strlen(s->name);
|
||||
|
||||
/* If this symbol has a .[ocs] in it, it's probably a file name
|
||||
and we'll output that as the module name */
|
||||
|
||||
if (len > 3 && s->name[len-2] == '.')
|
||||
{
|
||||
int l;
|
||||
sprintf(buffer, "$$ %s\n\r", s->name);
|
||||
l = strlen(buffer);
|
||||
bfd_write(buffer, l, 1, abfd);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (s->flags & (BSF_GLOBAL | BSF_LOCAL)
|
||||
&& (s->flags & BSF_DEBUGGING) == 0
|
||||
&& s->name[0] != '.'
|
||||
&& s->name[0] != 't')
|
||||
{
|
||||
/* Just dump out non debug symbols */
|
||||
|
||||
int l;
|
||||
sprintf(buffer," %s $%x\n\r", s->name, s->value + s->section->lma);
|
||||
l = strlen(buffer);
|
||||
bfd_write(buffer, l, 1,abfd);
|
||||
}
|
||||
}
|
||||
sprintf(buffer, "$$ \r\n");
|
||||
bfd_write(buffer, strlen(buffer), 1, abfd);
|
||||
}
|
||||
}
|
||||
|
||||
static boolean
|
||||
DEFUN(srec_write_object_contents,(abfd),
|
||||
bfd *abfd)
|
||||
internal_srec_write_object_contents(abfd, symbols)
|
||||
bfd *abfd;
|
||||
int symbols;
|
||||
{
|
||||
int bytes_written;
|
||||
tdata_type *tdata = abfd->tdata.srec_data;
|
||||
srec_data_list_type *list;
|
||||
|
||||
bytes_written = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
if (symbols)
|
||||
srec_write_symbols(abfd);
|
||||
|
||||
srec_write_header(abfd);
|
||||
|
||||
|
||||
/* Now wander though all the sections provided and output them */
|
||||
list = tdata->head;
|
||||
|
||||
|
@ -545,6 +786,20 @@ DEFUN(srec_write_object_contents,(abfd),
|
|||
return true;
|
||||
}
|
||||
|
||||
static boolean
|
||||
srec_write_object_contents(abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
return internal_srec_write_object_contents(abfd, 0);
|
||||
}
|
||||
|
||||
static boolean
|
||||
symbolsrec_write_object_contents(abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
return internal_srec_write_object_contents(abfd, 1);
|
||||
}
|
||||
|
||||
static int
|
||||
DEFUN(srec_sizeof_headers,(abfd, exec),
|
||||
bfd *abfd AND
|
||||
|
@ -561,14 +816,60 @@ DEFUN(srec_make_empty_symbol, (abfd),
|
|||
new->the_bfd = abfd;
|
||||
return new;
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
srec_get_symtab_upper_bound(abfd)
|
||||
bfd *abfd;
|
||||
{
|
||||
/* Read in all the info */
|
||||
srec_get_section_contents(abfd,abfd->sections,0,0,0);
|
||||
return (bfd_get_symcount(abfd) + 1) * (sizeof(asymbol *));
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
DEFUN(srec_get_symtab, (abfd, alocation),
|
||||
bfd *abfd AND
|
||||
asymbol **alocation)
|
||||
{
|
||||
int lim = abfd->symcount;
|
||||
int i;
|
||||
for (i = 0; i < lim; i++) {
|
||||
alocation[i] = abfd->tdata.srec_data->symbols + i;
|
||||
}
|
||||
alocation[i] = 0;
|
||||
return lim;
|
||||
}
|
||||
|
||||
void
|
||||
DEFUN(srec_print_symbol,(ignore_abfd, afile, symbol, how),
|
||||
bfd *ignore_abfd AND
|
||||
PTR afile AND
|
||||
asymbol *symbol AND
|
||||
bfd_print_symbol_type how)
|
||||
{
|
||||
FILE *file = (FILE *)afile;
|
||||
switch (how)
|
||||
{
|
||||
case bfd_print_symbol_name:
|
||||
fprintf (file, "%s", symbol->name);
|
||||
break;
|
||||
default:
|
||||
case bfd_print_symbol_nm:
|
||||
bfd_print_symbol_vandf ((PTR) file, symbol);
|
||||
fprintf (file, " %-5s %s",
|
||||
symbol->section->name,
|
||||
symbol->name);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#define FOO PROTO
|
||||
#define srec_new_section_hook (FOO(boolean, (*), (bfd *, asection *)))bfd_true
|
||||
#define srec_get_symtab_upper_bound (PROTO(unsigned int, (*),(bfd *)))bfd_false
|
||||
#define srec_get_symtab (FOO(unsigned int, (*), (bfd *, asymbol **)))bfd_0
|
||||
|
||||
#define srec_get_reloc_upper_bound (FOO(unsigned int, (*),(bfd*, asection *)))bfd_false
|
||||
#define srec_canonicalize_reloc (FOO(unsigned int, (*),(bfd*,asection *, arelent **, asymbol **))) bfd_0
|
||||
|
||||
#define srec_print_symbol (FOO(void,(*),(bfd *, PTR, asymbol *, bfd_print_symbol_type))) bfd_void
|
||||
|
||||
|
||||
#define srec_openr_next_archived_file (FOO(bfd *, (*), (bfd*,bfd*))) bfd_nullvoidptr
|
||||
#define srec_find_nearest_line (FOO(boolean, (*),(bfd*,asection*,asymbol**,bfd_vma, CONST char**, CONST char**, unsigned int *))) bfd_false
|
||||
|
@ -590,6 +891,10 @@ DEFUN(srec_make_empty_symbol, (abfd),
|
|||
#define srec_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
|
||||
#define srec_bfd_relax_section bfd_generic_relax_section
|
||||
#define srec_bfd_seclet_link bfd_generic_seclet_link
|
||||
#define srec_bfd_reloc_type_lookup \
|
||||
((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
|
||||
#define srec_bfd_make_debug_symbol \
|
||||
((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
|
||||
|
||||
bfd_target srec_vec =
|
||||
{
|
||||
|
@ -632,3 +937,47 @@ bfd_target srec_vec =
|
|||
JUMP_TABLE(srec)
|
||||
};
|
||||
|
||||
|
||||
|
||||
bfd_target symbolsrec_vec =
|
||||
{
|
||||
"symbolsrec", /* name */
|
||||
bfd_target_srec_flavour,
|
||||
true, /* target byte order */
|
||||
true, /* target headers byte order */
|
||||
(HAS_RELOC | EXEC_P | /* object flags */
|
||||
HAS_LINENO | HAS_DEBUG |
|
||||
HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
|
||||
(SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
|
||||
|SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
|
||||
0, /* leading underscore */
|
||||
' ', /* ar_pad_char */
|
||||
16, /* ar_max_namelen */
|
||||
1, /* minimum alignment */
|
||||
_do_getb64, _do_putb64, _do_getb32,
|
||||
_do_putb32, _do_getb16, _do_putb16, /* data */
|
||||
_do_getb64, _do_putb64, _do_getb32,
|
||||
_do_putb32, _do_getb16, _do_putb16, /* hdrs */
|
||||
|
||||
{
|
||||
_bfd_dummy_target,
|
||||
symbolsrec_object_p, /* bfd_check_format */
|
||||
(struct bfd_target *(*)()) bfd_nullvoidptr,
|
||||
(struct bfd_target *(*)()) bfd_nullvoidptr,
|
||||
},
|
||||
{
|
||||
bfd_false,
|
||||
srec_mkobject,
|
||||
_bfd_generic_mkarchive,
|
||||
bfd_false,
|
||||
},
|
||||
{ /* bfd_write_contents */
|
||||
bfd_false,
|
||||
symbolsrec_write_object_contents,
|
||||
_bfd_write_archive_contents,
|
||||
bfd_false,
|
||||
},
|
||||
JUMP_TABLE(srec),
|
||||
(PTR) 0
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue