aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbfd/coff-code.h16
-rw-r--r--bfd/oasys.c221
-rw-r--r--bfd/targets.c2
-rwxr-xr-xld/Makefile48
-rwxr-xr-xld/ld-emul.c2
-rwxr-xr-xld/ld-lnk960.c18
-rw-r--r--ld/ldgram.y13
-rw-r--r--ld/ldlang.c47
8 files changed, 191 insertions, 176 deletions
diff --git a/bfd/coff-code.h b/bfd/coff-code.h
index 2c1e289..df3d8a6 100755
--- a/bfd/coff-code.h
+++ b/bfd/coff-code.h
@@ -357,6 +357,13 @@ coff_real_object_p(abfd, nscns, opthdr)
abfd->obj_machine = 68020;
break;
#endif
+#ifdef MC88MAGIC
+ case MC88MAGIC:
+ case MC88DMAGIC:
+ abfd->obj_arch = bfd_arch_m88k;
+ abfd->obj_machine = 88100;
+ break;
+#endif
#ifdef I960ROMAGIC
case I960ROMAGIC:
case I960RWMAGIC:
@@ -1126,9 +1133,9 @@ coff_set_flags(abfd, magicp, flagsp)
*magicp = MC68MAGIC;
return true;
#endif
-#if M88DMAGIC
+#ifdef M88MAGIC
case bfd_arch_m88k:
- *magicp = MC88DMAGIC;
+ *magicp = MC88MAGIC;
return true;
break;
#endif
@@ -1711,7 +1718,7 @@ get_normalized_symtab(abfd)
}
else {
if ((((AUXENT *) (retval + 1))->x_file.x_n.x_offset
- = (int) malloc(namelength)) == NULL) {
+ = (int) malloc(namelength+1)) == NULL) {
bfd_error = no_memory;
return (NULL);
} /* on error */
@@ -1740,7 +1747,6 @@ get_normalized_symtab(abfd)
/* ...and normalize symbol names. */
for (s = retval + obj_symbol_slew(abfd); s < end; ++s) {
-
if (s->n_zeroes != 0) {
/*
This is a "short" name. Make it long.
@@ -1763,7 +1769,7 @@ get_normalized_symtab(abfd)
return (NULL);
} /* on error */
bzero(newstring, i);
- strncpy(newstring, s->n_name, 8);
+ strncpy(newstring, s->n_name, i -1 );
s->n_offset = (int) newstring;
s->n_zeroes = 0;
diff --git a/bfd/oasys.c b/bfd/oasys.c
index ff6ce54..4d57116 100644
--- a/bfd/oasys.c
+++ b/bfd/oasys.c
@@ -1,3 +1,4 @@
+/*#define UNDERSCORE_HACK 0*/
/*
bfd backend for oasys objects.
@@ -90,7 +91,13 @@ bfd *abfd;
/* Buy enough memory for all the symbols and all the names */
data->symbols =
(asymbol *)malloc(sizeof(asymbol) * abfd->symcount);
+#ifdef UNDERSCORE_HACK
+ /* buy 1 more char for each symbol to keep the underscore in*/
+ data->strings = malloc(data->symbol_string_length +
+ abfd->symcount);
+#else
data->strings = malloc(data->symbol_string_length);
+#endif
dest_undefined = data->symbols;
dest_defined = data->symbols + abfd->symcount -1;
@@ -98,6 +105,7 @@ bfd *abfd;
string_ptr = data->strings;
bfd_seek(abfd, (file_ptr)0, SEEK_SET);
while (loop) {
+
oasys_read_record(abfd, &record);
switch (record.header.type) {
case oasys_record_is_header_enum:
@@ -105,12 +113,16 @@ bfd *abfd;
case oasys_record_is_local_enum:
case oasys_record_is_symbol_enum:
{
+int flag = record.header.type == oasys_record_is_local_enum ?
+ (BSF_LOCAL) : (BSF_GLOBAL | BSF_EXPORT);
+
+
size_t length = oasys_string_length(&record);
switch (record.symbol.relb[0] & RELOCATION_TYPE_BITS) {
case RELOCATION_TYPE_ABS:
dest = dest_defined--;
dest->section = 0;
- dest->flags = BSF_ABSOLUTE | BSF_EXPORT | BSF_GLOBAL;
+ dest->flags = BSF_ABSOLUTE | flag;
break;
case RELOCATION_TYPE_REL:
dest = dest_defined--;
@@ -119,11 +131,11 @@ bfd *abfd;
RELOCATION_SECT_BITS];
if (record.header.type == oasys_record_is_local_enum)
{
- dest->flags = BSF_LOCAL;
+ dest->flags = BSF_LOCAL;
}
else {
- dest->flags = BSF_EXPORT | BSF_GLOBAL;
+ dest->flags = flag;
}
break;
case RELOCATION_TYPE_UND:
@@ -142,9 +154,15 @@ bfd *abfd;
}
dest->name = string_ptr;
dest->the_bfd = abfd;
-
+ dest->udata = (void *)NULL;
dest->value = bfd_h_getlong(abfd, &record.symbol.value);
+#if UNDERSCORE_HACK
+ string_ptr[0] = '_';
+ string_ptr++;
+#endif
memcpy(string_ptr, record.symbol.name, length);
+
+
string_ptr[length] =0;
string_ptr += length +1;
}
@@ -163,8 +181,7 @@ bfd *abfd;
{
oasys_slurp_symbol_table (abfd);
- return (abfd->symcount != 0) ?
- (abfd->symcount+1) * (sizeof (oasys_symbol_type *)) : 0;
+ return (abfd->symcount+1) * (sizeof (oasys_symbol_type *));
}
/*
@@ -289,10 +306,12 @@ bfd *abfd;
/* Inspect the records, but only keep the section info -
remember the size of the symbols
*/
+ static_data.first_data_record = 0;
while (loop) {
+
oasys_record_union_type record;
oasys_read_record(abfd, &record);
- if (record.header.length < sizeof(record.header))
+ if (record.header.length < sizeof(record.header))
return (bfd_target *)NULL;
switch ((oasys_record_enum_type)(record.header.type)) {
@@ -429,6 +448,7 @@ bfd *abfd;
per->reloc_tail_ptr = (oasys_reloc_type **)&(s->relocation);
}
+ if (data->first_data_record == 0) return true;
bfd_seek(abfd, data->first_data_record, SEEK_SET);
while (loop) {
oasys_read_record(abfd, &record);
@@ -436,93 +456,112 @@ bfd *abfd;
case oasys_record_is_header_enum:
break;
case oasys_record_is_data_enum:
- {
+ {
- uint8e_type *src = record.data.data;
- uint8e_type *end_src = ((uint8e_type *)&record) + record.header.length;
- unsigned int relbit;
- bfd_byte *dst_ptr ;
- bfd_byte *dst_base_ptr ;
- asection *section;
- unsigned int count;
-
- bfd_vma dst_offset = bfd_h_getlong(abfd, record.data.addr);
- section = data->sections[record.data.relb & RELOCATION_SECT_BITS];
- per = oasys_per_section(section);
-dst_base_ptr = dst_ptr = oasys_per_section(section)->data + dst_offset;
-
- while (src < end_src) {
- uint8e_type mod_byte = *src++;
- count = 8;
-
- for (relbit = 1; count-- != 0; relbit <<=1)
- {
- if (relbit & mod_byte)
- {
- uint8e_type reloc = *src;
- /* This item needs to be relocated */
- switch (reloc & RELOCATION_TYPE_BITS) {
- case RELOCATION_TYPE_ABS:
-
- break;
-
- case RELOCATION_TYPE_REL:
- {
- /* Relocate the item relative to the section */
- oasys_reloc_type *r =
- (oasys_reloc_type *)
- obstack_alloc(&per->reloc_obstack,
- sizeof(oasys_reloc_type));
- *(per->reloc_tail_ptr) = r;
- per->reloc_tail_ptr = &r->next;
- r->next= (oasys_reloc_type *)NULL;
- /* Reference to undefined symbol */
- src++;
- /* There is no symbol */
- r->symbol = 0;
- /* Work out the howto */
- r->relent.section =
- data->sections[reloc & RELOCATION_SECT_BITS];
- r->relent.addend = 0;
- r->relent.address = dst_ptr - dst_base_ptr;
- r->relent.howto = &howto_table[reloc>>6];
- section->reloc_count++;
-
- }
- break;
-
-
- case RELOCATION_TYPE_UND:
- {
- oasys_reloc_type *r =
- (oasys_reloc_type *)
- obstack_alloc(&per->reloc_obstack,
- sizeof(oasys_reloc_type));
- *(per->reloc_tail_ptr) = r;
- per->reloc_tail_ptr = &r->next;
- r->next= (oasys_reloc_type *)NULL;
- /* Reference to undefined symbol */
- src++;
- /* Get symbol number */
- r->symbol = (src[0]<<8) | src[1];
- /* Work out the howto */
- r->relent.section = (asection *)NULL;
- r->relent.addend = 0;
- r->relent.address = dst_ptr - dst_base_ptr;
- r->relent.howto = &howto_table[reloc>>6];
-
- section->reloc_count++;
- src+=2;
- }
- break;
- case RELOCATION_TYPE_COM:
- BFD_FAIL();
+ uint8e_type *src = record.data.data;
+ uint8e_type *end_src = ((uint8e_type *)&record) +
+ record.header.length;
+ unsigned int relbit;
+ bfd_byte *dst_ptr ;
+ bfd_byte *dst_base_ptr ;
+ asection *section;
+ unsigned int count;
+
+ bfd_vma dst_offset = bfd_h_getlong(abfd, record.data.addr);
+ section = data->sections[record.data.relb & RELOCATION_SECT_BITS];
+ per = oasys_per_section(section);
+ dst_base_ptr = oasys_per_section(section)->data;
+ dst_ptr = oasys_per_section(section)->data +
+ dst_offset;
+
+ while (src < end_src) {
+ uint32_type gap = end_src - src -1;
+ uint8e_type mod_byte = *src++;
+ count = 8;
+ if (mod_byte == 0 && gap >= 8) {
+ dst_ptr[0] = src[0];
+ dst_ptr[1] = src[1];
+ dst_ptr[2] = src[2];
+ dst_ptr[3] = src[3];
+ dst_ptr[4] = src[4];
+ dst_ptr[5] = src[5];
+ dst_ptr[6] = src[6];
+ dst_ptr[7] = src[7];
+ dst_ptr+= 8;
+ src += 8;
+ }
+ else {
+ for (relbit = 1; count-- != 0 && gap != 0; gap --, relbit <<=1)
+ {
+ if (relbit & mod_byte)
+ {
+ uint8e_type reloc = *src;
+ /* This item needs to be relocated */
+ switch (reloc & RELOCATION_TYPE_BITS) {
+ case RELOCATION_TYPE_ABS:
+
+ break;
+
+ case RELOCATION_TYPE_REL:
+ {
+ /* Relocate the item relative to the section */
+ oasys_reloc_type *r =
+ (oasys_reloc_type *)
+ obstack_alloc(&per->reloc_obstack,
+ sizeof(oasys_reloc_type));
+ *(per->reloc_tail_ptr) = r;
+ per->reloc_tail_ptr = &r->next;
+ r->next= (oasys_reloc_type *)NULL;
+ /* Reference to undefined symbol */
+ src++;
+ /* There is no symbol */
+ r->symbol = 0;
+ /* Work out the howto */
+ r->relent.section =
+ data->sections[reloc & RELOCATION_SECT_BITS];
+ r->relent.addend = 0;
+ r->relent.address = dst_ptr - dst_base_ptr;
+ r->relent.howto = &howto_table[reloc>>6];
+ r->relent.sym_ptr_ptr = (asymbol **)NULL;
+ section->reloc_count++;
+
+ }
+ break;
+
+
+ case RELOCATION_TYPE_UND:
+ {
+ oasys_reloc_type *r =
+ (oasys_reloc_type *)
+ obstack_alloc(&per->reloc_obstack,
+ sizeof(oasys_reloc_type));
+ *(per->reloc_tail_ptr) = r;
+ per->reloc_tail_ptr = &r->next;
+ r->next= (oasys_reloc_type *)NULL;
+ /* Reference to undefined symbol */
+ src++;
+ /* Get symbol number */
+ r->symbol = (src[0]<<8) | src[1];
+ /* Work out the howto */
+ r->relent.section = (asection *)NULL;
+ r->relent.addend = 0;
+ r->relent.address = dst_ptr - dst_base_ptr;
+ r->relent.howto = &howto_table[reloc>>6];
+ r->relent.sym_ptr_ptr = (asymbol **)NULL;
+
+ section->reloc_count++;
+ src+=2;
+ }
+ break;
+ case RELOCATION_TYPE_COM:
+ BFD_FAIL();
+ }
+ }
+ *dst_ptr++ = *src++;
}
- }
- *dst_ptr++ = *src++;
}
- }
- }
+ }
+ }
break;
case oasys_record_is_local_enum:
case oasys_record_is_symbol_enum:
diff --git a/bfd/targets.c b/bfd/targets.c
index e7cb64d..31741ec 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -37,6 +37,7 @@ extern bfd_target ieee_vec;
extern bfd_target oasys_vec;
extern bfd_target m88k_bcs_vec;
+vvvvvvvvvvvvvvvvvvvv
bfd_target *target_vector[] = {
&aout_little_vec,
&ieee_vec,
@@ -50,3 +51,4 @@ bfd_target *target_vector[] = {
&srec_vec,
NULL,
};
+^^^^^^^^^^^^^^^^^^^^
diff --git a/ld/Makefile b/ld/Makefile
index 51b596e..a565bbf 100755
--- a/ld/Makefile
+++ b/ld/Makefile
@@ -3,8 +3,8 @@
#
# $Id$
#
-srcdir = ../common
-VPATH = ../common
+srcdir=../common
+VPATH=../common
BASEDIR = ../..
HOSTDIR = ../$(HOST)/
INCLUDE = $(srcdir)/$(BASEDIR)/include-cygnus
@@ -14,9 +14,20 @@ DEBUG = -g
#__sun3__#EXTRA_DEF=-DHOST_SYS=SUN3_SYS
#__sun4__#EXTRA_DEF=-DHOST_SYS=SUN4_SYS
+#__dgux__#EXTRA_DEF=-DHOST_SYS=DGUX_SYS
CFLAGS = $(INCLUDES) $(EXTRA_DEF) $(DEBUG)
LINTFLAGS = $(INCLUDES) $(EXTRA_DEF)
+
+.SUFFIXES: .y
+
+.y.o:
+ yacc -tvd $<
+ mv y.tab.c ldgram.tab.c
+ $(CC) -c $(CFLAGS) ldgram.tab.c
+ mv ldgram.tab.o ldgram.o
+
+
# go directly to ld.new in case this ld isn't capable of
# linking native object on this host. It can be renamed on
# install.
@@ -25,7 +36,7 @@ PROGS = $(HOSTDIR)/ld.new
# for self hosting
GNUTARGET=a.out-generic-big
LDEMULATION=gld
-bfdlib=$(srcdir)/$(BASEDIR)/bfd/$(HOST)/libbfd.a
+BFDLIB=$(srcdir)/$(BASEDIR)/bfd/$(HOST)/libbfd.a
OBJS= ldgram.o ldlex.o ldlang.o ldmain.o ldwrite.o ldexp.o ld-lnk960.o ld-gld68k.o \
ld-gld.o ld-gld960.o ld-emul.o ldversion.o ldmisc.o ldsym.o ldfile.o
@@ -57,32 +68,27 @@ $(BFDLIB): $(BFDSOURCES)
$(PROGS): $(OBJS) $(BFDLIB)
# (cd ../bfd; make)
-# LDEMULATION=gld; export LDEMULATION; GNUTARGET=a.out-generic-big;./ldok -format a.out-generic-big -o ld /lib/crt0.o $(OBJS) $(bfdlib) -lc /usr/local/lib/gcc/sparc/1.91/gnulib
-# gld -o ld /lib/crt0.o $(OBJS) $(bfdlib) -lc /usr/local/lib/gcc/sparc/1.91/gnulib
- $(CC) -Bstatic -o ld.new $(OBJS) $(bfdlib)
+# LDEMULATION=gld; export LDEMULATION; GNUTARGET=a.out-generic-big;./ldok -format a.out-generic-big -o ld /lib/crt0.o $(OBJS) $(BFDLIB) -lc /usr/local/lib/gcc/sparc/1.91/gnulib
+# gld -o ld /lib/crt0.o $(OBJS) $(BFDLIB) -lc /usr/local/lib/gcc/sparc/1.91/gnulib
+ $(CC) -Bstatic -o ld.new $(OBJS) $(BFDLIB)
ld1: ld
- gcc -v -B./ -o ld1 $(OBJS) $(bfdlib)
+ gcc -v -B./ -o ld1 $(OBJS) $(BFDLIB)
ld2: ld1
mv ld1 ld
- gcc -v -B./ -o ld2 $(OBJS) $(bfdlib)
+ gcc -v -B./ -o ld2 $(OBJS) $(BFDLIB)
ld3: ld2
mv ld2 ld
- gcc -v -B./ -o ld3 $(OBJS) $(bfdlib)
+ gcc -v -B./ -o ld3 $(OBJS) $(BFDLIB)
ld.dvi:ld.tex
tex ld.tex
-ldgram.o:ldgram.y
- yacc -d ldgram.y
- mv y.tab.c ldgram.tab.c
- $(CC) -c $(CFLAGS) ldgram.tab.c
- mv ldgram.tab.o ldgram.o
-
-ldgram.tab.h:y.tab.h
+ldgram.o: ldgram.y
+ldgram.tab.h:ldgram.y
cp y.tab.h ldgram.tab.h
ldlex.c: ldlex.l ldgram.tab.h
@@ -96,11 +102,11 @@ ldlang.o: ldlang.c ldgram.tab.h
ld-gld.o: ld-gld.c
ld-gld68k.o: ld-gld68k.c
ld-gld960.o: ld-gld960.c
-ld-emul.o:ld-emul.c
-ld-lnk960.o:ld-lnk960.c
-ldexp.o:ldexp.c ldgram.tab.h
-ldmisc.o:ldmisc.c
-ldsym.o:ldsym.c
+ld-emul.o: ld-emul.c
+ld-lnk960.o: ld-lnk960.c
+ldexp.o: ldexp.c ldgram.tab.h
+ldmisc.o: ldmisc.c
+ldsym.o: ldsym.c
clean:
- rm -f $(OBJS) $(GENERATED_SOURCES) $(GENERATED_HEADERS)
diff --git a/ld/ld-emul.c b/ld/ld-emul.c
index 5c20791..80f1329 100755
--- a/ld/ld-emul.c
+++ b/ld/ld-emul.c
@@ -119,7 +119,7 @@ char *target;
ld_emulation = &ld_gld960_emulation;
}
else {
- info("%P%F unrecognised emulation mode: %s",target);
+ info("%P%F unrecognised emulation mode: %s\n",target);
}
}
diff --git a/ld/ld-lnk960.c b/ld/ld-lnk960.c
index 2e012c8..0d9a1fc 100755
--- a/ld/ld-lnk960.c
+++ b/ld/ld-lnk960.c
@@ -20,9 +20,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
$Id$
$Log$
- Revision 1.2 1991/03/22 23:02:31 steve
- Brought up to sync with Intel again.
+ Revision 1.3 1991/04/08 23:21:26 steve
+ *** empty log message ***
+ * Revision 1.2 1991/03/22 23:02:31 steve
+ * Brought up to sync with Intel again.
+ *
* Revision 1.2 1991/03/15 18:45:55 rich
* foo
*
@@ -199,10 +202,13 @@ lnk960_before_allocation()
static void
lnk960_after_allocation()
{
- lang_abs_symbol_at_end_of(".text","_etext");
- lang_abs_symbol_at_end_of(".data","_edata");
- lang_abs_symbol_at_beginning_of(".bss","_bss_start");
- lang_abs_symbol_at_end_of(".bss","_end");
+ extern ld_config_type config;
+ if (config.relocateable_output == false) {
+ lang_abs_symbol_at_end_of(".text","_etext");
+ lang_abs_symbol_at_end_of(".data","_edata");
+ lang_abs_symbol_at_beginning_of(".bss","_bss_start");
+ lang_abs_symbol_at_end_of(".bss","_end");
+ }
}
static struct
diff --git a/ld/ldgram.y b/ld/ldgram.y
index c42a3e5..cfd549f 100644
--- a/ld/ldgram.y
+++ b/ld/ldgram.y
@@ -225,10 +225,10 @@ command_line_option:
{
force_make_executable = true;
}
- | OPTION_d {
+ | OPTION_d {
command_line.force_common_definition = true;
}
- | OPTION_dc
+ | OPTION_dc
{
command_line.force_common_definition = true;
}
@@ -236,16 +236,17 @@ command_line_option:
{
/* Ignored */
}
- | OPTION_dp
+ | OPTION_dp
{
command_line.force_common_definition = true;
}
- | OPTION_format NAME
+ | OPTION_format NAME
{
lang_add_target($2);
}
- | OPTION_Texp { hex_mode =true; }
+ | OPTION_Texp
+ { hex_mode =true; }
exp
{ lang_section_start($1, $3);
hex_mode = false; }
@@ -290,9 +291,11 @@ command_line_option:
| OPTION_defsym
{
ldgram_in_defsym = true;
+ hex_mode = true;
}
assignment
{
+ hex_mode = false;
ldgram_in_defsym = false;
}
diff --git a/ld/ldlang.c b/ld/ldlang.c
index 173d181..ec3f5a9 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -18,53 +18,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* $Id$
*
- * $Log$
- * Revision 1.4 1991/03/27 02:29:22 steve
- * *** empty log message ***
- *
- * Revision 1.3 1991/03/27 00:52:49 steve
- * *** empty log message ***
- *
- * Revision 1.2 1991/03/22 23:02:34 steve
- * Brought up to sync with Intel again.
- *
- * Revision 1.3 1991/03/16 22:19:21 rich
- * pop
- *
- * Revision 1.2 1991/03/15 18:52:42 rich
- * pop
- *
- * Revision 1.1 1991/03/13 00:48:23 chrisb
- * Initial revision
- *
- * Revision 1.8 1991/03/10 09:31:28 rich
- * Modified Files:
- * Makefile config.h ld-emul.c ld-emul.h ld-gld.c ld-gld960.c
- * ld-lnk960.c ld.h lddigest.c ldexp.c ldexp.h ldfile.c ldfile.h
- * ldgram.y ldinfo.h ldlang.c ldlang.h ldlex.h ldlex.l ldmain.c
- * ldmain.h ldmisc.c ldmisc.h ldsym.c ldsym.h ldversion.c
- * ldversion.h ldwarn.h ldwrite.c ldwrite.h y.tab.h
- *
- * As of this round of changes, ld now builds on all hosts of (Intel960)
- * interest and copy passes my copy test on big endian hosts again.
- *
- * Revision 1.7 1991/03/09 03:31:03 sac
- * After a fatal info message, the output file is deleted.
- *
- * Revision 1.6 1991/03/09 03:25:06 sac
- * Added support for LONG, SHORT and BYTE keywords in scripts
- *
- * Revision 1.5 1991/03/06 21:59:31 sac
- * Completed G++ support
- *
- * Revision 1.4 1991/03/06 02:26:02 sac
- * Added support for constructor sections.
- * Remove parsing ambiguity.
- * Lint
- *
- * Revision 1.3 1991/02/22 17:15:01 sac
- * Added RCS keywords and copyrights
- *
*/