aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Chamberlain <steve@cygnus>1991-05-25 01:51:10 +0000
committerSteve Chamberlain <steve@cygnus>1991-05-25 01:51:10 +0000
commit20fdc627fa5c4f741528cf97bedef6d2da159021 (patch)
tree77fba58730b8df1eb841619e2a9c9f7248d1e38f
parentebec46845c11fbec1a0f9fcb4c2c1c604a6aff66 (diff)
downloadgdb-20fdc627fa5c4f741528cf97bedef6d2da159021.zip
gdb-20fdc627fa5c4f741528cf97bedef6d2da159021.tar.gz
gdb-20fdc627fa5c4f741528cf97bedef6d2da159021.tar.bz2
Added 386 support!
-rw-r--r--bfd/Makefile.in6
-rw-r--r--bfd/coffcode.h234
-rw-r--r--bfd/targets.c14
3 files changed, 140 insertions, 114 deletions
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index 462e394..51ac35e 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -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) $?
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index ba8da4d..ee3edc2 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -418,6 +418,9 @@ DEFUN(coff_new_section_hook,(abfd_ignore, section_ignore),
#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;
- }
- else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
- 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_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 */
diff --git a/bfd/targets.c b/bfd/targets.c
index 2036d5b..b1338ad 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -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 */
};