gas-1.36 patches for COFF generation

Loic Dachary loic at adesign.uucp
Tue Oct 16 18:30:19 AEST 1990


	Hello,

   I have posted an article last week on gnu.gcc to announce that patches
to gas-1.36 for COFF object file generation were availables.
   About 30 mails have asked for it since then. Sorry if I'm wrong but I will
consider this enough to post. Is there a precise definition of "popular
demand" somewhere ?-)

   The patches will be posted in the alt.sources newsgroup. They are about
160 K due to diff -c verbosity and are splitted in 5 articles. To apply
them just concat all the articles together and pipe the result to patch. They
will succeed on gas-1.36.
   They have been tested on Unisoft 1.3, SunOs 3.5 & 4.0.3, Esix rev C, 
CTIX 3.2, Ix 2.02 and SCO unix. They have been used to compile the following :
Unisoft V.3.2 kernel with tcp/ip extensions, MIT X11R4 libraries and clients, 
bison-1.11, compress-4.0, cproto, cshar, diff-1.14, dist-18.55, flex-2.3, 
gas-1.36, gcc-1.37.1, gdb-3.6, grep-1.5, kermit, make-3.58, makedep, patch,
printf, tar-1.08, texi2roff, uuencode, uutraf-1.2, bash-1.05.

   How to make it work ?

   . There is a new file named config.gas. It is a shell script that make the 
appropriate links for a given configuration.
     If you have a 68k or an i386, there is a good chance that nothing else
needs to be done.
     However, if your processor is a sparc, ns32k or vax, you will need to 
patch the machine dependent files. I strongly encourage you to contact me.
By mail or voice. I will offer all the assistance I'm able to provide.

   . When the links are set up, edit the file Makefile.new according to you 
system (BSD or USG). Refer to the original Makefile if more flags 
or comments are needed.

   . Run make -f Makefile.new gas

   . Move gas to /usr/local/lib/gcc-as, i.e. a place where gcc can find it.

   If you are curious or plan to do some work on gas, read the file
README.coff.

	I hope it will help,

		       		Loic


*** /dev/null	Mon Oct 15 09:51:48 1990
--- Makefile.new	Mon Oct 15 19:38:09 1990
***************
*** 0 ****
--- 1,200 ----
+ # Makefile for GAS.
+ # Copyright (C) 1989, Free Software Foundation
+ # 
+ # This file is part of GAS, the GNU Assembler.
+ # 
+ # GAS is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU General Public License as published by
+ # the Free Software Foundation; either version 1, or (at your option)
+ # any later version.
+ # 
+ # GAS is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ # GNU General Public License for more details.
+ # 
+ # You should have received a copy of the GNU General Public License
+ # along with GAS; see the file COPYING.  If not, write to
+ # the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ BINDIR = /usr/local/bin
+ 
+ BINARY = gas
+ 
+ #
+ # Add these flags to XCFLAGS below for specific use.
+ #
+ # If you machine does not have vfprintf, but does have _doprnt(),
+ # -DNO_VARARGS
+ #
+ # If the return-type of a signal-hander is void (instead of int),
+ # -DSIGTY
+ #
+ # To include the mc68851 mmu coprocessor instructions in the 68020 assembler,
+ # -Dm68851 
+ #
+ # If you want the 80386 assembler to correctly handle fsub/fsubr and fdiv/fdivr
+ # opcodes (unlike most 80386 assemblers)
+ # -DNON_BROKEN_WORDS
+ #
+ XCFLAGS =
+ 
+ # Your favorite compiler
+ CC = gcc
+ 
+ # Uncomment the following lines if you use USG
+ 
+ INCLUDE_DIRS = -I.
+ COFF_OBJECTS = stack.o
+ CPPFLAGS = -DUSG
+ CFLAGS = -g $(CPPFLAGS) $(XCFLAGS)
+ LDFLAGS = 
+ LOADLIBES = -lPW
+ 
+ # Uncomment the following lines if you use BSD
+ #INCLUDE_DIRS = -I.
+ #CPPFLAGS = 
+ #CFLAGS = -g $(CPPFLAGS) $(XCFLAGS)
+ #LDFLAGS = 
+ #LOADLIBES =
+ 
+ CONFIG_FILES = \
+ 	machine.c machine.h atof.c oformat.c oformat.h opcode.h
+ 
+ OBJECTS = \
+ 	as.o xrealloc.o xmalloc.o hash.o hex-value.o \
+ 	atof-generic.o append.o messages.o expr.o app.o \
+ 	frags.o input-file.o input-scrub.o output-file.o \
+ 	subsegs.o symbols.o version.o flonum-const.o flonum-copy.o \
+ 	flonum-mult.o strstr.o bignum-copy.o obstack.o write.o read.o \
+ 	oformat.o machine.o atof.o $(COFF_OBJECTS)
+ 
+ SOURCES = $(OBJECTS:.o=.c)
+ 
+ all : $(BINARY)
+ 
+ install : all
+ 	cp $(BINARY) $(BINDIR)
+ 
+ clean : 
+ 	rm -f $(OBJECTS)
+ 
+ clobber : clean
+ 	rm -f $(BINARY) $(CONFIG_FILES) dependencies TAGS m68k.h
+ 
+ $(BINARY) : $(OBJECTS)
+ 	$(CC) -o $(BINARY) $(LDFLAGS) $(OBJECTS) $(LOADLIBES)
+ 
+ TAGS : $(SOURCES)
+ 	etags $(SOURCES) *.h
+ 
+ CXREF : $(SOURCES)
+ 	cxref -c $(INCLUDE_DIRS) $(SOURCES)
+ 
+ atof.o: \
+ 	flonum.h \
+ 	bignum.h
+ oformat.o: \
+ 	as.h \
+ 	md.h \
+ 	aout.h \
+ 	a.out.h \
+ 	struc-symbol.h \
+ 	write.h \
+ 	append.h
+ read.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	read.h \
+ 	md.h \
+ 	hash.h \
+ 	obstack.h \
+ 	frags.h \
+ 	flonum.h \
+ 	bignum.h \
+ 	struc-symbol.h \
+ 	expr.h \
+ 	symbols.h \
+ 	sparc.h
+ write.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	md.h \
+ 	subsegs.h \
+ 	obstack.h \
+ 	struc-symbol.h \
+ 	write.h \
+ 	symbols.h \
+ 	append.h \
+ 	sparc.h
+ obstack.o: \
+ 	obstack.h
+ bignum-copy.o: \
+ 	bignum.h
+ flonum-mult.o: \
+ 	flonum.h \
+ 	bignum.h
+ flonum-copy.o: \
+ 	flonum.h \
+ 	bignum.h
+ flonum-const.o: \
+ 	flonum.h \
+ 	bignum.h
+ symbols.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	hash.h \
+ 	obstack.h \
+ 	struc-symbol.h \
+ 	symbols.h \
+ 	frags.h
+ subsegs.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	subsegs.h \
+ 	obstack.h \
+ 	frags.h \
+ 	struc-symbol.h \
+ 	write.h
+ input-scrub.o: \
+ 	as.h \
+ 	read.h \
+ 	input-file.h
+ input-file.o: \
+ 	input-file.h
+ frags.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	subsegs.h \
+ 	obstack.h \
+ 	frags.h \
+ 	struc-symbol.h
+ expr.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	flonum.h \
+ 	bignum.h \
+ 	read.h \
+ 	struc-symbol.h \
+ 	expr.h \
+ 	obstack.h \
+ 	symbols.h
+ messages.o: \
+ 	as.h
+ atof-generic.o: \
+ 	flonum.h \
+ 	bignum.h
+ hash.o: \
+ 	hash.h
+ as.o: \
+ 	oformat.h \
+ 	a.out.h \
+ 	as.h \
+ 	struc-symbol.h \
+ 	write.h
*** /dev/null	Mon Oct 15 09:51:48 1990
--- aout.h	Mon Oct 15 10:22:20 1990
***************
*** 0 ****
--- 1,160 ----
+ #ifndef AOUT_H
+ #define AOUT_H
+ 
+ #include "a.out.h"
+ 
+ /* Tag to validate a.out object file format processing */
+ #define aout
+ 
+ /* RELOCATION INFORMATION */
+ 
+ #define relocation_type struct relocation_info	/* Relocation table entry */
+ #define RELSZ sizeof(relocation_type)		/* For coff compatibility */
+  
+ /* SYMBOL TABLE */
+ /* Symbol table entry data type */
+ 
+ #define symbol_type struct nlist	/* Symbol table entry */
+ 
+ /* If compiler generate leading underscores, remove them. */
+ 
+ #ifndef STRIP_UNDERSCORE
+ #define STRIP_UNDERSCORE 0
+ #endif /* STRIP_UNDERSCORE */
+ 
+ /* Symbol table macros and constants */
+ 
+ /*
+  *  Macros to extract information from a symbol table entry.
+  *  This syntaxic indirection allows independence regarding a.out or coff.
+  *  The argument (s) of all these macros is a pointer to a symbol table entry.
+  */
+ 
+ /* Predicates */
+ /* True if in text segment */
+ #define S_IS_TEXT(s)		(((s)->sy_type & N_TYPE) == N_TEXT)
+ /* True if in data segment */
+ #define S_IS_DATA(s)		(((s)->sy_type & N_TYPE) == N_DATA)
+ /* True if in bss segment */
+ #define S_IS_BSS(s)		(((s)->sy_type & N_TYPE) == N_BSS)
+ /* True if in abs segment */
+ #define S_IS_ABS(s)		(((s)->sy_type & N_TYPE) == N_ABS)
+ /* True if the symbol is external */
+ #define S_IS_EXTERNAL(s)	((s)->sy_type & N_EXT)
+ /* True if symbol has been defined, ie is in N_{TEXT,DATA,BSS,ABS} or N_EXT */
+ #define S_IS_DEFINED(s)		(((s)->sy_type & N_TYPE) != N_UNDF)
+ /* True if a debug special symbol entry */
+ #define S_IS_DEBUG(s)		((s)->sy_type & N_STAB)
+ /* True if a symbol is local symbol name */
+ /* A symbol name whose name begin with ^A is a gas internal pseudo symbol
+    nameless symbols come from .stab directives. */
+ #define S_IS_LOCAL(s)		(S_GET_NAME(s) && \
+ 				 !S_IS_DEBUG(s) && \
+ 				 (S_GET_NAME(s)[0] == '\001' || \
+ 				  (S_GET_NAME(s)[0] == 'L' && !flagseen['L'])))
+ /* True if a symbol is not defined in this file */
+ #define S_IS_EXTERN(s)		((s)->sy_type & N_EXT)
+ /* True if the symbol has been generated because of a .stabd directive */
+ #define S_IS_STABD(s)		((s)->sy_name == (char *)0)
+ 
+ /* Accessors */
+ /* The value of the symbol */
+ #define S_GET_VALUE(s)		((s)->sy_value)
+ /* The name of the symbol */
+ #define S_GET_NAME(s)		((s)->sy_name)
+ /* The pointer to the string table */
+ #define S_GET_OFFSET(s)		((s)->sy_strx)
+ /* The numeric value of the segment */
+ #define S_GET_SEGMENT(s)	((s)->sy_type & N_TYPE)
+ /* The n_other expression value */
+ #define S_GET_OTHER(s)		((s)->sy_other)
+ /* The n_desc expression value */
+ #define S_GET_DESC(s)		((s)->sy_desc)
+ 
+ /* Modifiers */
+ /* Set the value of the symbol */
+ #define S_SET_VALUE(s,v)	((s)->sy_value = (v))
+ /* Assume that a symbol cannot be simultaneously in more than on segment */
+ /* Set the segment to text */
+ #define S_SET_TEXT(s)		((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_TEXT)
+ /* Set the segment to data */
+ #define S_SET_DATA(s)		((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_DATA)
+ /* Set the segment to bss */
+ #define S_SET_BSS(s)		((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_BSS)
+ /* Set the segment to abs */
+ #define S_SET_ABS(s)		((s)->sy_type &= ~N_TYPE,(s)->sy_type|=N_ABS)
+ /* The symbol is external */
+ #define S_SET_EXTERNAL(s)	((s)->sy_type |= N_EXT)
+ /* The symbol is not external */
+ #define S_CLEAR_EXTERNAL(s)	((s)->sy_type &= ~N_EXT)
+ /* Set the name of the symbol */
+ #define S_SET_NAME(s,v)		((s)->sy_name = v)
+ /* Set the offset in the string table */
+ #define S_SET_OFFSET(s,v)	((s)->sy_strx = v)
+ /* Set the n_other expression value */
+ #define S_SET_OTHER(s,v)	((s)->sy_other = (v))
+ /* Set the n_desc expression value */
+ #define S_SET_DESC(s,v)		((s)->sy_desc = (v))
+ 
+ /* File header macro and type definition */
+ 
+ #define H_GET_FILE_SIZE(h)	(sizeof(struct exec) + \
+ 				 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
+ 				 H_GET_SYMBOL_TABLE_SIZE(h) + \
+ 				 H_GET_TEXT_RELOCATION_SIZE(h) + \
+ 				 H_GET_DATA_RELOCATION_SIZE(h) + \
+ 				 (h)->string_table_size)
+ 
+ #define H_GET_TEXT_SIZE(h)		((h)->header.a_text)
+ #define H_GET_DATA_SIZE(h)		((h)->header.a_data)
+ #define H_GET_BSS_SIZE(h)		((h)->header.a_bss)
+ #define H_GET_TEXT_RELOCATION_SIZE(h)	((h)->header.a_trsize)
+ #define H_GET_DATA_RELOCATION_SIZE(h)	((h)->header.a_drsize)
+ #define H_GET_SYMBOL_TABLE_SIZE(h)	((h)->header.a_syms)
+ #define H_GET_MAGIC_NUMBER(h)		((h)->header.a_magic)
+ #define H_GET_ENTRY_POINT(h)		((h)->header.a_entry)
+ #define H_GET_STRING_SIZE(h)		((h)->string_table_size)
+ #ifdef EXEC_MACHINE_TYPE
+ #define H_GET_MACHINE_TYPE(h)		((h)->header.a_machtype)
+ #endif /* EXEC_MACHINE_TYPE */
+ #ifdef EXEC_VERSION
+ #define H_GET_VERSION(h)		((h)->header.a_version)
+ #endif /* EXEC_VERSION */
+ 
+ #define H_SET_TEXT_SIZE(h,v)		((h)->header.a_text = (v))
+ #define H_SET_DATA_SIZE(h,v)		((h)->header.a_data = (v))
+ #define H_SET_BSS_SIZE(h,v)		((h)->header.a_bss = (v))
+ #define H_SET_RELOCATION_SIZE(h,t,d)	(H_SET_TEXT_RELOCATION_SIZE((h),(t)),\
+ 					 H_SET_DATA_RELOCATION_SIZE((h),(d)))
+ #define H_SET_TEXT_RELOCATION_SIZE(h,v)	((h)->header.a_trsize = (v))
+ #define H_SET_DATA_RELOCATION_SIZE(h,v)	((h)->header.a_drsize = (v))
+ #define H_SET_SYMBOL_TABLE_SIZE(h,v)	((h)->header.a_syms = (v) * \
+ 					 sizeof(struct nlist))
+ #define H_SET_MAGIC_NUMBER(h,v)		((h)->header.a_magic = (v))
+ #define H_SET_ENTRY_POINT(h,v)		((h)->header.a_entry = (v))
+ #define H_SET_STRING_SIZE(h,v)		((h)->string_table_size = (v))
+ #ifdef EXEC_MACHINE_TYPE
+ #define H_SET_MACHINE_TYPE(h,v)		((h)->header.a_machtype = (v))
+ #endif /* EXEC_MACHINE_TYPE */
+ #ifdef EXEC_VERSION
+ #define H_SET_VERSION(h,v)		((h)->header.a_version = (v))
+ #endif /* EXEC_VERSION */
+ 
+ /* Output the file(s) header(s) in a character array */
+ #define H_OUTPUT(h,where)	a_header_append(&(h)->header,(where))
+ 
+ /* Output a symbol entry */
+ #define SYMBOL_OUTPUT(s,w)	a_symbol_append((s), (w))
+ 
+ typedef struct {
+     struct exec	header;			/* a.out header */
+     long int	string_table_size;	/* names + '\0' + sizeof(int) */
+ } object_headers;
+ 
+ /* Format independent interface functions */
+ extern void		emit_relocations();
+ extern void		emit_symbols();
+ extern void		a_header_append();
+ extern void		a_symbol_append();
+ 
+ #endif /* AOUT_H */
*** /dev/null	Mon Oct 15 09:51:48 1990
--- coff.h	Mon Oct 15 09:59:28 1990
***************
*** 0 ****
--- 1,366 ----
+ #ifndef COFF_H
+ #define COFF_H
+ 
+ #include <filehdr.h>
+ #include <aouthdr.h>
+ #include <scnhdr.h>
+ #include <storclass.h>
+ #include <linenum.h>
+ #include <syms.h>
+ #include <reloc.h>
+ 
+ #include "machine.h"
+ #include "stack.h"
+ 
+ /* Tag to validate coff object file format processing */
+ #define coff
+ 
+ /* Define some processor dependent values according to the processor we are
+    on. */
+ #if defined(PROCESSOR_68000)
+ 
+ #define BYTE_ORDERING		F_AR32W    /* See filehdr.h for more info. */
+ #define FILE_HEADER_MAGIC	MC68MAGIC  /* ... */
+ 
+ #elif defined(PROCESSOR_i386)
+ 
+ #define BYTE_ORDERING		F_AR32WR   /* See filehdr.h for more info. */
+ #define FILE_HEADER_MAGIC	I386MAGIC  /* ... */
+ 
+ #elif
+ you lose
+ #endif 
+ 
+ /* Magic number of paged executable. */
+ #define OMAGIC	0413
+ 
+ /* Add these definitions to have a consistent convention for all the
+    types used in COFF format. */
+ #define AOUTHDR			struct aouthdr
+ #define AOUTHDRSZ		sizeof(AOUTHDR)
+ 
+ /* RELOCATION INFORMATION */
+ 
+ #define relocation_type RELOC	/* Relocation table entry */
+  
+ /* SYMBOL TABLE */
+ 
+ /* Symbol table entry data type */
+ 
+ #define symbol_type SYMENT	/* Symbol table entry */
+ 
+ /* If compiler generate leading underscores, remove them. */
+ 
+ #ifndef STRIP_UNDERSCORE
+ #define STRIP_UNDERSCORE 0
+ #endif /* STRIP_UNDERSCORE */
+ #define DO_NOT_STRIP	0
+ #define DO_STRIP	1
+ 
+ /* Symbol table macros and constants */
+ 
+ /* Possible and usefull section number in symbol table 
+  * The values of TEXT, DATA and BSS may not be portable.
+  */
+ 
+ #define C_TEXT_SECTION		1
+ #define C_DATA_SECTION		2
+ #define C_BSS_SECTION		3
+ #define C_ABS_SECTION		N_ABS
+ #define C_UNDEF_SECTION		N_UNDEF
+ #define C_DEBUG_SECTION		N_DEBUG
+ #define C_NTV_SECTION		N_TV
+ #define C_PTV_SECTION		P_TV
+ 
+ /*
+  *  Macros to extract information from a symbol table entry.
+  *  This syntaxic indirection allows independence regarding a.out or coff.
+  *  The argument (s) of all these macros is a pointer to a symbol table entry.
+  */
+ 
+ /* Predicates */
+ /* True if in text segment */
+ #define S_IS_TEXT(s)		((s)->sy_scnum == C_TEXT_SECTION)
+ /* True if in data segment */
+ #define S_IS_DATA(s)		((s)->sy_scnum == C_DATA_SECTION)
+ /* True if in bss segment */
+ #define S_IS_BSS(s)		((s)->sy_scnum == C_BSS_SECTION)
+ /* True if in bss segment */
+ #define S_IS_ABS(s)		((s)->sy_scnum == C_ABS_SECTION)
+ /* True if the symbol is external */
+ #define S_IS_EXTERNAL(s)        ((s)->sy_scnum == C_UNDEF_SECTION)
+ /* True if symbol has been defined, ie :
+   section > 0 (DATA, TEXT or BSS)
+   section == 0 and value > 0 (external bss symbol) */
+ #define S_IS_DEFINED(s)         ((s)->sy_scnum > C_UNDEF_SECTION || \
+ 				 ((s)->sy_scnum == C_UNDEF_SECTION && \
+ 				  (s)->sy_value > 0))
+ /* True if a debug special symbol entry */
+ #define S_IS_DEBUG(s)		((s)->sy_scnum == C_DEGUG_SECTION)
+ /* True if a symbol is local symbol name */
+ /* A symbol name whose name begin with ^A is a gas internal pseudo symbol */
+ #define S_IS_LOCAL(s)		(S_GET_NAME(s)[0] == '\001' || \
+ 				 (S_LOCAL_NAME(s) && !flagseen['L']))
+ /* True if a symbol is not defined in this file */
+ #define S_IS_EXTERN(s)		((s)->sy_scnum == 0 && (s)->sy_value == 0)
+ /*
+  * True if a symbol can be multiply defined (bss symbols have this def
+  * though it is bad practice)
+  */
+ #define S_IS_COMMON(s)		((s)->sy_scnum == 0 && (s)->sy_value != 0)
+ /* True if a symbol name is in the string table, i.e. its length is > 8. */
+ #define S_IS_STRING(s)		(strlen(S_GET_NAME(s)) > 8 ? 1 : 0)
+ 
+ /* Accessors */
+ /* The name of the symbol */
+ #define S_GET_NAME(s)		((char*)(s)->sy_offset)
+ /* The pointer to the string table */
+ #define S_GET_OFFSET(s)         ((s)->sy_offset)
+ /* The zeroes if symbol name is longer than 8 chars */
+ #define S_GET_ZEROES(s)		((s)->sy_zeroes)
+ /* The value of the symbol */
+ #define S_GET_VALUE(s)		((s)->sy_value)
+ /* The numeric value of the segment */
+ #define S_GET_SEGMENT(s)        ((s)->sy_scnum)
+ /* The data type */
+ #define S_GET_DATA_TYPE(s)	((s)->sy_type)
+ /* The storage class */
+ #define S_GET_STORAGE_CLASS(s)	((s)->sy_sclass)
+ /* The number of auxiliary entries */
+ #define S_GET_NUMBER_AUXILIARY(s)	((s)->sy_numaux)
+ 
+ /* Modifiers */
+ /* Set the name of the symbol */
+ #define S_SET_NAME(s,v)		((s)->sy_offset = (unsigned long)(v))
+ /* Set the offset of the symbol */
+ #define S_SET_OFFSET(s,v)	((s)->sy_offset = (v))
+ /* The zeroes if symbol name is longer than 8 chars */
+ #define S_SET_ZEROES(s,v)		((s)->sy_zeroes = (v))
+ /* Set the value of the symbol */
+ #define S_SET_VALUE(s,v)	((s)->sy_value = (v))
+ /* The numeric value of the segment */
+ #define S_SET_SEGMENT(s,v)        ((s)->sy_scnum = (v))
+ /* The data type */
+ #define S_SET_DATA_TYPE(s,v)	((s)->sy_type = (v))
+ /* The storage class */
+ #define S_SET_STORAGE_CLASS(s,v)	((s)->sy_sclass = (v))
+ /* The number of auxiliary entries */
+ #define S_SET_NUMBER_AUXILIARY(s,v)	((s)->sy_numaux = (v))
+ 
+ /* Additional modifiers */
+ /* Assume that a symbol cannot be simultaneously in more than on segment */
+ /* Set the segment to text */
+ #define S_SET_TEXT(s)		((s)->sy_scnum = C_TEXT_SECTION)
+ /* Set the segment to data */
+ #define S_SET_DATA(s)		((s)->sy_scnum = C_DATA_SECTION)
+ /* Set the segment to bss */
+ #define S_SET_BSS(s)		((s)->sy_scnum = C_BSS_SECTION)
+ /* Set the segment to abs */
+ #define S_SET_ABS(s)		((s)->sy_scnum = C_ABS_SECTION)
+ /* The symbol is external (does not mean undefined) */
+ #define S_SET_EXTERNAL(s)       S_SET_STORAGE_CLASS(s,C_EXT)
+ 
+ /* Auxiliary entry macros. SA_ stands for symbol auxiliary */
+ /* Omit the tv related fields */
+ /* Accessors */
+ #define SA_GET_SYM_TAGNDX(s)	((s)->sy_auxent.x_sym.x_tagndx)
+ #define SA_GET_SYM_LNNO(s)	((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_lnno)
+ #define SA_GET_SYM_SIZE(s)	((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_size)
+ #define SA_GET_SYM_FSIZE(s)	((s)->sy_auxent.x_sym.x_misc.x_fsize)
+ #define SA_GET_SYM_LNNOPTR(s)	((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr)
+ #define SA_GET_SYM_ENDNDX(s)	((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_endndx)
+ #define SA_GET_SYM_DIMEN(s,i)	((s)->sy_auxent.x_sym.x_fcnary.x_ary.x_dimen[(i)])
+ #define SA_GET_FILE_FNAME(s)	((s)->sy_auxent.x_file.x_fname)
+ #define SA_GET_SCN_SCNLEN(s)	((s)->sy_auxent.x_scn.x_scnlen)
+ #define SA_GET_SCN_NRELOC(s)	((s)->sy_auxent.x_scn.x_nreloc)
+ #define SA_GET_SCN_NLINNO(s)	((s)->sy_auxent.x_scn.x_nlinno)
+ 
+ /* Modifiers */
+ #define SA_SET_SYM_TAGNDX(s,v)	((s)->sy_auxent.x_sym.x_tagndx=(v))
+ #define SA_SET_SYM_LNNO(s,v)	((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_lnno=(v))
+ #define SA_SET_SYM_SIZE(s,v)	((s)->sy_auxent.x_sym.x_misc.x_lnsz.x_size=(v))
+ #define SA_SET_SYM_FSIZE(s,v)	((s)->sy_auxent.x_sym.x_misc.x_fsize=(v))
+ #define SA_SET_SYM_LNNOPTR(s,v)	((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_lnnoptr=(v))
+ #define SA_SET_SYM_ENDNDX(s,v)	((s)->sy_auxent.x_sym.x_fcnary.x_fcn.x_endndx=(v))
+ #define SA_SET_SYM_DIMEN(s,i,v)	((s)->sy_auxent.x_sym.x_fcnary.x_ary.x_dimen[(i)]=(v))
+ #define SA_SET_FILE_FNAME(s,v)	strncpy((s)->sy_auxent.x_file.x_fname,(v),FILNMLEN)
+ #define SA_SET_SCN_SCNLEN(s,v)	((s)->sy_auxent.x_scn.x_scnlen=(v))
+ #define SA_SET_SCN_NRELOC(s,v)	((s)->sy_auxent.x_scn.x_nreloc=(v))
+ #define SA_SET_SCN_NLINNO(s,v)	((s)->sy_auxent.x_scn.x_nlinno=(v))
+ 
+ /* Internal use only definitions. SF_ stands for symbol flags. */
+ 
+ /* These values can be assigned to sy_flags field of a symbolS */
+ /* The first 16 bits are general purpose. The last 16 bits are debug info */
+ 
+ #define SF_STATICS		0x00000001 /* Mark the .text & all symbols */
+ #define SF_DEFINED		0x00000002 /* Symbol is defined in this file */
+ #define SF_STRING		0x00000004 /* Symbol name length > 8 */
+ #define SF_LOCAL		0x00000008 /* Symbol must not be emitted */
+ 
+ #define SF_FUNCTION		0x00010000 /* The symbol is a function */
+ #define SF_PROCESS		0x00020000 /* Process symbol before write */
+ #define SF_TAGGED		0x00040000 /* Is associated with a tag */
+ #define SF_TAG			0x00080000 /* Is a tag */
+ #define SF_DEBUG		0x00100000 /* Is in debug or abs section */
+ 
+ /* Masks */
+ #define SF_NORMAL_MASK		0x0000ffff /* Non debug information */
+ #define SF_DEBUG_MASK		0xffff0000 /* Debug information */
+ 
+ /* Accessors */
+ #define SF_GET(s)		((s)->sy_flags)
+ #define SF_GET_NORMAL_FIELD(s)	((s)->sy_flags & SF_NORMAL_MASK)
+ #define SF_GET_DEBUG_FIELD(s)	((s)->sy_flags & SF_DEBUG_MASK)
+ #define SF_GET_FILE(s)		((s)->sy_flags & SF_FILE)
+ #define SF_GET_STATICS(s)	((s)->sy_flags & SF_STATICS)
+ #define SF_GET_DEFINED(s)	((s)->sy_flags & SF_DEFINED)
+ #define SF_GET_STRING(s)	((s)->sy_flags & SF_STRING)
+ #define SF_GET_LOCAL(s)		((s)->sy_flags & SF_LOCAL)
+ #define SF_GET_FUNCTION(s)      ((s)->sy_flags & SF_FUNCTION)
+ #define SF_GET_PROCESS(s)	((s)->sy_flags & SF_PROCESS)
+ #define SF_GET_DEBUG(s)		((s)->sy_flags & SF_DEBUG)
+ #define SF_GET_TAGGED(s)	((s)->sy_flags & SF_TAGGED)
+ #define SF_GET_TAG(s)		((s)->sy_flags & SF_TAG)
+ 
+ /* Modifiers */
+ #define SF_SET(s,v)		((s)->sy_flags = (v))
+ #define SF_SET_NORMAL_FIELD(s,v)((s)->sy_flags |= ((v) & SF_NORMAL_MASK))
+ #define SF_SET_DEBUG_FIELD(s,v)	((s)->sy_flags |= ((v) & SF_DEBUG_MASK))
+ #define SF_SET_FILE(s)		((s)->sy_flags |= SF_FILE)
+ #define SF_SET_STATICS(s)	((s)->sy_flags |= SF_STATICS)
+ #define SF_SET_DEFINED(s)	((s)->sy_flags |= SF_DEFINED)
+ #define SF_SET_STRING(s)	((s)->sy_flags |= SF_STRING)
+ #define SF_SET_LOCAL(s)		((s)->sy_flags |= SF_LOCAL)
+ #define SF_SET_FUNCTION(s)      ((s)->sy_flags |= SF_FUNCTION)
+ #define SF_SET_PROCESS(s)	((s)->sy_flags |= SF_PROCESS)
+ #define SF_SET_DEBUG(s)		((s)->sy_flags |= SF_DEBUG)
+ #define SF_SET_TAGGED(s)	((s)->sy_flags |= SF_TAGGED)
+ #define SF_SET_TAG(s)		((s)->sy_flags |= SF_TAG)
+ 
+ /* File header macro and type definition */
+ 
+ /*
+  * File position calculators. Beware to use them when all the
+  * appropriate fields are set in the header.
+  */
+ 
+ #define H_GET_FILE_SIZE(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
+ 	   H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
+ 	   H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h) + \
+ 	   H_GET_SYMBOL_TABLE_SIZE(h) * SYMESZ + \
+ 	   (h)->string_table_size)
+ #define H_GET_TEXT_FILE_OFFSET(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ)
+ #define H_GET_DATA_FILE_OFFSET(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
+ 	   H_GET_TEXT_SIZE(h))
+ #define H_GET_BSS_FILE_OFFSET(h) 0
+ #define H_GET_RELOCATION_FILE_OFFSET(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
+ 	   H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h))
+ #define H_GET_LINENO_FILE_OFFSET(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
+ 	   H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
+ 	   H_GET_RELOCATION_SIZE(h))
+ #define H_GET_SYMBOL_TABLE_FILE_OFFSET(h) \
+     (long)(FILHSZ + AOUTHDRSZ + \
+ 	   H_GET_NUMBER_OF_SECTIONS(h) * SCNHSZ + \
+ 	   H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
+ 	   H_GET_RELOCATION_SIZE(h) + H_GET_LINENO_SIZE(h))
+ 
+ /* Accessors */
+ /* aouthdr */
+ #define H_GET_MAGIC_NUMBER(h)           ((h)->aouthdr.magic)
+ #define H_GET_VERSION_STAMP(h)		((h)->aouthdr.vstamp)
+ #define H_GET_TEXT_SIZE(h)              ((h)->aouthdr.tsize)
+ #define H_GET_DATA_SIZE(h)              ((h)->aouthdr.dsize)
+ #define H_GET_BSS_SIZE(h)               ((h)->aouthdr.bsize)
+ #define H_GET_ENTRY_POINT(h)            ((h)->aouthdr.entry)
+ #define H_GET_TEXT_START(h)		((h)->aouthdr.text_start)
+ #define H_GET_DATA_START(h)		((h)->aouthdr.data_start)
+ /* filehdr */
+ #define H_GET_FILE_MAGIC_NUMBER(h)	((h)->filehdr.f_magic)
+ #define H_GET_NUMBER_OF_SECTIONS(h)	((h)->filehdr.f_nscns)
+ #define H_GET_TIME_STAMP(h)		((h)->filehdr.f_timdat)
+ #define H_GET_SYMBOL_TABLE_POINTER(h)	((h)->filehdr.f_symptr)
+ #define H_GET_SYMBOL_TABLE_SIZE(h)	((h)->filehdr.f_nsyms)
+ #define H_GET_SIZEOF_OPTIONAL_HEADER(h)	((h)->filehdr.f_opthdr)
+ #define H_GET_FLAGS(h)			((h)->filehdr.f_flags)
+ /* Extra fields to achieve bsd a.out compatibility and for convinience */
+ #define H_GET_RELOCATION_SIZE(h)   	((h)->relocation_size)
+ #define H_GET_STRING_SIZE(h)            ((h)->string_table_size)
+ #define H_GET_LINENO_SIZE(h)            ((h)->lineno_size)
+ 
+ /* Modifiers */
+ /* aouthdr */
+ #define H_SET_MAGIC_NUMBER(h,v)         ((h)->aouthdr.magic = (v))
+ #define H_SET_VERSION_STAMP(h,v)	((h)->aouthdr.vstamp = (v))
+ #define H_SET_TEXT_SIZE(h,v)            ((h)->aouthdr.tsize = (v))
+ #define H_SET_DATA_SIZE(h,v)            ((h)->aouthdr.dsize = (v))
+ #define H_SET_BSS_SIZE(h,v)             ((h)->aouthdr.bsize = (v))
+ #define H_SET_ENTRY_POINT(h,v)          ((h)->aouthdr.entry = (v))
+ #define H_SET_TEXT_START(h,v)		((h)->aouthdr.text_start = (v))
+ #define H_SET_DATA_START(h,v)		((h)->aouthdr.data_start = (v))
+ /* filehdr */
+ #define H_SET_FILE_MAGIC_NUMBER(h,v)	((h)->filehdr.f_magic = (v))
+ #define H_SET_NUMBER_OF_SECTIONS(h,v)	((h)->filehdr.f_nscns = (v))
+ #define H_SET_TIME_STAMP(h,v)		((h)->filehdr.f_timdat = (v))
+ #define H_SET_SYMBOL_TABLE_POINTER(h,v)	((h)->filehdr.f_symptr = (v))
+ #define H_SET_SYMBOL_TABLE_SIZE(h,v)    ((h)->filehdr.f_nsyms = (v))
+ #define H_SET_SIZEOF_OPTIONAL_HEADER(h,v) ((h)->filehdr.f_opthdr = (v))
+ #define H_SET_FLAGS(h,v)		((h)->filehdr.f_flags = (v))
+ /* Extra fields to achieve bsd a.out compatibility and for convinience */
+ #define H_SET_RELOCATION_SIZE(h,t,d) 	((h)->relocation_size = (t)+(d))
+ #define H_SET_STRING_SIZE(h,v)          ((h)->string_table_size = (v))
+ #define H_SET_LINENO_SIZE(h,v)          ((h)->lineno_size = (v))
+ 
+ /* Output the file(s) header(s) in a character array */
+ #define H_OUTPUT(h,where) c_header_append(&(h)->aouthdr, &(h)->filehdr,(where))
+ 
+ /* Output a symbol entry */
+ #define SYMBOL_OUTPUT(s,w)	c_symbol_append((s), (w))
+ 
+ typedef struct {
+     AOUTHDR	   aouthdr;             /* a.out header */
+     FILHDR	   filehdr;		/* File header, not machine dep. */
+     long int       string_table_size;   /* names + '\0' + sizeof(int) */
+     long int	   relocation_size;	/* Cumulated size of relocation
+ 					   information for all sections in
+ 					   bytes. */
+     long int	   lineno_size;		/* Size of the line number information
+ 					   table in bytes */
+ } object_headers;
+ 
+ /* Format independent interface functions */
+ extern void             emit_relocations();
+ extern void		emit_symbols();
+ extern void		c_symbol_merge();
+ extern void             c_header_append();
+ extern void             c_symbol_append();
+ extern void		c_section_header_append();
+ extern char*		c_section_symbol();
+ extern void		c_section_header();
+ 
+ /* --------------  Line number handling ------- */
+ extern int		text_lineno_number;
+ 
+ typedef struct internal_lineno {
+     LINENO line;			/* The lineno structure itself */
+     char* frag;				/* Frag the line number is related to*/
+     struct internal_lineno* next;	/* Forward chain pointer */
+ } lineno;
+ 
+ extern lineno* c_new_file();
+ extern void    emit_lineno();
+ extern lineno* lineno_rootP;
+ extern lineno* lineno_lastP;
+ #endif /* COFF_H */
+ 
+ 
*** /dev/null	Mon Oct 15 09:51:48 1990
--- m-motor.h	Mon Oct 15 08:12:50 1990
***************
*** 0 ****
--- 1,10 ----
+ /* Machine specific defines for the unisoft 680x0 V.3.2 version 1.3 */
+ #define unisoft
+ #define PROCESSOR_68000
+ 
+ /* Return true if s (a non null string pointer), points to a local variable
+    name. */
+ #define S_LOCAL_NAME(s)  (S_GET_NAME(s)[0] == 'L')
+ 
+ /* Remove leading underscore from the gcc generated symbol names */
+ #define STRIP_UNDERSCORE 1
*** /dev/null	Mon Oct 15 09:51:48 1990
--- README.coff	Mon Oct 15 17:42:45 1990
***************
*** 0 ****
--- 1,79 ----
+ The coff patches intend to do the following :
+ 
+    . Generate coff files very compatible with vanilla linker.
+    . Understands coff debug directives.
+ 
+ Here are the guidelines of the work I have done :
+ 
+    . Encapsulate format dependent code in macros where it is possible.
+    . Where not possible differenciate with #ifdef
+    . try not to change the calling conventions of the existing functions. 
+ 	I made one exception : symbol_new. I would be pleased to hear about
+ 	a better solution. (symbols.c)
+    . Extend the use of N_TYPE_seg seg_N_TYPE tables so that segments can
+ 	be manipulated without using their format dependent name. (subsegs.c)
+    . Write a function to parse the .def debug directives
+    . Write two small peaces of code to handle the .ln directive.
+    . In write.c try to move all the cross compilation specifics (md_..) to
+      format dependent files.
+    . Encapsulate the data structures using generic types, macros calls.
+    . Added too much code to resolve the complexity of the symbol table
+      generated. Most of the code deals with debug stuff.
+    . Create another makefile, shorter, cleaner.
+    . Create a config.gas shell script to mimic the gcc,gdb... configuration
+ 	mechanism. This reduce the complexity of the makefile.
+    . Isolate the format dependent code in two files 
+ 	coff.c coff.h
+ 	aout.c aout.h
+ 	elf.c elf.h    [ Not yet ;-]
+    . added a little stack management routine for coff in file stack.c
+    . isolate os specific flags in m- files
+ 
+ If further development is planed on it is should solve the following problems :
+ 
+    . Encapsulate DESC & OTHER tests in a macro call. I'm not aware
+ 	of their exact semantics.
+    . Clean up the seg_N_TYPE N_TYPE_seg naming scheme
+    . Try to remove as much reference to segment dependent names as possible
+    . Find a cleaner solution for symbol_new.
+    . Report the modifications on vax, ns32k, sparc machine dependent files.
+ 	To acheive this goal, search for \<N_, sy_, symbol_new and symbolS.
+    . Allow an arbitrary number of segments (spare sections .ctor .dtor .bletch)
+    . Find a way to extend the debug information without breaking sdb
+      compatibility. Mainly intended for G++.
+    . should it do something to generate shared libraries objects ?
+ 
+ I have tested this code on the following processor/os. gcc-1.37.1 was
+    used for all the tests.
+ 
+ 386	SCO unix ODT
+ 	gcc-1.37.1, gas, emacs-18.55
+ 
+ 386	Esix rev C
+ 	gas-1.36/write.s
+ 
+ 386	Ix 2.02
+ 	gas, all the X11R4 mit clients
+ 
+ 386	CTIX 3.2
+ 	xsol (X11R4 solitary game), gas
+ 
+ 68030	unisoft 1.3	
+ 	the kernel (V.3.2) + tcp/ip extensions
+ 	bash-1.05, bison-1.11, compress-4.0, cproto, cshar, diff-1.14,
+ 	dist-18.55, flex-2.3, gas-1.36, gcc-1.37.1, gdb-3.6, grep-1.5,
+ 	kermit, make-3.58, makedep, patch, printf,
+ 	tar-1.08, texi2roff, uuencode, uutraf-1.2
+ 
+ 68020	sunos 3.5 (no, not coff, just to be sure that I didn't
+ 			introduce errors)
+ 	gcc-1.37.1, gas, emacs-18.55, gdb-3.6, bison-1.11, diff-1.14, 
+ 	make-3.58, tar-1.08
+ 
+ 68030   sunos 4.0.3 (idem)
+ 	gas
+ 
+ I would be glad to hear about new experiences
+ 
+ 	Loic  (loic at adesign.uucp or loic at afp.uucp)
+ 
*** /dev/null	Mon Oct 15 09:51:48 1990
--- append.h	Thu Aug  2 15:00:24 1990
***************
*** 0 ****
--- 1,1 ----
+ extern void	append();
*** /dev/null	Mon Oct 15 09:51:48 1990
--- config.gas	Mon Oct 15 17:22:59 1990
***************
*** 0 ****
--- 1,61 ----
+ # Set the appropriate links for machine dependent files
+  
+ # Chose one of
+ #
+ # i386				for 386 box running SCO unix (ODT),
+ #					            Esix rev C
+ #						    Ix 2.02
+ #						    CTIX 3.2
+ #
+ # sun-3				for sun3 running SunOs 3.5
+ #						 SunOs 4.0.3
+ #					
+ # motorola-3600-unisoft-1.3	for Motorola 3600 running Unisoft 1.3 (V.3.2)
+ # microlec-2030-lectra-1	for Microlec 2030 running Lectra 1.1
+ 
+ case $1 in
+ 	default)
+ 		cp /dev/null dependencies
+ 		ln aout.h oformat.h
+ 		exit
+ 	;;
+ 	sun-3)
+ 		[ -f m68k.h ] && rm -f m68k.h
+ 		ln m-sun3.h m68k.h
+ 		machine_file=m68k.c
+ 		atof_file=atof-ieee.c
+ 		machine_header=m-sun3.h
+ 		opcode_header=m68k-opcode.h
+ 		object_format=aout
+ 	;;
+ 	motorola-3600-unisoft-1.3|microlec-2030-lectra-1.1)
+ 		[ -f m68k.h ] && rm -f m68k.h
+ 		ln m-sun3.h m68k.h
+ 		machine_file=m68k.c
+ 		atof_file=atof-ieee.c
+ 		machine_header=m-motor.h
+ 		opcode_header=m68k-opcode.h
+ 		object_format=coff
+ 	;;
+ 	i386)
+ 		[ -f m68k.h ] && rm -f m68k.h
+ 		machine_file=i386.c
+ 		atof_file=atof-ieee.c
+ 		machine_header=m-i386.h
+ 		opcode_header=i386-opcode.h
+ 		object_format=coff
+ 	;;
+ 	*)
+ 		echo $1 not a known configuration
+ 		exit 1
+ 	;;
+ esac
+ 
+ rm -f machine.c atof.c machine.h oformat.h oformat.c opcode.h
+ set -x
+ ln $machine_file machine.c
+ ln $atof_file atof.c
+ ln $machine_header machine.h
+ ln ${object_format}.c oformat.c
+ ln ${object_format}.h oformat.h
+ ln ${opcode_header} opcode.h
*** /dev/null	Mon Oct 15 09:51:48 1990
--- stack.c	Wed Aug 29 13:22:32 1990
***************
*** 0 ****
--- 1,59 ----
+ #include "stack.h"
+ 
+ extern char* malloc();
+ extern char* realloc();
+ 
+ stack* stack_init(chunk_size, element_size)
+ unsigned long chunk_size;
+ unsigned long element_size;
+ {
+     stack* st;
+     if((st = (stack*)malloc(sizeof(stack))) == (stack*)0)
+ 	return (stack*)0;
+     if((st->data = malloc(chunk_size)) == (char*)0) {
+ 	free(st);
+ 	return (stack*)0;
+     }
+     st->pointer = 0;
+     st->size = chunk_size;
+     st->chunk_size = chunk_size;
+     st->element_size = element_size;
+     return st;
+ }
+ 
+ void stack_delete(st)
+ stack* st;
+ {
+     free(st->data);
+     free(st);
+ }
+ 
+ char* stack_push(st, element)
+ stack* st;
+ char* element;
+ {
+     if(st->pointer + st->element_size >= st->size) {
+ 	st->size += st->chunk_size;
+ 	if((st->data = realloc(st->data, st->size)) == (char*)0)
+ 	    return (char*)0;
+     }
+     memcpy(st->data + st->pointer, element, st->element_size);
+     st->pointer += st->element_size;
+     return st->data + st->pointer;
+ }
+ 
+ char* stack_pop(st)
+ stack* st;
+ {
+     if((st->pointer -= st->element_size) < 0) {
+ 	st->pointer = 0;
+ 	return (char*)0;
+     }
+     return st->data + st->pointer;
+ }
+ 
+ char* stack_top(st)
+ stack* st;
+ {
+     return st->data + st->pointer - st->element_size;
+ }
*** /dev/null	Mon Oct 15 09:51:48 1990
--- aout.c	Mon Oct 15 08:53:32 1990
***************
*** 0 ****
--- 1,146 ----
+ #include "as.h"
+ #include "md.h"
+ #include "aout.h"
+ #include "struc-symbol.h"
+ #include "write.h"
+ #include "append.h"
+ 
+ /* Relocation. */
+ 
+ /*
+  * In: length of relocation (or of address) in chars: 1, 2 or 4.
+  * Out: GNU LD relocation length code: 0, 1, or 2.
+  */
+ 
+ static unsigned char
+ 
+ nbytes_r_length [] = {
+   42, 0, 1, 42, 2
+   };
+ 
+ 
+ /* The sparc needs its own emit_relocations() */
+ #ifndef SPARC
+ /*
+  *		emit_relocations()
+  *
+  * Crawl along a fixS chain. Emit the segment's relocations.
+  */
+ void
+ emit_relocations (fixP, segment_address_in_file)
+      register fixS *	fixP;	/* Fixup chain for this segment. */
+      relax_addressT	segment_address_in_file;
+ {
+   struct relocation_info	ri;
+   register symbolS *		symbolP;
+ 
+ 	/* JF this is for paranoia */
+   bzero((char *)&ri,sizeof(ri));
+   for ( ;  fixP;  fixP = fixP -> fx_next)
+     {
+       if (symbolP = fixP -> fx_addsy)
+ 	{
+ 
+ #ifndef hpux
+ 		/* These two 'cuz of NS32K */
+ 	  ri . r_bsr		= fixP -> fx_bsr;
+ 	  ri . r_disp		= fixP -> fx_im_disp;
+ #endif
+ 
+ 	  ri . r_length		= nbytes_r_length [fixP -> fx_size];
+ 	  ri . r_pcrel		= fixP -> fx_pcrel;
+ 	  ri . r_address	= fixP -> fx_frag -> fr_address
+ 	    +   fixP -> fx_where
+ 	      - segment_address_in_file;
+ 	  if ((symbolP -> sy_type & N_TYPE) == N_UNDF)
+ 	    {
+ 	      ri . r_extern	= 1;
+ 	      ri . r_symbolnum	= symbolP -> sy_number;
+ 	    }
+ 	  else
+ 	    {
+ 	      ri . r_extern	= 0;
+ 	      ri . r_symbolnum	= symbolP -> sy_type & N_TYPE;
+ 	    }
+ 
+ 	  /* 
+ 	    The 68k machines assign bit-fields from higher bits to 
+ 	    lower bits ("left-to-right") within the int.  VAXen assign 
+ 	    bit-fields from lower bits to higher bits ("right-to-left").
+ 	    Both handle multi-byte numbers in their usual fashion
+ 	    (Big-endian and little-endian stuff).
+ 	    Thus we need a machine dependent routine to make
+ 	    sure the structure is written out correctly.  FUN!
+ 	   */
+ 	  md_ri_to_chars((char *) &ri, ri); 
+ 	  append (&next_object_file_charP, (char *)& ri, (unsigned long)sizeof(ri));
+ 	}
+     }
+ 
+ }
+ #endif
+ 
+ /* Aout file generation & utilities */
+ 
+ /* Convert a lvalue to machine dependent data */
+ #define MD(v)	\
+   md_number_to_chars((char *)&header->v,header->v, sizeof(header->v))
+ 
+ void a_header_append(header, where)
+ struct exec * header;
+ char** where;
+ {
+     MD(a_text);
+     MD(a_data);
+     MD(a_bss);
+     MD(a_trsize);
+     MD(a_drsize);
+     MD(a_syms);
+     MD(a_magic);
+     MD(a_entry);
+ #ifdef EXEC_MACHINE_TYPE
+     MD(a_machtype);
+ #endif /* EXEC_MACHINE_TYPE */
+ #ifdef EXEC_VERSION
+     MD(a_version);
+ #endif /* EXEC_VERSION */
+     append(where, (char *)header, sizeof(struct exec));
+ }
+ 
+ #undef MD
+ /* Convert a lvalue to machine dependent data */
+ #define MD(v)	\
+   md_number_to_chars((char *)&symbolP->v,symbolP->v, sizeof(symbolP->v))
+ 
+ void a_symbol_append(symbolP, where)
+ symbolS *	symbolP;
+ char** 		where;
+ {
+     MD(sy_strx);
+     MD(sy_desc);
+     MD(sy_value);
+     append(where, (char *)&symbolP->sy_symbol, sizeof(symbol_type));
+ }
+ 
+ void emit_symbols(symbol_rootP, where)
+ symbolS *	symbol_rootP;
+ char**		where;
+ {
+     symbolS *	symbolP;
+     /*
+      * Emit all symbols left in the symbol chain.
+      */
+     for(symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next) {
+ 	/* Used to save the offset of the name. It is used to point
+ 	   to the string in memory but must be a file offset. */
+ 	register char *	temp;
+ 
+ 	temp = S_GET_NAME(symbolP);
+ 	S_SET_OFFSET(symbolP, symbolP->sy_name_offset);
+ 	/* Any symbol still undefined is made N_EXT. */
+ 	if (!S_IS_DEFINED(symbolP))
+ 	    S_SET_EXTERNAL(symbolP);
+ 	SYMBOL_OUTPUT(symbolP, where);
+ 	S_SET_NAME(symbolP,temp);
+     }
+ }
--
Loic Dachary 	loic at adesign.uucp or loic at afp.uucp 
Voice		+33 1 40 35 20 20



More information about the Alt.sources mailing list