diff options
-rwxr-xr-x | bfd/coff-code.h | 16 | ||||
-rw-r--r-- | bfd/oasys.c | 221 | ||||
-rw-r--r-- | bfd/targets.c | 2 | ||||
-rwxr-xr-x | ld/Makefile | 48 | ||||
-rwxr-xr-x | ld/ld-emul.c | 2 | ||||
-rwxr-xr-x | ld/ld-lnk960.c | 18 | ||||
-rw-r--r-- | ld/ldgram.y | 13 | ||||
-rw-r--r-- | ld/ldlang.c | 47 |
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 - * */ |