Added 386 support!
This commit is contained in:
parent
ebec46845c
commit
20fdc627fa
3 changed files with 140 additions and 114 deletions
|
@ -38,14 +38,14 @@ BFD_LIBS = libbfd.o opncls.o bfd.o archive.o targets.o cache.o \
|
|||
archures.o
|
||||
|
||||
BFD_BACKENDS = oasys.o ieee.o srec.o aout64.o aout32.o sunos.o icoff.o demo64.o \
|
||||
m68kcoff.o m88k-bcs.o coffswap.o ecoff.o newsos3.o # trad-core.o bout.o
|
||||
m68kcoff.o i386coff.o m88k-bcs.o coffswap.o ecoff.o newsos3.o # trad-core.o bout.o
|
||||
|
||||
BFD_H=$(INCDIR)/bfd.h
|
||||
SYSDEP_H=$(INCDIR)/sysdep.h
|
||||
|
||||
# C source files that correspond to .o's.
|
||||
CFILES = libbfd.c opncls.c bfd.c archive.c targets.c cache.c archures.c \
|
||||
aout64.c aout32.c sunos.c demo64.c icoff.c srec.c oasys.c ieee.c m68kcoff.c \
|
||||
i386coff.c aout64.c aout32.c sunos.c demo64.c icoff.c srec.c oasys.c ieee.c m68kcoff.c \
|
||||
m88k-bcs.c coffswap.c ecoff.c trad-core.c newsos3.c #bout.c
|
||||
|
||||
STAGESTUFF = $(TARGETLIB) $(OFILES)
|
||||
|
@ -171,7 +171,7 @@ Makefile: $(srcdir)/Makefile.in $(srcdir)/configure
|
|||
./configure +norecurse \
|
||||
+destdir=$(destdir) \
|
||||
`if [ "$(srcdir)" != "." ] ; then echo +f; fi` \
|
||||
$(host) +target=$(target);) ; make dep
|
||||
$(host) +target=$(target);)
|
||||
|
||||
dep: $(CFILES)
|
||||
mkdep $(CFLAGS) $?
|
||||
|
|
234
bfd/coffcode.h
234
bfd/coffcode.h
|
@ -417,6 +417,9 @@ DEFUN(coff_new_section_hook,(abfd_ignore, section_ignore),
|
|||
#endif
|
||||
#if M68
|
||||
section_ignore->alignment_power = 3;
|
||||
#endif
|
||||
#if I386
|
||||
section_ignore->alignment_power = 2;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
@ -545,10 +548,16 @@ DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
|
|||
/* Determine the machine architecture and type. */
|
||||
abfd->obj_machine = 0;
|
||||
switch (internal_f->f_magic) {
|
||||
#ifdef I386MAGIC
|
||||
case I386MAGIC:
|
||||
abfd->obj_arch = bfd_arch_i386;
|
||||
abfd->obj_machine = 0;
|
||||
break;
|
||||
#endif
|
||||
#ifdef MIPS
|
||||
case MIPS_MAGIC_1:
|
||||
case MIPS_MAGIC_2:
|
||||
case MIPS_MAGIC_3:
|
||||
case MIPS_MAGIC_1:
|
||||
case MIPS_MAGIC_2:
|
||||
case MIPS_MAGIC_3:
|
||||
abfd->obj_arch = bfd_arch_mips;
|
||||
abfd->obj_machine = 0;
|
||||
break;
|
||||
|
@ -671,10 +680,10 @@ DEFUN(coff_object_p,(abfd),
|
|||
quit; the only difference I can see between m88k dgux headers (MC88DMAGIC)
|
||||
and Intel 960 readwrite headers (I960WRMAGIC) is that the
|
||||
optional header is of a different size.
|
||||
|
||||
But the mips keeps extra stuff in it's opthdr, so dont check
|
||||
when doing that
|
||||
*/
|
||||
|
||||
But the mips keeps extra stuff in it's opthdr, so dont check
|
||||
when doing that
|
||||
*/
|
||||
|
||||
#ifndef MIPS
|
||||
if (internal_f.f_opthdr != 0 && AOUTSZ != internal_f.f_opthdr)
|
||||
|
@ -695,15 +704,15 @@ static coff_symbol_type *
|
|||
DEFUN(coff_symbol_from,(abfd, symbol),
|
||||
bfd *abfd AND
|
||||
asymbol *symbol)
|
||||
{
|
||||
if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour_enum)
|
||||
return (coff_symbol_type *)NULL;
|
||||
|
||||
if (symbol->the_bfd->tdata == (PTR)NULL)
|
||||
return (coff_symbol_type *)NULL;
|
||||
|
||||
return (coff_symbol_type *) symbol;
|
||||
}
|
||||
{
|
||||
if (symbol->the_bfd->xvec->flavour != bfd_target_coff_flavour_enum)
|
||||
return (coff_symbol_type *)NULL;
|
||||
|
||||
if (symbol->the_bfd->tdata == (PTR)NULL)
|
||||
return (coff_symbol_type *)NULL;
|
||||
|
||||
return (coff_symbol_type *) symbol;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -714,59 +723,59 @@ DEFUN(coff_symbol_from,(abfd, symbol),
|
|||
static void
|
||||
DEFUN(coff_count_linenumbers,(abfd),
|
||||
bfd *abfd)
|
||||
{
|
||||
{
|
||||
unsigned int limit = bfd_get_symcount(abfd);
|
||||
unsigned int i;
|
||||
asymbol **p;
|
||||
{
|
||||
{
|
||||
asection *s = abfd->sections->output_section;
|
||||
while (s) {
|
||||
BFD_ASSERT(s->lineno_count == 0);
|
||||
s = s->next;
|
||||
BFD_ASSERT(s->lineno_count == 0);
|
||||
s = s->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
|
||||
asymbol *q_maybe = *p;
|
||||
if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour_enum) {
|
||||
coff_symbol_type *q = coffsymbol(q_maybe);
|
||||
if (q->lineno) {
|
||||
/*
|
||||
This symbol has a linenumber, increment the owning
|
||||
section's linenumber count
|
||||
asymbol *q_maybe = *p;
|
||||
if (q_maybe->the_bfd->xvec->flavour == bfd_target_coff_flavour_enum) {
|
||||
coff_symbol_type *q = coffsymbol(q_maybe);
|
||||
if (q->lineno) {
|
||||
/*
|
||||
This symbol has a linenumber, increment the owning
|
||||
section's linenumber count
|
||||
*/
|
||||
alent *l = q->lineno;
|
||||
q->symbol.section->output_section->lineno_count++;
|
||||
l++;
|
||||
while (l->line_number) {
|
||||
q->symbol.section->output_section->lineno_count++;
|
||||
l++;
|
||||
}
|
||||
}
|
||||
alent *l = q->lineno;
|
||||
q->symbol.section->output_section->lineno_count++;
|
||||
l++;
|
||||
while (l->line_number) {
|
||||
q->symbol.section->output_section->lineno_count++;
|
||||
l++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
This function returns true if the supplied SYMENT has an AUXENT with
|
||||
a tagndx field which should be relocated.
|
||||
This function returns true if the supplied SYMENT has an AUXENT with
|
||||
a tagndx field which should be relocated.
|
||||
|
||||
The coff book says that all auxents have this and should be moved,
|
||||
but all the actual implementations I've looked at do this ..
|
||||
(sac@cygnus.com)
|
||||
The coff book says that all auxents have this and should be moved,
|
||||
but all the actual implementations I've looked at do this ..
|
||||
(sac@cygnus.com)
|
||||
|
||||
*/
|
||||
static boolean
|
||||
DEFUN(uses_x_sym_x_tagndx_p,(abfd, native),
|
||||
bfd *abfd AND
|
||||
struct internal_syment *native)
|
||||
{
|
||||
{
|
||||
if (BTYPE(native->n_type) == T_STRUCT) return true;
|
||||
if (BTYPE(native->n_type) == T_UNION) return true;
|
||||
if (BTYPE(native->n_type) == T_ENUM) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
@ -808,73 +817,73 @@ applied so we can dig it out through a pointer. */
|
|||
static void
|
||||
DEFUN(coff_mangle_symbols,(bfd_ptr),
|
||||
bfd *bfd_ptr)
|
||||
{
|
||||
unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
|
||||
asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
|
||||
struct internal_syment *last_tagndx = (struct internal_syment *)NULL;
|
||||
struct internal_syment *last_file = (struct internal_syment *)NULL;
|
||||
struct internal_syment *last_fcn = (struct internal_syment *)NULL;
|
||||
struct internal_syment *block_stack[50];
|
||||
struct internal_syment **last_block = &block_stack[0];
|
||||
boolean first_time = true;
|
||||
unsigned int symbol_index;
|
||||
unsigned int native_index = 0;
|
||||
|
||||
for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) {
|
||||
coff_symbol_type *coff_symbol_ptr =
|
||||
coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
|
||||
if (coff_symbol_ptr == (coff_symbol_type *)NULL) {
|
||||
/*
|
||||
This symbol has no coff information in it, it will take up
|
||||
only one slot in the output symbol table
|
||||
*/
|
||||
native_index++;
|
||||
}
|
||||
else {
|
||||
struct internal_syment *syment = coff_symbol_ptr->native;
|
||||
if (syment == (struct internal_syment *)NULL) {
|
||||
{
|
||||
unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
|
||||
asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
|
||||
struct internal_syment *last_tagndx = (struct internal_syment *)NULL;
|
||||
struct internal_syment *last_file = (struct internal_syment *)NULL;
|
||||
struct internal_syment *last_fcn = (struct internal_syment *)NULL;
|
||||
struct internal_syment *block_stack[50];
|
||||
struct internal_syment **last_block = &block_stack[0];
|
||||
boolean first_time = true;
|
||||
unsigned int symbol_index;
|
||||
unsigned int native_index = 0;
|
||||
|
||||
for (symbol_index = 0; symbol_index < symbol_count; symbol_index++) {
|
||||
coff_symbol_type *coff_symbol_ptr =
|
||||
coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
|
||||
if (coff_symbol_ptr == (coff_symbol_type *)NULL) {
|
||||
/*
|
||||
This symbol has no coff information in it, it will take up
|
||||
only one slot in the output symbol table
|
||||
*/
|
||||
native_index++;
|
||||
}
|
||||
else {
|
||||
/* Normalize the symbol flags */
|
||||
if (coff_symbol_ptr->symbol.flags & BSF_FORT_COMM) {
|
||||
/* a common symbol is undefined with a value */
|
||||
syment->n_scnum = N_UNDEF;
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
struct internal_syment *syment = coff_symbol_ptr->native;
|
||||
if (syment == (struct internal_syment *)NULL) {
|
||||
native_index++;
|
||||
}
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
}
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
|
||||
syment->n_scnum = N_UNDEF;
|
||||
syment->n_value = 0;
|
||||
}
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
|
||||
syment->n_scnum = N_ABS;
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
}
|
||||
else {
|
||||
syment->n_scnum =
|
||||
coff_symbol_ptr->symbol.section->output_section->index+1;
|
||||
|
||||
syment->n_value =
|
||||
coff_symbol_ptr->symbol.value +
|
||||
coff_symbol_ptr->symbol.section->output_offset +
|
||||
coff_symbol_ptr->symbol.section->output_section->vma;
|
||||
}
|
||||
|
||||
|
||||
/* If this symbol ties up something then do it */
|
||||
|
||||
if (syment->n_sclass == C_FILE && last_file != (struct internal_syment *)NULL)
|
||||
{
|
||||
last_file->n_value = native_index;
|
||||
/* Normalize the symbol flags */
|
||||
if (coff_symbol_ptr->symbol.flags & BSF_FORT_COMM) {
|
||||
/* a common symbol is undefined with a value */
|
||||
syment->n_scnum = N_UNDEF;
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
}
|
||||
else if ((syment->n_sclass == C_EXT
|
||||
|| syment->n_sclass == C_STAT
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
}
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_UNDEFINED) {
|
||||
syment->n_scnum = N_UNDEF;
|
||||
syment->n_value = 0;
|
||||
}
|
||||
else if (coff_symbol_ptr->symbol.flags & BSF_ABSOLUTE) {
|
||||
syment->n_scnum = N_ABS;
|
||||
syment->n_value = coff_symbol_ptr->symbol.value;
|
||||
}
|
||||
else {
|
||||
syment->n_scnum =
|
||||
coff_symbol_ptr->symbol.section->output_section->index+1;
|
||||
|
||||
syment->n_value =
|
||||
coff_symbol_ptr->symbol.value +
|
||||
coff_symbol_ptr->symbol.section->output_offset +
|
||||
coff_symbol_ptr->symbol.section->output_section->vma;
|
||||
}
|
||||
|
||||
|
||||
/* If this symbol ties up something then do it */
|
||||
|
||||
if (syment->n_sclass == C_FILE && last_file != (struct internal_syment *)NULL)
|
||||
{
|
||||
last_file->n_value = native_index;
|
||||
}
|
||||
else if ((syment->n_sclass == C_EXT
|
||||
|| syment->n_sclass == C_STAT
|
||||
#ifdef C_LEAFEXT
|
||||
|| syment->n_sclass == C_LEAFEXT
|
||||
|| syment->n_sclass == C_LEAFSTAT
|
||||
|| syment->n_sclass == C_LEAFEXT
|
||||
|| syment->n_sclass == C_LEAFSTAT
|
||||
#endif
|
||||
)
|
||||
&& last_fcn != (struct internal_syment *)NULL)
|
||||
|
@ -1343,6 +1352,11 @@ unsigned *magicp,
|
|||
return true;
|
||||
break;
|
||||
#endif
|
||||
#ifdef I386MAGIC
|
||||
case bfd_arch_i386:
|
||||
*magicp = I386MAGIC;
|
||||
return true;
|
||||
#endif
|
||||
#ifdef MC68MAGIC
|
||||
case bfd_arch_m68k:
|
||||
*magicp = MC68MAGIC;
|
||||
|
@ -2398,7 +2412,10 @@ DEFUN(coff_slurp_reloc_table,(abfd, asect, symbols),
|
|||
cache_ptr->address -= asect->vma;
|
||||
|
||||
cache_ptr->section = (asection *) NULL;
|
||||
|
||||
|
||||
#if I386
|
||||
cache_ptr->howto = howto_table + dst.r_type;
|
||||
#endif
|
||||
#if I960
|
||||
cache_ptr->howto = howto_table + dst.r_type;
|
||||
#endif
|
||||
|
@ -2510,10 +2527,11 @@ DEFUN(coff_find_nearest_line,(abfd,
|
|||
file didn't have a C_FILE. xoxorich.
|
||||
*/
|
||||
|
||||
/*
|
||||
#ifdef WEREBEINGPEDANTIC
|
||||
return false;
|
||||
#endif
|
||||
|
||||
*/
|
||||
for (i = 0; i < cof->raw_syment_count; i++) {
|
||||
if (p->n_sclass == C_FILE) {
|
||||
/* File name is embeded in auxent */
|
||||
|
|
|
@ -39,6 +39,7 @@ extern bfd_target ieee_vec;
|
|||
extern bfd_target oasys_vec;
|
||||
extern bfd_target m88k_bcs_vec;
|
||||
extern bfd_target m68kcoff_vec;
|
||||
extern bfd_target i386coff_vec;
|
||||
|
||||
#ifdef GNU960
|
||||
#define ICOFF_LITTLE_VEC icoff_little_vec
|
||||
|
@ -61,6 +62,7 @@ extern bfd_target m68kcoff_vec;
|
|||
#define M88K_BCS_VEC m88k_bcs_vec
|
||||
#define SREC_VEC srec_vec
|
||||
#define M68KCOFF_VEC m68kcoff_vec
|
||||
#define I386COFF_VEC i386coff_vec
|
||||
#endif
|
||||
bfd_target *target_vector[] = {
|
||||
|
||||
|
@ -68,6 +70,10 @@ bfd_target *target_vector[] = {
|
|||
&DEFAULT_VECTOR,
|
||||
#endif /* DEFAULT_VECTOR */
|
||||
|
||||
#ifdef I386COFF_VEC
|
||||
&I386COFF_VEC,
|
||||
#endif /* I386COFF_VEC */
|
||||
|
||||
#ifdef ECOFF_LITTLE_VEC
|
||||
&ECOFF_LITTLE_VEC,
|
||||
#endif
|
||||
|
@ -75,9 +81,6 @@ bfd_target *target_vector[] = {
|
|||
#ifdef ECOFF_BIG_VEC
|
||||
&ECOFF_BIG_VEC,
|
||||
#endif
|
||||
#ifdef M68KCOFF_VEC
|
||||
&M68KCOFF_VEC,
|
||||
#endif
|
||||
#ifdef IEEE_VEC
|
||||
&IEEE_VEC,
|
||||
#endif /* IEEE_VEC */
|
||||
|
@ -121,5 +124,10 @@ bfd_target *target_vector[] = {
|
|||
&B_OUT_VEC_BIG_HOST,
|
||||
#endif /* B_OUT_VEC_BIG_HOST */
|
||||
|
||||
#ifdef M68KCOFF_VEC
|
||||
&M68KCOFF_VEC,
|
||||
#endif /* M68KCOFF_VEC */
|
||||
|
||||
|
||||
NULL, /* end of list marker */
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue