From: Alan Cox Date: Tue, 28 Jun 2016 18:24:25 +0000 (+0100) Subject: ld09/as09: generate fuzix binaries X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=ed6372a6ea95b532abb92af527b9d45bdd1cd274;p=FUZIX.git ld09/as09: generate fuzix binaries This seems to be able to turn .globl _start .globl _main .text _start: jmp _main FCC "F" FCC "Z" FCC "X" FCC "1" FCB 0x80 FDB 0 FDB (_codeend-_start) FDB 0 FDB 0 FDB 0 _main: rts _codeend: .data _data FDB 1234 .bss _bss FDB 12 into what looks like an actual binary --- diff --git a/Applications/as09/Makefile.z80 b/Applications/as09/Makefile.z80 index da6e55bb..0f11185f 100644 --- a/Applications/as09/Makefile.z80 +++ b/Applications/as09/Makefile.z80 @@ -13,7 +13,7 @@ OBJS = as.rel assemble.rel errors.rel express.rel \ all: as09 as09: $(OBJS) - $(CC) -o $@ $(OBJS) + $(CC) -o $@ --nostdio $(OBJS) clean realclean clobber: rm -f *.rel as09 *~ diff --git a/Applications/as09/alloc.c b/Applications/as09/alloc.c index 2ca84f3b..4dd61b52 100644 --- a/Applications/as09/alloc.c +++ b/Applications/as09/alloc.c @@ -29,9 +29,6 @@ void init_heap(void) brk(heapend); if(sbrk(0) != heapend) as_abort(NOMEMEORY); -#else -#ifdef SOS_EDOS - heapend = stackreg() - STAKSIZ; #else heapptr = malloc(USERMEM); heapend = heapptr + USERMEM; @@ -39,7 +36,6 @@ void init_heap(void) as_abort(NOMEMEORY); #endif #endif -#endif } void *temp_buf(void) diff --git a/Applications/as09/const.h b/Applications/as09/const.h index 881e5110..e22c03ef 100644 --- a/Applications/as09/const.h +++ b/Applications/as09/const.h @@ -16,24 +16,15 @@ #define I80386 /* generate 80386 code */ #endif #define MNSIZE /* allow byte size in mnemonic, e.g. "movb" */ -#undef SOS_EDOS /* source OS is EDOS */ /* defaults */ #define DIRCHAR '/' /* character separating filename from dir */ -#define INBUFSIZE 8192 +#define INBUFSIZE 512 #define SOS_EOLSTR "\012" /* defaults modified by switches */ -#ifdef SOS_EDOS -# undef INBUFSIZE -# define INBUFSIZE 512 -# undef SOS_EOLSTR -# define SOS_EOLSTR "\015\012" -# define STAKSIZ 256 /* table grows up to stack less this */ -#endif - #ifdef __AS386_16__ # undef INBUFSIZE # define INBUFSIZE 512 @@ -305,11 +296,10 @@ oops - ENTBIT misplaced /* special segments */ -#define BSSLOC 3 -#define DATALOC 3 -#define DPLOC 2 -#define STRLOC 1 #define TEXTLOC 0 +#define DATALOC 1 +#define BSSLOC 2 +#define DPLOC 3 #include "errors.h" diff --git a/Applications/as09/genlist.c b/Applications/as09/genlist.c index 82c13dd2..6bdf554a 100644 --- a/Applications/as09/genlist.c +++ b/Applications/as09/genlist.c @@ -429,8 +429,7 @@ void writenl(void) /* write 1 offset_t, order to suit target */ -void writeoff(offset) -offset_t offset; +void writeoff(offset_t offset) { char buf[sizeof offset]; diff --git a/Applications/as09/mops.c b/Applications/as09/mops.c index 73c3a4f4..fa6d9e7a 100644 --- a/Applications/as09/mops.c +++ b/Applications/as09/mops.c @@ -2812,8 +2812,7 @@ void predec1(void) /* common routine for PSHS/PULS/PSHU/PULU */ -void sustack(stackreg) -reg_pt stackreg; +void sustack(reg_pt stackreg) { reg_pt reg; diff --git a/Applications/as09/pops.c b/Applications/as09/pops.c index f3673353..a77d2e80 100644 --- a/Applications/as09/pops.c +++ b/Applications/as09/pops.c @@ -25,9 +25,7 @@ static struct sym_s *needlabel P((void)); static void showredefinedlabel P((void)); static void setloc P((unsigned seg)); -static void bumpsem(flagptr, defval) -register struct flags_s *flagptr; -int defval; +static void bumpsem(struct flags_s *flagptr, int defval) { int newcount; @@ -70,8 +68,7 @@ int defval; /* check symbol is either undefined */ /* or has the same segment & relocatability as lc */ -bool_pt checksegrel(symptr) -register struct sym_s *symptr; +bool_pt checksegrel(struct sym_s *symptr) { if ((symptr->type & LABIT || (symptr->data & IMPBIT && !(symptr->data & UNDBIT))) && @@ -745,7 +742,7 @@ void pfdb(void) firstdata = lastexp.data; while (TRUE) { - *adrptr++ = lastexp; + memcpy(adrptr++, &lastexp, sizeof(lastexp)); mcount += 2; /* won't overflow, line length limits it */ if (sym != COMMA) break; diff --git a/Applications/as09/readsrc.c b/Applications/as09/readsrc.c index 79b53e40..4a4a70f3 100644 --- a/Applications/as09/readsrc.c +++ b/Applications/as09/readsrc.c @@ -114,6 +114,7 @@ fd_t open_input(char *name) struct stat st; if( fstat(fd, &st) >= 0 ) filelength = st.st_size; + /* FIXME: check allowing for the +4 below */ if( filelength > (((unsigned)-1)>>1)-3 ) { mem_end = mem_start = "\n\n"; diff --git a/Applications/as09/typeconv.c b/Applications/as09/typeconv.c index 2af5aff9..ab802221 100644 --- a/Applications/as09/typeconv.c +++ b/Applications/as09/typeconv.c @@ -14,8 +14,10 @@ #define NATIVE_ENDIAN #endif -void xxerr P((char *)); -void xxerr(x) char * x; { write(2, x, strlen(x)); } +void xxerr(const char *x) +{ + write(2, x, strlen(x)); +} #ifdef __AS386_16__ static int no_swap = 1; diff --git a/Applications/ld09/Makefile b/Applications/ld09/Makefile index b8a34b0f..d8789fd8 100644 --- a/Applications/ld09/Makefile +++ b/Applications/ld09/Makefile @@ -16,46 +16,29 @@ CRT0 = ../../Library/libs/crt0_6809.o LIBDIR =/usr/bin LDFLAGS = -# Will need some of these if you want native executables on non-Linux/i386 -# -DDETECTAOUT # Turn on detection. -# -DV7_A_OUT # a.out.h is like V7 -# -DBSD_A_OUT # a.out.h is like BSD -# -DSTANDARD_GNU_A_OUT # a.out.h is like GNU normal. -# -# -DREL_OUTPUT -DBUGCOMPAT # -r Produces weird *.o files. -# -DEFS =-DREL_OUTPUT +DEFS = # An alternative file for a non-standard a.out.h (eg i386 linux on an Alpha) # # NATIVE=-DA_OUT_INCL='"a_out_local.h"' -OBJS= dumps.o io.o ld.o readobj.o table.o typeconv.o linksyms.o mkar.o \ - writebin.o writeemu.o +OBJS= dumps.o io.o ld.o readobj.o table.o typeconv.o linksyms.o writefuzix.o -all: ld09 objchop +all: ld09 ld09: $(OBJS) $(LINKER) -o $@ $(LINKER_OPT) $(CRT0) $(OBJS) -objchop: objchop.o - $(LINKER) -o $@ $(LINKER_OPT) $(CRT0) $(OBJS) - clean realclean clobber: rm -f *.o ld09 ld09r objchop catimage objdump09 *~ $(OBJS): align.h ar.h bindef.h byteord.h config.h const.h globvar.h obj.h \ - syshead.h type.h x86_aout.h + syshead.h type.h ar.h: test -f ar.h || \ { rm -f ar.h ; ln -s ../libc/include/ar.h . ; } || \ ln ../libc/include/ar.h . -writebin.o: writebin.c - $(CC) $(CFLAGS) $(DEFS) $(NATIVE) -c $< - -writerel.o: writebin.c - .c.o: $(CC) $(COPT) $(CFLAGS) $(DEFS) -c $< -o $@ diff --git a/Applications/ld09/Makefile.z80 b/Applications/ld09/Makefile.z80 index a4aa8746..a8f90c00 100644 --- a/Applications/ld09/Makefile.z80 +++ b/Applications/ld09/Makefile.z80 @@ -3,46 +3,26 @@ CC = fcc CFLAGS = -c -O2 -# Will need some of these if you want native executables on non-Linux/i386 -# -DDETECTAOUT # Turn on detection. -# -DV7_A_OUT # a.out.h is like V7 -# -DBSD_A_OUT # a.out.h is like BSD -# -DSTANDARD_GNU_A_OUT # a.out.h is like GNU normal. -# -# -DREL_OUTPUT -DBUGCOMPAT # -r Produces weird *.o files. -# -DEFS =-DREL_OUTPUT +DEFS = -# An alternative file for a non-standard a.out.h (eg i386 linux on an Alpha) -# -# NATIVE=-DA_OUT_INCL='"a_out_local.h"' +OBJS= dumps.rel io.rel ld.rel readobj.rel table.rel typeconv.rel linksyms.rel \ + writefuzix.rel -OBJS= dumps.rel io.rel ld.rel readobj.rel table.rel typeconv.rel linksyms.rel mkar.rel \ - writebin.rel writeemu.rel - -all: ld09 objchop +all: ld09 ld09: $(OBJS) $(CC) -o $@ $(OBJS) -objchop: objchop.rel - $(CC) -o $@ $(OBJS) - clean realclean clobber: - rm -f *.rel ld09 ld09r objchop catimage objdump09 *~ + rm -f *.rel *.lst *.sym *.asm ld09 ld09r objchop catimage objdump09 *~ *.bin *.lk *.map *.noi $(OBJS): align.h ar.h bindef.h byteord.h config.h const.h globvar.h obj.h \ - syshead.h type.h x86_aout.h + syshead.h type.h ar.h: test -f ar.h || \ { rm -f ar.h ; ln -s ../libc/include/ar.h . ; } || \ ln ../libc/include/ar.h . -writebin.rel: writebin.c - $(CC) $(CFLAGS) $(DEFS) $(NATIVE) -c $< - -writerel.rel: writebin.c - .c.rel: $(CC) $(CFLAGS) $(DEFS) -c $< -o $@ diff --git a/Applications/ld09/catimage.c b/Applications/ld09/catimage.c deleted file mode 100644 index 1f5e1609..00000000 --- a/Applications/ld09/catimage.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * This program concatenates memory images the executables specified - * on it's command line. - * - * The 'boot' image must have a symbol table any symbols that match - * the below patterns have their values patched. - * - * int __seg0_text; - Always zero - * int __seg0_data; - Segment offset of data of boot executable - * - * int __seg1_text; - Segment offset of text of first executable - * int __seg1_data; - Segment offset of data of first executable - * int __seg2_text; - Segment offset of text of second executable - * int __seg2_data; - Segment offset of data of second executable - * - * int __seg9_text; - Segment offset of text of executable nine - * int __seg9_data; - Segment offset of data of executable nine - * - * Any segment that's not an exact multiple of 16 bytes long is rounded up. - * - */ - -#include -#ifdef __STDC__ -#include -#include -#endif -#include "x86_aout.h" - -#ifndef __OUT_OK -#error "Compile error: struct exec invalid (long not 32 bit ?)" -#endif - -unsigned long text_offt[10]; /* Locations to patch (0=don't) */ -unsigned long data_offt[10]; - -char * input_file = ""; -FILE * ofd; -FILE * ifd = 0; -struct exec header; - -main(argc, argv) -int argc; -char ** argv; -{ - long image_offset, text_off; - int image_id; - - if( argc < 3 || argc > 11 ) - fatal("Usage: catimage mem.bin boot.out [a1.out] ... [a9.out]"); - - open_obj(argv[2]); - - ofd = fopen(argv[1], "w"); - if( ofd == 0 ) fatal("Cannot open output file"); - - read_symtable(); - - image_offset = 0; - - for(image_id=0; image_id < argc-2; image_id++) - { - open_obj(argv[image_id+2]); - - printf("File %-14s seg=0x%04lx text=0x%04lx data=0x%04lx\n", - input_file, (image_offset>>4), - (header.a_text>>4), (header.a_total>>4)); - - text_off = image_offset; - if( header.a_flags & A_SEP ) - { - copy_segment(image_offset, A_TEXTPOS(header), header.a_text); - image_offset += header.a_text; - image_offset = ((image_offset+15L)&-16L); - - copy_segment(image_offset, A_DATAPOS(header), header.a_data); - } - else - { - copy_segment(image_offset, A_TEXTPOS(header), - header.a_text+header.a_data); - } - - patch_bin(text_offt[image_id], (unsigned)(text_off>>4)); - patch_bin(data_offt[image_id], (unsigned)(image_offset>>4)); - - image_offset += header.a_total; - image_offset = ((image_offset+15L)&-16L); - } - - if( fseek(ofd, image_offset-1, 0) < 0 ) - fatal("Cannot seek to end of output"); - - fputc('\0', ofd); - fclose(ofd); - - printf("Output file size %ldKb\n", ((image_offset+0x3FF)>>10)); - - if( ifd ) fclose(ifd); - exit(0); -} - -open_obj(fname) -char * fname; -{ - input_file = fname; - - if( ifd ) fclose(ifd); - - ifd = fopen(fname, "r"); - if( ifd == 0 ) fatal("Cannot open input file"); - - if( fread(&header, A_MINHDR, 1, ifd) != 1 ) - fatal("Incomplete executable header"); - - if( BADMAG(header) ) - fatal("Input file has bad magic number"); -} - -copy_segment(out_offset, in_offset, length) -long out_offset, in_offset, length; -{ - char buffer[1024]; - int ssize; - long bsize = length; - - if( fseek(ifd, in_offset, 0) < 0 ) - fatal("Cannot seek to start of input segment"); - - if( fseek(ofd, out_offset, 0) < 0 ) - fatal("Cannot seek to start of output segment"); - - while(bsize>0) - { - if( bsize > sizeof(buffer) ) ssize = sizeof(buffer); - else ssize = bsize; - - if( (ssize=fread(buffer, 1, ssize, ifd)) <= 0 ) - fatal("Error reading segment from executable"); - if( fwrite(buffer, 1, ssize, ofd) != ssize ) - fatal("Error writing output file"); - bsize -= ssize; - } -} - -patch_bin(file_off, value) -long file_off; -int value; -{ - char wbuf[4]; - if( file_off > 0 ) - { - printf("Patch at offset 0x%05lx = %04x\n", file_off, value); - - wbuf[0] = value; - wbuf[0] = (value>>8); - - if( fseek(ofd, file_off, 0) < 0 ) - fatal("Cannot seek to patch binary"); - - if( fwrite(wbuf, 1, 2, ofd) != 2 ) - fatal("Error patching output file"); - } -} - -read_symtable() -{ - struct nlist item; - int nitems; - long base_off = 0; - - if( header.a_syms == 0 ) - fatal("Input file has been stripped!"); - - if( fseek(ifd, A_SYMPOS(header), 0) < 0 ) - fatal("Cannot seek to start of symbols"); - - nitems = header.a_syms; - - /* Foreach symbol */ - while( fread(&item, sizeof(struct nlist), 1, ifd) == 1 ) - { - if( nitems-- <= 0 ) break; - - /* Match the name */ - if( memcmp(item.n_name, "__seg", 5) != 0 || item.n_name[6] != '_' ) - continue; - - /* Externals only */ - if( (item.n_sclass & N_CLASS) != C_EXT ) - continue; - - /* Data seg only */ - if( (item.n_sclass & N_SECT) != N_DATA && - (item.n_sclass & N_SECT) != N_BSS && - (item.n_sclass & N_SECT) != N_TEXT ) - continue; - - if( item.n_name[5] < '0' || item.n_name[5] > '9' ) - continue; - - if( (header.a_flags & A_SEP) && (item.n_sclass & N_SECT) != N_TEXT ) - base_off = header.a_text; - else - base_off = 0; - - switch( item.n_name[7] ) - { - case 'd': data_offt[item.n_name[5]-'0'] = base_off+item.n_value; break; - case 't': text_offt[item.n_name[5]-'0'] = base_off+item.n_value; break; - } - -#ifdef DEBUG - printf("%-8.8s ", item.n_name); - printf("%08lx ", item.n_value); - switch(item.n_sclass & N_CLASS) - { - case C_NULL: printf("C_NULL "); break; - case C_EXT: printf("C_EXT "); break; - case C_STAT: printf("C_STAT "); break; - default: printf("%-6d ", (item.n_sclass & N_CLASS)); break; - } - switch(item.n_sclass & N_SECT) - { - case N_UNDF: printf("N_UNDF "); break; - case N_ABS : printf("N_ABS "); break; - case N_TEXT: printf("N_TEXT "); break; - case N_DATA: printf("N_DATA "); break; - case N_BSS : printf("N_BSS "); break; - case N_COMM: printf("N_COMM "); break; - } - printf("\n"); -#endif - } -} - -fatal(str) -char * str; -{ - fprintf(stderr, "catimage:%s: %s\n", input_file, str); - exit(2); -} - diff --git a/Applications/ld09/config.h b/Applications/ld09/config.h index f4d9ec96..9ab77f65 100644 --- a/Applications/ld09/config.h +++ b/Applications/ld09/config.h @@ -10,8 +10,6 @@ /* one of these target operating systems must be defined */ -#undef EDOS /* generate EDOS executable */ -#undef MINIX /* generate Minix executable */ #define FUZIX /* FUZIX executable */ /* these may need to be defined to suit the source processor */ diff --git a/Applications/ld09/globvar.h b/Applications/ld09/globvar.h index 5663cc04..1554b986 100644 --- a/Applications/ld09/globvar.h +++ b/Applications/ld09/globvar.h @@ -13,12 +13,7 @@ EXTERN struct redlist *redfirst; /* first on list of redefined symbols */ /* K&R _explicitly_ says extern followed by public is OK */ extern char hexdigit[]; /* constant */ extern int headerless; /* Don't output header on exe */ -#ifndef VERY_SMALL_MEMORY -extern int v7; /* Generate an UNIX v7 a.out header */ -#endif -#ifndef MSDOS extern int cpm86; /* Generate CP/M-86 CMD header */ -#endif extern bin_off_t text_base_value; /* Base address of text seg */ extern bin_off_t data_base_value; /* Base or alignment of data seg */ diff --git a/Applications/ld09/io.c b/Applications/ld09/io.c index 186f0cda..63633840 100644 --- a/Applications/ld09/io.c +++ b/Applications/ld09/io.c @@ -44,10 +44,6 @@ static int trelfd; /* text relocation output file descriptor */ #endif static unsigned warncount; /* count of warnings */ -#ifdef MSDOS -#define off_t long /* NOT a typedef */ -#endif - static void errexit(char *message); static void flushout(void); #ifdef REL_OUTPUT @@ -71,6 +67,7 @@ void ioinit(char *progname) if(*progname=='/') refname=progname+1; + /* FIXME: we need a malloc with error check here */ #ifdef REL_OUTPUT drelbuf = malloc(DRELBUFSIZE); drelbuftop = drelbuf + DRELBUFSIZE; @@ -127,10 +124,8 @@ void executable(void) { if (errcount) unlink(outputname); -#ifndef MSDOS else chmod(outputname, outputperms); -#endif } void flusherr(void) @@ -201,12 +196,10 @@ void openout(char *filename) #endif outputerror("cannot open"); -#ifndef MSDOS /* Can't do this on MSDOS; it upsets share.exe */ oldmask = umask(0); umask(oldmask); outputperms = ((CREAT_PERMS | EXEC_PERMS) & ~oldmask); chmod(filename, outputperms & ~EXEC_PERMS); -#endif #ifdef REL_OUTPUT drelbufptr = drelbuf; @@ -288,7 +281,7 @@ void putstr(const char *message) putbyte(*message++); } -static void putstrn(char *message) +static void putstrn(const char *message) { putstr(message); putbyte('\n'); diff --git a/Applications/ld09/ld.c b/Applications/ld09/ld.c index 05b8d752..c5b8c64f 100644 --- a/Applications/ld09/ld.c +++ b/Applications/ld09/ld.c @@ -8,33 +8,18 @@ #include "type.h" #include "globvar.h" -#define MAX_LIBS (NR_STDLIBS + 5) -#ifdef MC6809 -#define NR_STDLIBS 1 -#else -#define NR_STDLIBS 0 -#endif +#define MAX_LIBS 5 bin_off_t text_base_value = 0; /* XXX */ bin_off_t data_base_value = 0; /* XXX */ -bin_off_t heap_top_value = 0; /* XXX */ int headerless = 0; -#ifndef VERY_SMALL_MEMORY -int v7 = 0; -#endif -#ifndef MSDOS -int cpm86 = 0; -#endif char hexdigit[] = "0123456789abcdef"; static bool_t flag[128]; static char *libs[MAX_LIBS] = { -#ifdef MC6809 - "/usr/local/lib/m09/", -#endif 0 }; -static int lastlib = NR_STDLIBS; +static int lastlib = 0; static char *buildname(char *pre, char *mid, char *suf); static char *expandlib(char *fn); @@ -86,9 +71,6 @@ int main(int argc, char **argv) objinit(); syminit(); typeconv_init(INT_BIG_ENDIAN, LONG_BIG_ENDIAN); -#ifndef MC6809 - flag['3'] = sizeof(char *) >= 4; -#endif outfilename = NUL_PTR; for (argn = 1; argn < argc; ++argn) { @@ -109,22 +91,16 @@ int main(int argc, char **argv) #ifdef REL_OUTPUT case 'B': /* Broken -r for dosemu. */ #endif +#ifdef HAS_32BIT case '0': /* use 16-bit libraries */ case '3': /* use 32-bit libraries */ +#endif case 'M': /* print symbols linked */ case 'i': /* separate I & D output */ case 'm': /* print modules linked */ case 's': /* strip symbols */ case 'z': /* unmapped zero page */ - case 'N': /* Native format a.out */ case 'd': /* Make a headerless outfile */ -#ifndef MSDOS - case 'c': /* Write header in CP/M-86 format */ -#endif - case 'y': /* Use a newer symbol table */ -#ifndef VERY_SMALL_MEMORY - case '7': /* Produce a UNIX v7 a.out header */ -#endif if (arg[2] == 0) flag[(int) arg[1]] = TRUE; else if (arg[2] == '-' && arg[3] == 0) @@ -176,17 +152,6 @@ int main(int argc, char **argv) if (errno != 0) use_error("invalid data address"); break; - case 'H': /* heap top address */ - if (arg[2] == 0 && ++argn >= argc) - usage(); - errno = 0; - if (arg[2] == 0 ) - heap_top_value = strtoul(argv[argn], (char **)0, 16); - else - heap_top_value = strtoul(arg+2, (char **)0, 16); - if (errno != 0) - use_error("invalid heap top"); - break; case 'l': /* library name */ tfn = buildname(libprefix, arg + 2, libsuffix); if ((infilename = expandlib(tfn)) == NUL_PTR) @@ -206,65 +171,23 @@ int main(int argc, char **argv) } if(icount==0) usage(); -#ifdef BUGCOMPAT - if( icount==1 && ( flag['r'] && !flag['N'] ) ) { - flag['r'] = 0; - flag['B'] = 1; - } -#endif - #ifdef REL_OUTPUT -#ifndef MSDOS if( flag['r'] && !flag['N'] ) { /* Do a relocatable link -- actually fake it with 'ar.c' */ ld86r(argc, argv); } #endif -#endif - -#ifdef MSDOS - /* MSDOS Native is special, we make a COM file */ - if( flag['N'] ) - { - flag['N'] = 0; - flag['d'] = 1; - text_base_value = 0x100; - } -#endif /* Headerless executables can't use symbols. */ headerless = flag['d']; if( headerless ) flag['s'] = 1; -#ifndef VERY_SMALL_MEMORY - /* UNIX seventh edition executables */ - v7 = flag['7']; -#endif - -#ifndef MSDOS - /* CP/M-86 executables can't use symbols. */ - cpm86 = flag['c']; - if ( cpm86 ) flag['s'] = 1; -#endif - linksyms(flag['r'] | flag['B']); if (outfilename == NUL_PTR) outfilename = "a.out"; -#ifndef MSDOS - if( flag['N'] ) - writebin(outfilename, flag['i'], flag['3'], flag['s'], - flag['z'] & flag['3']); - else -#endif - if( flag['B'] ) - write_dosemu(outfilename, flag['i'], flag['3'], flag['s'], - flag['z'] & flag['3']); -#if 0 /* FIXME */ - else - write_elks(outfilename, flag['i'], flag['3'], flag['s'], - flag['z'], flag['y']); -#endif + write_fuzix(outfilename, flag['i'], flag['3'], flag['s'], + flag['z']); if (flag['m']) dumpmods(); if (flag['M']) diff --git a/Applications/ld09/mkar.c b/Applications/ld09/mkar.c index b271a590..2ca98554 100644 --- a/Applications/ld09/mkar.c +++ b/Applications/ld09/mkar.c @@ -47,12 +47,14 @@ char buf[128]; for(ar=1; ar -#ifdef __STDC__ -#include -#include -#endif -#include "x86_aout.h" - -#ifndef __OUT_OK - -int main(int argc, char *argv[]) -{ - fprintf(stderr, "Compile error: struct exec invalid\n"); - exit(1); -} - -#else - -FILE * ifd; -struct exec header; - -void fatal(const char * str) -{ - fprintf(stderr, "objchop: %s\n", str); - exit(2); -} - -int write_file(char *fname, long bsize) -{ - char buffer[1024]; - int ssize; - FILE * ofd; - - ofd = fopen(fname, "w"); - if( ofd == 0 ) fatal("Cannot open output file"); - - while(bsize>0) - { - if( bsize > sizeof(buffer) ) ssize = sizeof(buffer); - else ssize = bsize; - - if( (ssize=fread(buffer, 1, ssize, ifd)) <= 0 ) - fatal("Error reading segment from executable"); - if( fwrite(buffer, 1, ssize, ofd) != ssize ) - fatal("Error writing output file"); - bsize -= ssize; - } - fclose(ofd); -} - -int main(int argc, char **argv) -{ - FILE * ofd; - if( argc != 5 ) fatal("Usage: objchop a.out text.bin data.bin sizes.asm"); - - ifd = fopen(argv[1], "r"); - if( ifd == 0 ) fatal("Cannot open input file"); - - if( fread(&header, A_MINHDR, 1, ifd) != 1 ) - fatal("Incomplete executable header"); - - if( BADMAG(header) ) - fatal("Input file has bad magic number"); - - if( fseek(ifd, A_TEXTPOS(header), 0) < 0 ) - fatal("Cannot seek to start of text"); - - write_file(argv[2], header.a_text); - - if( fseek(ifd, A_DATAPOS(header), 0) < 0 ) - fatal("Cannot seek to start of data"); - - write_file(argv[3], header.a_data); - - ofd = fopen(argv[4], "w"); - if( ofd == 0 ) fatal("Cannot open output file"); - - fprintf(ofd, "TEXT_SIZE=%ld\nDATA_SIZE=%ld\nBSS_SIZE=%ld\nALLOC_SIZE=%ld\n", - header.a_text, header.a_data, header.a_bss, header.a_total); - - fclose(ofd); - - exit(0); -} - -#endif diff --git a/Applications/ld09/objdump86.c b/Applications/ld09/objdump86.c index 85032a17..89f4e2da 100644 --- a/Applications/ld09/objdump86.c +++ b/Applications/ld09/objdump86.c @@ -55,11 +55,6 @@ void fetch_aout_hdr _((void)); void dump_aout _((void)); void size_aout _((void)); void nm_aout _((void)); -#ifndef VERY_SMALL_MEMORY -void fetch_v7_hdr _((void)); -void dump_v7 _((void)); -void size_v7 _((void)); -#endif int obj_ver; int sections; @@ -282,19 +277,6 @@ char * archive; case 2: nm_aout(); break; } break; -#ifndef VERY_SMALL_MEMORY - case 2: /* V7 executable */ - fseek(ifd, 0L, 0); - fetch_v7_hdr(); - - switch(display_mode) - { - case 0: dump_v7(); break; - case 1: size_v7(); break; - case 2: error("Symbol table not supported for v7"); exit(1); break; - } - break; -#endif } if( strtab ) free(strtab); @@ -333,13 +315,6 @@ read_objheader() sections = 1; return 1; } -#ifndef VERY_SMALL_MEMORY - if( buf[1] == 1 ) /* 04xx octal */ - { - sections = 1; - return 2; - } -#endif return error("Bad magic number"); } @@ -893,80 +868,3 @@ nm_aout() if( pending_nl ) putchar('\n'); } -#ifndef VERY_SMALL_MEMORY -/************************************************************************/ -/* V7 a.out versions - */ - -void -fetch_v7_hdr() -{ - int i; - - h_len = 8; - for(i=0; i -#undef a_magic -#define __STRUCT_EXEC_OVERRIDE__ -#define N_NLIST_DECLARED -#define N_RELOCATION_INFO_DECLARED -#endif - -#define __GNU_EXEC_MACROS__ - -#ifndef __STRUCT_EXEC_OVERRIDE__ - -struct exec -{ - unsigned long a_info; /* Use macros N_MAGIC, etc for access */ - unsigned long a_text; /* length of text, in bytes */ - unsigned long a_data; /* length of data, in bytes */ - unsigned long a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned long a_syms; /* length of symbol table data in file, in bytes */ - unsigned long a_entry; /* start address */ - unsigned long a_trsize; /* length of relocation info for text, in bytes */ - unsigned long a_drsize; /* length of relocation info for data, in bytes */ -}; - -#endif /* __STRUCT_EXEC_OVERRIDE__ */ - -/* these go in the N_MACHTYPE field */ -enum machine_type { -#if defined (M_OLDSUN2) - M__OLDSUN2 = M_OLDSUN2, -#else - M_OLDSUN2 = 0, -#endif -#if defined (M_68010) - M__68010 = M_68010, -#else - M_68010 = 1, -#endif -#if defined (M_68020) - M__68020 = M_68020, -#else - M_68020 = 2, -#endif -#if defined (M_SPARC) - M__SPARC = M_SPARC, -#else - M_SPARC = 3, -#endif - /* skip a bunch so we don't run into any of sun's numbers */ - M_386 = 100, -}; - -#if !defined (N_MAGIC) -#define N_MAGIC(exec) ((exec).a_info & 0xffff) -#endif -#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) -#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0xff) << 16) \ - | (((flags) & 0xff) << 24)) -#define N_SET_MAGIC(exec, magic) \ - ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) - -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) - -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) - -#ifndef OMAGIC -/* Code indicating object file or impure executable. */ -#define OMAGIC 0407 -/* Code indicating pure executable. */ -#define NMAGIC 0410 -/* Code indicating demand-paged executable. */ -#define ZMAGIC 0413 -#endif /* not OMAGIC */ - -#if !defined (N_BADMAG) -#define N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) -#endif - -#define _N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) - -#define _N_HDROFF(x) (SEGMENT_SIZE - sizeof (struct exec)) - -#if !defined (N_TXTOFF) -#define N_TXTOFF(x) \ - (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec)) -#endif - -#if !defined (N_DATOFF) -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) -#endif - -#if !defined (N_TRELOFF) -#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) -#endif - -#if !defined (N_DRELOFF) -#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) -#endif - -#if !defined (N_SYMOFF) -#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize) -#endif - -#if !defined (N_STROFF) -#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) -#endif - -/* Address of text segment in memory after it is loaded. */ -#if !defined (N_TXTADDR) -#define N_TXTADDR(x) 0 -#endif - -/* Address of data segment in memory after it is loaded. - Note that it is up to you to define SEGMENT_SIZE - on machines not listed here. */ -#if defined(vax) || defined(hp300) || defined(pyr) -#define SEGMENT_SIZE PAGE_SIZE -#endif -#ifdef hp300 -#define PAGE_SIZE 4096 -#endif -#ifdef sony -#define SEGMENT_SIZE 0x2000 -#endif /* Sony. */ -#ifdef is68k -#define SEGMENT_SIZE 0x20000 -#endif -#if defined(m68k) && defined(PORTAR) -#define PAGE_SIZE 0x400 -#define SEGMENT_SIZE PAGE_SIZE -#endif - -#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1)) - -#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) - -#ifndef N_DATADDR -#define N_DATADDR(x) \ - (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ - : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) -#endif - -/* Address of bss segment in memory after it is loaded. */ -#if !defined (N_BSSADDR) -#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) -#endif - -#if !defined (N_NLIST_DECLARED) -struct nlist { - union { - char *n_name; - struct nlist *n_next; - long n_strx; - } n_un; - unsigned char n_type; - char n_other; - short n_desc; - unsigned long n_value; -}; -#endif /* no N_NLIST_DECLARED. */ - -#if !defined (N_UNDF) -#define N_UNDF 0 -#endif -#if !defined (N_ABS) -#define N_ABS 2 -#endif -#if !defined (N_TEXT) -#define N_TEXT 4 -#endif -#if !defined (N_DATA) -#define N_DATA 6 -#endif -#if !defined (N_BSS) -#define N_BSS 8 -#endif -#if !defined (N_COMM) -#define N_COMM 18 -#endif -#if !defined (N_FN) -#define N_FN 15 -#endif - -#if !defined (N_EXT) -#define N_EXT 1 -#endif -#if !defined (N_TYPE) -#define N_TYPE 036 -#endif -#if !defined (N_STAB) -#define N_STAB 0340 -#endif - -/* The following type indicates the definition of a symbol as being - an indirect reference to another symbol. The other symbol - appears as an undefined reference, immediately following this symbol. - - Indirection is asymmetrical. The other symbol's value will be used - to satisfy requests for the indirect symbol, but not vice versa. - If the other symbol does not have a definition, libraries will - be searched to find a definition. */ -#define N_INDR 0xa - -/* The following symbols refer to set elements. - All the N_SET[ATDB] symbols with the same name form one set. - Space is allocated for the set in the text section, and each set - element's value is stored into one word of the space. - The first word of the space is the length of the set (number of elements). - - The address of the set is made into an N_SETV symbol - whose name is the same as the name of the set. - This symbol acts like a N_DATA global symbol - in that it can satisfy undefined external references. */ - -/* These appear as input to LD, in a .o file. */ -#define N_SETA 0x14 /* Absolute set element symbol */ -#define N_SETT 0x16 /* Text set element symbol */ -#define N_SETD 0x18 /* Data set element symbol */ -#define N_SETB 0x1A /* Bss set element symbol */ - -/* This is output from LD. */ -#define N_SETV 0x1C /* Pointer to set vector in data area. */ - -#if !defined (N_RELOCATION_INFO_DECLARED) -/* This structure describes a single relocation to be performed. - The text-relocation section of the file is a vector of these structures, - all of which apply to the text section. - Likewise, the data-relocation section applies to the data section. */ - -struct relocation_info -{ - /* Address (within segment) to be relocated. */ - unsigned long r_address; -#if 0 - /* The meaning of r_symbolnum depends on r_extern. */ - unsigned int r_symbolnum:24; - /* Nonzero means value is a pc-relative offset - and it should be relocated for changes in its own address - as well as for changes in the symbol or section specified. */ - unsigned int r_pcrel:1; - /* Length (as exponent of 2) of the field to be relocated. - Thus, a value of 2 indicates 1<<2 bytes. */ - unsigned int r_length:2; - /* 1 => relocate with value of symbol. - r_symbolnum is the index of the symbol - in file's the symbol table. - 0 => relocate with the address of a segment. - r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS - (the N_EXT bit may be set also, but signifies nothing). */ - unsigned int r_extern:1; - /* Four bits that aren't used, but when writing an object file - it is desirable to clear them. */ - unsigned int r_pad:4; -#else - unsigned long foo; -#endif -}; -#endif /* no N_RELOCATION_INFO_DECLARED. */ - - -#endif /* __A_OUT_GNU_H__ */ - -#undef M_386 -#define M_386 A_I80386 - -#undef N_MAGIC -#define N_MAGIC3(magic0, magic1, type) \ - ((magic0) | ((magic1) << 8) | ((type) << 16)) -#define N_MAGIC(exec) \ - N_MAGIC3((exec).a_magic[0], (exec).a_magic[1], (exec).a_flags) - -#undef N_MACHTYPE -#define N_MACHTYPE(exec) ((enum machine_type)((exec).a_cpu)) - -#undef N_FLAGS -#define N_FLAGS(exec) 0 - -#undef N_SET_INFO -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_magic[0] = (magic) & 0xff, \ - (exec).a_magic[1] = ((magic) >> 8) & 0xff, \ - (exec).a_flags = ((magic) >> 16) & 0xff, \ - (exec).a_cpu = (type) & 0xff) - -#undef N_SET_MAGIC -#define N_SET_MAGIC(exec, magic) \ - ((exec).a_magic[0] = (magic) & 0xff, \ - (exec).a_magic[1] = ((magic) >> 8) & 0xff, \ - (exec).a_flags = ((magic) >> 16) & 0xff) - -#undef N_SET_MACHTYPE -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_cpu = (machtype) & 0xff, \ - (exec).a_hdrlen = sizeof (exec)) - -#undef N_SET_FLAGS -#define N_SET_FLAGS(exec, flags) /* nothing */ - -#undef OMAGIC -#define OMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, 0) - -#undef NMAGIC -#define NMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, A_EXEC) - -#undef ZMAGIC -#define ZMAGIC N_MAGIC3(A_MAGIC0, A_MAGIC1, A_EXEC) - -#undef _N_HDROFF -#define _N_HDROFF(x) 0 - -#undef PAGE_SIZE -#define PAGE_SIZE 16 -#define SEGMENT_SIZE PAGE_SIZE -#define getpagesize() PAGE_SIZE - -#endif /* _BSD_A_OUT_H */ diff --git a/Applications/ld09/syshead.h b/Applications/ld09/syshead.h index 4ab0b637..e603e504 100644 --- a/Applications/ld09/syshead.h +++ b/Applications/ld09/syshead.h @@ -5,4 +5,5 @@ #include #include #include +#include diff --git a/Applications/ld09/type.h b/Applications/ld09/type.h index 6a7acd41..de7bbf69 100644 --- a/Applications/ld09/type.h +++ b/Applications/ld09/type.h @@ -84,7 +84,7 @@ void executable(void); void flusherr(void); void openin(char *filename); void openout(char *filename); -void putstr(char *message); +void putstr(const char *message); void put08x(bin_off_t num); void put08lx(bin_off_t num); void putbstr(unsigned width, char *str); @@ -161,6 +161,10 @@ void write_dosemu(char *outfilename, bool_pt argsepid, bool_pt argbits32, void write_elks(char *outfilename, bool_pt argsepid, bool_pt argbits32, bool_pt argstripflag, bool_pt arguzp, bool_pt nsym); +/* write_fuzix.c */ +void write_fuzix(char *outfilename, bool_pt argsepid, bool_pt argbits32, + bool_pt argstripflag, bool_pt arguzp); + /* linksym.c */ void linksyms(bool_pt argreloc_output); diff --git a/Applications/ld09/v7_aout.h b/Applications/ld09/v7_aout.h deleted file mode 100644 index 020079b6..00000000 --- a/Applications/ld09/v7_aout.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Header format of 16-bit - * Seventh edition UNIX executables */ - -#ifndef _V7_A_OUT_H -#define _V7_A_OUT_H - -#define V7_MAGIC4 0405 /* v7 overlay */ -#define V7_OMAGIC 0407 /* I&D in one segment (impure) */ -#define V7_NMAGIC 0410 /* read-only text */ -#define V7_MAGIC3 0411 /* v7 separate I&D (pure) */ -#define V7_ZMAGIC 0413 /* v8 demand load */ - -#define V7_HEADERLEN 16 - -struct v7_exec { - short magic; - unsigned short textsize; - unsigned short datasize; - unsigned short bsssize; - unsigned short symtabsize; - unsigned short entry; - unsigned short pad; - unsigned short noreloc; -}; - -#endif /* _V7_A_OUT_H */ diff --git a/Applications/ld09/writebin.c b/Applications/ld09/writebin.c deleted file mode 100644 index d43cff81..00000000 --- a/Applications/ld09/writebin.c +++ /dev/null @@ -1,1044 +0,0 @@ - -/* writebin.c - write binary file for linker */ - -/* Copyright (C) 1994 Bruce Evans */ - -#include "syshead.h" -#include "bindef.h" -#include "const.h" -#include "obj.h" -#include "type.h" -#include "globvar.h" - -#ifdef AOUT_DETECTED -#define btextoffset (text_base_value) -#define bdataoffset (data_base_value) -#define page_size() 4096 - -#ifdef __ELF__ -#ifndef ELF_SYMS -#define ELF_SYMS 1 -#endif -#endif - -#ifdef EDOS -# define FILEHEADERLENGTH 0 -#endif -#ifdef MINIX -# ifdef BSD_A_OUT -# ifdef STANDARD_GNU_A_OUT -# define HEADERLEN (sizeof(struct exec)) -# else -# define HEADERLEN (48) -# endif -# else -# ifdef REL_OUTPUT -# define HEADERLEN (reloc_output?sizeof(struct exec):A_MINHDR) - /* part of header not counted in offsets */ -# else -# define HEADERLEN (A_MINHDR) -# endif -# endif -# ifndef FILEHEADERLENGTH -# define FILEHEADERLENGTH (headerless?0:HEADERLEN) -# endif -#endif -#define DPSEG 2 - -#define CM_MASK 0xC0 -#define MODIFY_MASK 0x3F -#define S_MASK 0x04 -#define OF_MASK 0x03 - -#define CM_SPECIAL 0 -#define CM_ABSOLUTE 0x40 -#define CM_OFFSET_RELOC 0x80 -#define CM_SYMBOL_RELOC 0xC0 - -#define CM_EOT 0 -#define CM_BYTE_SIZE 1 -#define CM_WORD_SIZE 2 -#define CM_LONG_SIZE 3 -#define CM_1_SKIP 17 -#define CM_2_SKIP 18 -#define CM_4_SKIP 19 -#define CM_0_SEG 32 - -#define ABS_TEXT_MAX 64 - -#define memsizeof(struc, mem) sizeof(((struc *) 0)->mem) - -static bool_t bits32; /* nonzero for 32-bit executable */ -static bin_off_t combase[NSEG];/* bases of common parts of segments */ -static bin_off_t comsz[NSEG]; /* sizes of common parts of segments */ -static fastin_t curseg; /* current segment, 0 to $F */ -static bin_off_t edataoffset; /* end of data */ -static bin_off_t endoffset; /* end of bss */ -static bin_off_t etextoffset; /* end of text */ -static bin_off_t etextpadoff; /* end of padded text */ -#ifdef REL_OUTPUT -static unsigned ndreloc; /* number of data relocations */ -#endif -static unsigned nsym; /* number of symbols written */ -#ifdef REL_OUTPUT -static unsigned ntreloc; /* number of text relocations */ -extern bool_t reloc_output; /* nonzero to leave reloc info in output */ -#endif -static unsigned relocsize; /* current relocation size 1, 2 or 4 */ -static bin_off_t segadj[NSEG]; /* adjusts (file offset - seg offset) */ - /* depends on zero init */ -static bin_off_t segbase[NSEG];/* bases of data parts of segments */ -static char segboundary[9] = "__seg0DH"; - /* name of seg boundary __seg0DL to __segfCH */ -static bin_off_t segpos[NSEG]; /* segment positions for current module */ -static bin_off_t segsz[NSEG]; /* sizes of data parts of segments */ - /* depends on zero init */ -static bool_t sepid; /* nonzero for separate I & D */ -static bool_t stripflag; /* nonzero to strip symbols */ -static bin_off_t spos; /* position in current seg */ -static bool_t uzp; /* nonzero for unmapped zero page */ - -#ifdef EDOS -static unsigned binheaderlength(char *commandname); -char *idconvert(struct entrylist *elptr, char *commandname); -#endif -static void linkmod(struct modstruct *modptr); -static void padmod(struct modstruct *modptr); -static void setsym(char *name, bin_off_t value); -static void symres(char *name); -static void setseg(fastin_pt newseg); -static void skip(unsigned countsize); -#ifdef EDOS -static void writeheader(char *commandname); -#else -static void writeheader(void); -#endif -static void writenulls(bin_off_t count); - -/* write binary file */ -#ifndef FUNCNAME -#define FUNCNAME writebin -#endif - -void FUNCNAME(char *outfilename, bool_pt argsepid, bool_pt argbits32, - bool_pt argstripflag, bool_pt arguzp) -{ - char buf4[4]; -#ifdef EDOS - char *commandname; -#endif - char *cptr; - struct nlist extsym; - flags_t flags; - struct modstruct *modptr; - fastin_t seg; - unsigned sizecount; - bin_off_t tempoffset; - - sepid = argsepid; - bits32 = argbits32; - stripflag = argstripflag; -#ifdef REL_OUTPUT - uzp = arguzp && !reloc_output; -#else - uzp = arguzp; -#endif - if (uzp) - { - if (btextoffset == 0) -#ifdef QMAGIC - btextoffset = page_size()+HEADERLEN; -#else - btextoffset = page_size(); -#endif - if (bdataoffset == 0 && sepid) - bdataoffset = page_size(); - } -#ifdef EDOS - commandname = stralloc(outfilename); - if ((cptr = strchr(commandname, ':')) != NUL_PTR) - commandname = cptr + 1; - if ((cptr = strrchr(commandname, '.')) != NUL_PTR) - *cptr = 0; -#endif - - /* reserve special symbols use curseg to pass parameter to symres() */ - for (curseg = 0; curseg < NSEG; ++curseg) - { - segboundary[5] = hexdigit[curseg]; /* to __segX?H */ - segboundary[6] = 'D'; - symres(segboundary); /* __segXDH */ - segboundary[7] = 'L'; - symres(segboundary); /* __segXDL */ - segboundary[6] = 'C'; - symres(segboundary); /* __segXCL */ - segboundary[7] = 'H'; - symres(segboundary); /* __segXCH */ -#ifndef DATASEGS - if( curseg > 3 ) - { - segboundary[6] = 'S'; - segboundary[7] = 'O'; - symres(segboundary); /* __segXSO */ - } -#endif - } -#ifdef EDOS - curseg = 0; /* data seg, s.b. variable */ -#else - curseg = 3; -#endif - symres("__edata"); - symres("__end"); - curseg = 0; /* text seg, s.b. variable */ - symres("__etext"); - symres("__segoff"); - - /* calculate segment and common sizes (sum over loaded modules) */ - /* use zero init of segsz[] */ - /* also relocate symbols relative to starts of their segments */ - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr && !(symptr->flags & A_MASK)) - { - if (!(symptr->flags & (I_MASK | SA_MASK))) - { - /* relocate by offset of module in segment later */ - /* relocate by offset of segment in memory special */ - /* symbols get relocated improperly */ - symptr->value += segsz[symptr->flags & SEGM_MASK]; - } - else if (symptr->value == 0) - { -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - undefined(symptr->name); - } - else - { -#ifdef REL_OUTPUT -#if 0 - if (!reloc_output) -#else - if (!reloc_output || !(symptr->flags & I_MASK)) -#endif -#endif - { - tempoffset = ld_roundup(symptr->value, 4, bin_off_t); - /* temp kludge quad alignment for 386 */ - symptr->value = comsz[seg = symptr->flags & SEGM_MASK]; - comsz[seg] += tempoffset; - } - if (!(symptr->flags & SA_MASK)) - symptr->flags |= C_MASK; - } - } - for (seg = 0, cptr = modptr->segsize; seg < NSEG; ++seg) - { - segsz[seg] += cntooffset(cptr, - sizecount = segsizecount((unsigned) seg, modptr)); -#ifndef EDOS - - /* adjust sizes to even to get quad boundaries */ - /* this should be specifiable dynamically */ - segsz[seg] = ld_roundup(segsz[seg], 4, bin_off_t); - comsz[seg] = ld_roundup(comsz[seg], 4, bin_off_t); -#endif - cptr += sizecount; - } - } - - /* calculate seg positions now their sizes are known */ - /* temp use fixed order 0D 0C 1D 1C 2D 2C ... */ - /* -#ifdef DATASEGS - * Assume seg 0 is text and rest are data -#else - * Assume seg 1..3 are data, Seg 0 is real text, seg 4+ are far text -#endif - */ -#ifdef EDOS - if (btextoffset == 0) - btextoffset = binheaderlength(commandname); -#endif - segpos[0] = segbase[0] = spos = btextoffset; - combase[0] = segbase[0] + segsz[0]; - segadj[1] = segadj[0] = -btextoffset; - etextpadoff = etextoffset = combase[0] + comsz[0]; - if (sepid) - { - etextpadoff = ld_roundup(etextoffset, 0x10, bin_off_t); - segadj[1] += etextpadoff - bdataoffset; - } -#ifdef QMAGIC - else if (uzp && bdataoffset == 0) - { - bdataoffset = ld_roundup(etextoffset, page_size(), bin_off_t); - etextpadoff = ld_roundup(etextoffset, page_size(), bin_off_t); - segadj[1] += etextpadoff - bdataoffset; - } -#endif - else if (bdataoffset == 0) - bdataoffset = etextpadoff; - segpos[1] = segbase[1] = edataoffset = bdataoffset; - combase[1] = segbase[1] + segsz[1]; -#ifndef DATASEGS - for (seg = 4; seg < NSEG; ++seg) - { - segpos[seg] = segbase[seg] = 0; - combase[seg] = segbase[seg] + segsz[seg]; - segadj[seg] = etextpadoff; - - etextpadoff += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t); - segadj[1] += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t); - } - for (seg = 2; seg < 4; ++seg) -#else - for (seg = 2; seg < NSEG; ++seg) -#endif - { - segpos[seg] = segbase[seg] = combase[seg - 1] + comsz[seg - 1]; -#ifdef MC6809 - if (seg == DPSEG) - { - /* temporarily have fixed DP seg */ - /* adjust if nec so it only spans 1 page */ - tempoffset = segsz[seg] + comsz[seg]; - if (tempoffset > 0x100) - fatalerror("direct page segment too large"); - if ((((segbase[seg] + tempoffset) ^ segbase[seg]) - & ~(bin_off_t) 0xFF) != 0) - segpos[seg] = segbase[seg] = (segbase[seg] + 0xFF) - & ~(bin_off_t) 0xFF; - } -#endif - -#ifdef QMAGIC - if(seg==3 && uzp && !stripflag) /* XXX Stripped last seek needed */ - { - bin_off_t val; - val = ld_roundup(segbase[seg]+segsz[seg], page_size(), bin_off_t); - segsz[seg] = val - segbase[seg]; - } -#endif - combase[seg] = segbase[seg] + segsz[seg]; - segadj[seg] = segadj[seg - 1]; - } - - /* relocate symbols by offsets of segments in memory */ - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr && !(symptr->flags & A_MASK)) - { - if (symptr->flags & (C_MASK | SA_MASK)) - { -#ifdef REL_OUTPUT -#if 0 - if (!reloc_output) -#else - if (!reloc_output || !(symptr->flags & I_MASK)) -#endif -#endif - symptr->value += combase[symptr->flags & SEGM_MASK]; - } - else -#ifdef REL_OUTPUT - if (!reloc_output || !(symptr->flags & I_MASK)) -#endif - symptr->value += segbase[symptr->flags & SEGM_MASK]; - } - } - - /* adjust special symbols */ - for (seg = 0; seg < NSEG; ++seg) - { -#ifdef DATASEGS - if (segsz[seg] != 0) - /* only count data of nonzero length */ -#else - if (segsz[seg] != 0 && seg < 4) -#endif - edataoffset = segbase[seg] + segsz[seg]; - segboundary[5] = hexdigit[seg]; /* to __segX?H */ - segboundary[6] = 'D'; - setsym(segboundary, (tempoffset = segbase[seg]) + segsz[seg]); - /* __segXDH */ - segboundary[7] = 'L'; - setsym(segboundary, tempoffset); /* __segXDL */ - segboundary[6] = 'C'; - setsym(segboundary, tempoffset = combase[seg]); - /* __segXCL */ - segboundary[7] = 'H'; - setsym(segboundary, tempoffset + comsz[seg]); - /* __segXCH */ -#ifndef DATASEGS - if( seg > 3 ) - { - segboundary[6] = 'S'; - segboundary[7] = 'O'; - setsym(segboundary, (bin_off_t)(segadj[seg]-segadj[0])/0x10); - /* __segXSO */ - } -#endif - } - setsym("__etext", etextoffset); - setsym("__edata", edataoffset); -#ifdef DATASEGS - setsym("__end", endoffset = combase[NSEG - 1] + comsz[NSEG - 1]); -#else - setsym("__end", endoffset = combase[3] + comsz[3]); -#endif - setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10); - if( !bits32 ) - { - if( etextoffset > 65536L ) - fatalerror("text segment too large for 16bit"); - if( endoffset > 65536L ) - fatalerror("data segment too large for 16bit"); - } - - openout(outfilename); -#ifdef REL_OUTPUT - if (reloc_output) - seektrel(FILEHEADERLENGTH - + (unsigned long) (etextpadoff - btextoffset) - + (unsigned long) (edataoffset - bdataoffset)); -#endif -#ifdef EDOS - writeheader(commandname); -#else - writeheader(); -#endif - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - linkmod(modptr); - padmod(modptr); - } - - /* dump symbol table */ -#ifdef MINIX - if (!stripflag) - { -#ifdef BSD_A_OUT - unsigned stringoff; -#endif - - seekout(FILEHEADERLENGTH - + (unsigned long) (etextpadoff - btextoffset) - + (unsigned long) (edataoffset - bdataoffset) -#ifdef REL_OUTPUT - + ((unsigned long) ndreloc + ntreloc) * RELOC_INFO_SIZE -#endif - ); - extsym.n_was_numaux = extsym.n_was_type = 0; -#ifdef BSD_A_OUT - stringoff = 4; -#endif - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr) - { -#ifdef BSD_A_OUT - offtocn((char *) &extsym.n_was_strx, - (bin_off_t) stringoff, 4); -#else -#if ELF_SYMS - if( symptr->name[0] == '_' && symptr->name[1] ) - strncpy((char *) extsym.n_was_name, symptr->name+1, - sizeof extsym.n_was_name); - else - { - memcpy((char *) extsym.n_was_name, "__", 2); - strncpy((char *) extsym.n_was_name+2, symptr->name, - sizeof(extsym.n_was_name)-2); - } -#else - strncpy((char *) extsym.n_was_name, symptr->name, - sizeof extsym.n_was_name); -#endif -#endif - u4cn((char *) &extsym.n_value, (u4_t) symptr->value, - sizeof extsym.n_value); - if ((flags = symptr->flags) & A_MASK) - extsym.n_was_sclass = N_ABS; - else if (flags & (E_MASK | I_MASK)) - extsym.n_was_sclass = C_EXT; - else - extsym.n_was_sclass = C_STAT; - if (!(flags & I_MASK) || ( -#ifdef REL_OUTPUT - !reloc_output && -#endif - (flags & C_MASK))) - switch (flags & (A_MASK | SEGM_MASK)) - { -#ifdef DATASEGS - case 0: -#else - default: -#endif - extsym.n_was_sclass |= N_TEXT; - case A_MASK: - break; -#ifdef DATASEGS - default: -#else - case 1: case 2: case 3: - case A_MASK|1: case A_MASK|2: case A_MASK|3: -#endif - if (flags & (C_MASK | SA_MASK)) - extsym.n_was_sclass |= N_BSS; - else - extsym.n_was_sclass |= N_DATA; - break; - } - writeout((char *) &extsym, sizeof extsym); - ++nsym; -#ifdef BSD_A_OUT -#if ELF_SYMS - stringoff += strlen(symptr->name); - if( symptr->name[0] != '_' || symptr->name[1] == '\0' ) - stringoff += 3; -#else - stringoff += strlen(symptr->name) + 1; -#endif -#endif - } - } -#ifdef BSD_A_OUT - offtocn((char *) &extsym.n_was_strx, (bin_off_t) stringoff, 4); - writeout((char *) &extsym.n_was_strx, 4); - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr) -#if ELF_SYMS - { - if( symptr->name[0] == '_' && symptr->name[1] ) - writeout(symptr->name + 1, strlen(symptr->name)); - else - { - writeout("__", 2); - writeout(symptr->name, strlen(symptr->name) + 1); - } - } -#else - writeout(symptr->name, strlen(symptr->name) + 1); -#endif - } -#endif - seekout((unsigned long) offsetof(struct exec, a_syms)); - u4cn(buf4, (u4_t) nsym * sizeof extsym, - memsizeof(struct exec, a_syms)); - writeout(buf4, memsizeof(struct exec, a_syms)); -#ifdef REL_OUTPUT - if( FILEHEADERLENGTH >= offsetof(struct exec, a_trsize)+8) - { - seekout((unsigned long) offsetof(struct exec, a_trsize)); - u4cn(buf4, (u4_t) ntreloc * RELOC_INFO_SIZE, - memsizeof(struct exec, a_trsize)); - writeout(buf4, memsizeof(struct exec, a_trsize)); - seekout((unsigned long) offsetof(struct exec, a_drsize)); - u4cn(buf4, (u4_t) ndreloc * RELOC_INFO_SIZE, - memsizeof(struct exec, a_drsize)); - writeout(buf4, memsizeof(struct exec, a_drsize)); - } -#endif - } -#endif /* MINIX */ - closeout(); -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - executable(); -} - -#ifdef EDOS - -static unsigned binheaderlength(char *commandname) -{ - unsigned count; - char *name; - struct entrylist *elptr; - struct symstruct *startptr; - - count = 2 + 2 + 1; /* len len nul */ - startptr = findsym("start"); - for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext) - { - name = idconvert(elptr, commandname); - count += strlen(name) + 1 + 2 + 1; /* nul off flg */ - ourfree(name); - if (startptr != NUL_PTR) - count += 6; /* LBSR $xxxx and LBRA $xxxx */ - } - return count; -} - -/* convert name of symbol (entry) list element to a Basic identifier */ -/* new name is built in storage obtained from stralloc() */ -/* the special name _main is converted to the command name first */ -/* copy upper case and numerals, convert lower case to upper, ignore rest */ - -static char *idconvert(struct entrylist *elptr, char *commandname) -{ - char *name; - char *newname; - - if (strcmp(name = elptr->elsymptr->name, "_main") == 0) - name = commandname; - newname = stralloc(name); - { - register char *t; - register char *s; - - t = newname; - s = name; - do - { - if (*s >= '0' && *s <= '9' || *s >= 'A' && *s <= 'Z') - *t++ = *s; - if (*s >= 'a' && *s <= 'z') - *t++ = *s + ('A' - 'a'); - } - while (*s++); - *t = 0; - } - if (*newname < 'A') /* numeral or null */ - fatalerror("bad entry name"); - return newname; -} - -#endif /* EDOS */ - -static void linkmod(struct modstruct *modptr) -{ - char buf[ABS_TEXT_MAX]; - int command; - unsigned char modify; - bin_off_t offset; - int symbolnum; - struct symstruct **symparray; - struct symstruct *symptr; - - setseg(0); - relocsize = 2; - symparray = modptr->symparray; - openin(modptr->filename); /* does nothing if already open */ - seekin(modptr->textoffset); - while (TRUE) - { - if ((command = readchar()) < 0) - prematureeof(); - modify = command & MODIFY_MASK; - switch (command & CM_MASK) - { - case CM_SPECIAL: - switch (modify) - { - case CM_EOT: - segpos[curseg] = spos; - return; - case CM_BYTE_SIZE: - relocsize = 1; - break; - case CM_WORD_SIZE: - relocsize = 2; - break; - case CM_LONG_SIZE: -#ifdef LONG_OFFSETS - relocsize = 4; - break; -#else - fatalerror("relocation by long offsets not implemented"); -#endif - case CM_1_SKIP: - skip(1); - break; - case CM_2_SKIP: - skip(2); - break; - case CM_4_SKIP: - skip(4); - break; - default: - if ((modify -= CM_0_SEG) >= NSEG) - inputerror("bad data in"); - setseg(modify); - break; - } - break; - case CM_ABSOLUTE: - if (modify == 0) - modify = ABS_TEXT_MAX; - readin(buf, (unsigned) modify); - writeout(buf, (unsigned) modify); - spos += (int) modify; - break; - case CM_OFFSET_RELOC: - offset = readsize(relocsize); - if (modify & R_MASK) - { -#ifndef DATASEGS - int m = (modify & SEGM_MASK); - if( curseg != m && m != SEGM_MASK ) - interseg(modptr->filename, modptr->archentry, (char*)0); -#endif - offset -= (spos + relocsize); - } - offtocn(buf, segbase[modify & SEGM_MASK] + offset, relocsize); - writeout(buf, relocsize); -#ifdef REL_OUTPUT - if (reloc_output) - { - u4_t bitfield; - - if (curseg == 0) - { - ++ntreloc; - offtocn(buf, spos, 4); - writetrel(buf, 4); - } - else - { - ++ndreloc; - offtocn(buf, spos - segbase[1], 4); - writedrel(buf, 4); - } - if ((modify & SEGM_MASK) == 0) - bitfield = N_TEXT; - else - bitfield = N_DATA; - if (modify & R_MASK) - bitfield |= 1L << 24; - if (relocsize == 2) - bitfield |= 1L << 25; - else if (relocsize == 4) - bitfield |= 1L << 26; - u4cn(buf, bitfield, 4); - if (curseg == 0) - writetrel(buf, 4); - else - writedrel(buf, 4); - } -#endif /* REL_OUTPUT */ - spos += relocsize; - break; - case CM_SYMBOL_RELOC: - symptr = symparray[symbolnum = readconvsize((unsigned) - (modify & S_MASK ? 2 : 1))]; - offset = readconvsize((unsigned) modify & OF_MASK); - if (modify & R_MASK) - { -#ifndef DATASEGS - int m = (symptr->flags & SEGM_MASK); - if( curseg != m && m != SEGM_MASK ) - interseg(modptr->filename, modptr->archentry, symptr->name); -#endif - offset -= (spos + relocsize); - } -#ifdef REL_OUTPUT - if (!reloc_output || !(symptr->flags & I_MASK)) -#endif - offset += symptr->value; - offtocn(buf, offset, relocsize); - writeout(buf, relocsize); -#ifdef REL_OUTPUT - if (reloc_output) - { - u4_t bitfield; - - if (curseg == 0) - { - ++ntreloc; - offtocn(buf, spos, 4); - writetrel(buf, 4); - } - else - { - ++ndreloc; - offtocn(buf, spos - segbase[1], 4); - writedrel(buf, 4); - } - if (symptr->flags & I_MASK) - bitfield = (1L << 27) | symbolnum; - else if ((symptr->flags & SEGM_MASK) == 0) - bitfield = N_TEXT; - else if (symptr->flags & (C_MASK | SA_MASK)) - bitfield = N_BSS; - else - bitfield = N_DATA; - if (modify & R_MASK) - bitfield |= 1L << 24; - if (relocsize == 2) - bitfield |= 1L << 25; - else if (relocsize == 4) - bitfield |= 1L << 26; - u4cn(buf, bitfield, 4); - if (curseg == 0) - writetrel(buf, 4); - else - writedrel(buf, 4); - } -#endif /* REL_OUTPUT */ - spos += relocsize; - } - } -} - -static void padmod(struct modstruct *modptr) -{ - bin_off_t count; - fastin_t seg; - bin_off_t size; - unsigned sizecount; - char *sizeptr; - - for (seg = 0, sizeptr = modptr->segsize; seg < NSEG; ++seg) - { - size = cntooffset(sizeptr, - sizecount = segsizecount((unsigned) seg, modptr)); - sizeptr += sizecount; - if ((count = segpos[seg] - segbase[seg]) != size) - size_error(seg, count, size); - - /* pad to quad boundary */ - /* not padding in-between common areas which sometimes get into file */ - if ((size = ld_roundup(segpos[seg], 4, bin_off_t) - segpos[seg]) != 0) - { - setseg(seg); - writenulls(size); - segpos[seg] = spos; - } - segbase[seg] = segpos[seg]; - } -} - -static void setsym(char *name, bin_off_t value) -{ - struct symstruct *symptr; - -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - if ((symptr = findsym(name)) != NUL_PTR) - symptr->value = value; -} - -static void symres(char *name) -{ - register struct symstruct *symptr; - - if ((symptr = findsym(name)) != NUL_PTR) - { - if ((symptr->flags & SEGM_MASK) == SEGM_MASK) - symptr->flags &= ~SEGM_MASK | curseg; - if (symptr->flags != (I_MASK | curseg) || symptr->value != 0) - reserved(name); -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - symptr->flags = E_MASK | curseg; /* show defined, not common */ - } -} - -/* set new segment */ - -static void setseg(fastin_pt newseg) -{ - if (newseg != curseg) - { - segpos[curseg] = spos; - spos = segpos[curseg = newseg]; - seekout(FILEHEADERLENGTH + (unsigned long) spos - + (unsigned long) segadj[curseg]); - } -} - -static void skip(unsigned countsize) -{ - writenulls((bin_off_t) readsize(countsize)); -} - -#ifdef EDOS - -static void writeheader(char *commandname) -{ - char buf[MAX_OFFSET_SIZE]; - bin_off_t offset; - unsigned headlength; - char *name; - struct entrylist *elptr; - struct symstruct *startptr; - - headlength = binheaderlength(commandname); - for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext) - headlength -= 6; - offset = headlength; - startptr = findsym("start"); - offtocn(buf, edataoffset, 2); - writeout(buf, 2); - writechar(0xFF); /* dummy data length 0xFFFF takes everything */ - writechar(0xFF); - for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext) - { - name = idconvert(elptr, commandname); - writeout(name, (unsigned) strlen(name) + 1); - ourfree(name); - offtocn(buf, startptr == NUL_PTR ? elptr->elsymptr->value : offset, 2); - writeout(buf, 2); - writechar(0x82); /* 8 = set flags from here, 2 = cmd line */ - offset += 6; /* LBSR $xxxx and LBRA $xxxx */ - } - writechar(0); - if (startptr != NUL_PTR) - { - offset = headlength + 3; /* over 1st LBSR */ - for (elptr = entryfirst; elptr != NUL_PTR; elptr = elptr->elnext) - { - writechar(0x17); /* LBSR */ - offtocn(buf, startptr->value - offset, 2); - writeout(buf, 2); - writechar(0x16); /* LBRA */ - offtocn(buf, elptr->elsymptr->value - offset - 3, 2); - writeout(buf, 2); - offset += 6; - } - } -} - -#endif /* EDOS */ - -#ifdef MINIX - -static void writeheader(void) -{ - struct exec header; - - memset(&header, 0, sizeof header); -#ifdef STANDARD_GNU_A_OUT -#ifdef N_SET_MAGIC -#ifdef QMAGIC - if(uzp) - N_SET_MAGIC(header, QMAGIC); - else -#endif - N_SET_MAGIC(header, OMAGIC); -#else - *(unsigned short *) &header.a_magic = OMAGIC; /* XXX - works for 386BSD */ -#endif -#else - header.a_magic[0] = A_MAGIC0; - header.a_magic[1] = A_MAGIC1; -#endif -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - { -#ifdef STANDARD_GNU_A_OUT -#ifdef N_SET_FLAGS - N_SET_FLAGS(header, 0); -#else - /* XXX - works for 386BSD */ -#endif -#else - header.a_flags = sepid ? A_SEP : A_EXEC; - if (uzp) - header.a_flags |= A_UZP; -#endif - } -#ifdef BSD_A_OUT -#ifdef STANDARD_GNU_A_OUT -#ifdef N_SET_FLAGS - N_SET_MACHTYPE(header, M_386); -#else - /* XXX - works for 386BSD which doesn't define its own machtype :-( */ -#endif -#else - header.a_cpu = (bits32 || reloc_output) ? A_I80386 : A_I8086; -#endif -#else - header.a_cpu = bits32 ? A_I80386 : A_I8086; -#endif -#ifndef STANDARD_GNU_A_OUT - header.a_hdrlen = FILEHEADERLENGTH; -#endif -#ifdef QMAGIC - if (uzp) - offtocn((char *) &header.a_text, etextpadoff - btextoffset+HEADERLEN, - sizeof header.a_text); - else -#endif - offtocn((char *) &header.a_text, etextpadoff - btextoffset, - sizeof header.a_text); - offtocn((char *) &header.a_data, edataoffset - bdataoffset, - sizeof header.a_data); - offtocn((char *) &header.a_bss, endoffset - edataoffset, - sizeof header.a_bss); - -#ifdef REL_OUTPUT - if (!reloc_output) -#endif - { - offtocn((char *) &header.a_entry, btextoffset, - sizeof header.a_entry); -#ifndef STANDARD_GNU_A_OUT - offtocn((char *) &header.a_total, (bin_off_t) - (endoffset < 0x00010000L ? 0x00010000L : endoffset + 0x0008000L), - sizeof header.a_total); -#endif - } - if( FILEHEADERLENGTH ) - writeout((char *) &header, FILEHEADERLENGTH); -} - -#endif /* MINIX */ - -static void writenulls(bin_off_t count) -{ - long lcount = count; - if( lcount < 0 ) - fatalerror("org command requires reverse seek"); - spos += count; - while (count-- > 0) - writechar(0); -} -#else - -#ifndef FUNCNAME -#define FUNCNAME writebin -#endif - -void FUNCNAME(char *outfilename, bool_pt argsepid, bool_pt argbits32, - bool_pt argstripflag, bool_pt arguzp) -{ - char * s = "WARNING: Native a.out generation not included, sorry\n"; - write(2, s, strlen(s)); -/* write_elks(outfilename, argsepid, argbits32, argstripflag, arguzp, 0); */ -} -#endif diff --git a/Applications/ld09/writeemu.c b/Applications/ld09/writeemu.c deleted file mode 100644 index b0438fc5..00000000 --- a/Applications/ld09/writeemu.c +++ /dev/null @@ -1,20 +0,0 @@ -/* - * This uses a special version of writebin for bug compatibility with - * the old bin86 package. - * - * This _should_ be replaced by a function that writes out a as86 object - * but then it would completely **** up dosemu compiles. - * - * NOTE: A some time I intend to replace this with a routine that generates - * an as86 object file. - */ - -#undef A_OUT_INCL -#define A_OUT_INCL "rel_aout.h" -#define BSD_A_OUT 1 -#define FILEHEADERLENGTH 32 -#define ELF_SYMS 0 - -#define FUNCNAME write_dosemu - -#include "writebin.c" diff --git a/Applications/ld09/writex86.c b/Applications/ld09/writex86.c deleted file mode 100644 index 5ddb8731..00000000 --- a/Applications/ld09/writex86.c +++ /dev/null @@ -1,738 +0,0 @@ -/* writex86.c - write binary file for linker */ - -/* Copyright (C) 1994 Bruce Evans */ - -#include "syshead.h" -#include "x86_aout.h" -#ifndef VERY_SMALL_MEMORY -#include "v7_aout.h" -#endif -#ifndef MSDOS -#include "x86_cpm86.h" -#endif -#include "const.h" -#include "obj.h" -#include "type.h" -#include "globvar.h" - -#define btextoffset (text_base_value) -#define bdataoffset (data_base_value) -#define page_size() ((bin_off_t)4096) - -#ifndef ELF_SYMS -#define ELF_SYMS 0 -#endif - -#ifdef MSDOS -# define FILEHEADERLENGTH (headerless?0:A_MINHDR) -#else -# ifdef VERY_SMALL_MEMORY -# define FILEHEADERLENGTH (headerless?0:(cpm86?CPM86_HEADERLEN:A_MINHDR)) -# else -# define FILEHEADERLENGTH (headerless?0:(cpm86?CPM86_HEADERLEN:(v7?V7_HEADERLEN:A_MINHDR))) -# endif -#endif - /* part of header not counted in offsets */ -#define DPSEG 2 - -#define CM_MASK 0xC0 -#define MODIFY_MASK 0x3F -#define S_MASK 0x04 -#define OF_MASK 0x03 - -#define CM_SPECIAL 0 -#define CM_ABSOLUTE 0x40 -#define CM_OFFSET_RELOC 0x80 -#define CM_SYMBOL_RELOC 0xC0 - -#define CM_EOT 0 -#define CM_BYTE_SIZE 1 -#define CM_WORD_SIZE 2 -#define CM_LONG_SIZE 3 -#define CM_1_SKIP 17 -#define CM_2_SKIP 18 -#define CM_4_SKIP 19 -#define CM_0_SEG 32 - -#define ABS_TEXT_MAX 64 - -#define offsetof(struc, mem) ((int) &((struc *) 0)->mem) -#define memsizeof(struc, mem) sizeof(((struc *) 0)->mem) - -static bool_t bits32; /* nonzero for 32-bit executable */ -static bin_off_t combase[NSEG];/* bases of common parts of segments */ -static bin_off_t comsz[NSEG]; /* sizes of common parts of segments */ -static fastin_t curseg; /* current segment, 0 to $F */ -static bin_off_t edataoffset; /* end of data */ -static bin_off_t endoffset; /* end of bss */ -static bin_off_t etextoffset; /* end of text */ -static bin_off_t etextpadoff; /* end of padded text */ -static unsigned nsym; /* number of symbols written */ -static unsigned relocsize; /* current relocation size 1, 2 or 4 */ -static bin_off_t segadj[NSEG]; /* adjusts (file offset - seg offset) */ - /* depends on zero init */ -static bin_off_t segbase[NSEG];/* bases of data parts of segments */ -static char segboundary[9] = "__seg0DH"; - /* name of seg boundary __seg0DL to __segfCH */ -static bin_off_t segpos[NSEG]; /* segment positions for current module */ -static bin_off_t segsz[NSEG]; /* sizes of data parts of segments */ - /* depends on zero init */ -static bool_t sepid; /* nonzero for separate I & D */ -static bool_t stripflag; /* nonzero to strip symbols */ -static bin_off_t spos; /* position in current seg */ -static bool_t uzp; /* nonzero for unmapped zero page */ -static bool_t xsym; /* extended symbol table */ - -static void linkmod(struct modstruct *modptr); -static void padmod(struct modstruct *modptr); -static void setsym(char *name, bin_off_t value); -static void symres(char *name); -static void setseg(fastin_pt newseg); -static void skip(unsigned countsize); -static void writeheader(void); -#ifndef VERY_SMALL_MEMORY -static void v7header(void); -#endif -#ifndef MSDOS -static void cpm86header(void); -#endif -static void writenulls(bin_off_t count); - -EXTERN bool_t reloc_output; - -/* write binary file */ - -void write_elks(char *outfilename, bool_pt argsepid, bool_pt argbits32, - bool_pt argstripflag, bool_pt arguzp, bool_pt argxsym) -{ - char buf4[4]; - char *cptr; - struct nlist extsym; - flags_t flags; - struct modstruct *modptr; - fastin_t seg; - unsigned sizecount; - bin_off_t tempoffset; - - if( reloc_output ) -#ifndef MSDOS - fatalerror("Output binformat not configured relocatable, use -N"); -#else - fatalerror("Cannot use -r under MSDOS, sorry"); -#endif - - sepid = argsepid; - bits32 = argbits32; - stripflag = argstripflag; - uzp = arguzp; - xsym = argxsym; - if (uzp) - { - if (btextoffset == 0) - btextoffset = page_size(); - if (bdataoffset == 0 && sepid) - bdataoffset = page_size(); - } - - /* reserve special symbols use curseg to pass parameter to symres() */ - for (curseg = 0; curseg < NSEG; ++curseg) - { - segboundary[5] = hexdigit[curseg]; /* to __segX?H */ - segboundary[6] = 'D'; - symres(segboundary); /* __segXDH */ - segboundary[7] = 'L'; - symres(segboundary); /* __segXDL */ - segboundary[6] = 'C'; - symres(segboundary); /* __segXCL */ - segboundary[7] = 'H'; - symres(segboundary); /* __segXCH */ -#ifndef DATASEGS - if( curseg > 3 ) - { - segboundary[6] = 'S'; - segboundary[7] = 'O'; - symres(segboundary); /* __segXSO */ - } -#endif - } - curseg = 3; - symres("__edata"); - symres("__end"); - symres("__heap_top"); - curseg = 0; /* text seg, s.b. variable */ - symres("__etext"); - symres("__segoff"); - - /* calculate segment and common sizes (sum over loaded modules) */ - /* use zero init of segsz[] */ - /* also relocate symbols relative to starts of their segments */ - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr && !(symptr->flags & A_MASK)) - { - if (!(symptr->flags & (I_MASK | SA_MASK))) - { - /* relocate by offset of module in segment later */ - /* relocate by offset of segment in memory special */ - /* symbols get relocated improperly */ - symptr->value += segsz[symptr->flags & SEGM_MASK]; - } - else if (symptr->value == 0) - { - undefined(symptr->name); - } - else - { - tempoffset = ld_roundup(symptr->value, 4, bin_off_t); - /* temp kludge quad alignment for 386 */ - symptr->value = comsz[seg = symptr->flags & SEGM_MASK]; - comsz[seg] += tempoffset; - if (!(symptr->flags & SA_MASK)) - symptr->flags |= C_MASK; - } - } - for (seg = 0, cptr = modptr->segsize; seg < NSEG; ++seg) - { - segsz[seg] += cntooffset(cptr, - sizecount = segsizecount((unsigned) seg, modptr)); - - /* adjust sizes to even to get quad boundaries */ - /* this should be specifiable dynamically */ - segsz[seg] = ld_roundup(segsz[seg], 4, bin_off_t); - comsz[seg] = ld_roundup(comsz[seg], 4, bin_off_t); - cptr += sizecount; - } - } - - /* calculate seg positions now their sizes are known */ - /* -#ifdef DATASEGS - * Assume seg 0 is text and rest are data -#else - * Assume seg 1..3 are data, Seg 0 is real text, seg 4+ are far text -#endif - */ - segpos[0] = segbase[0] = spos = btextoffset; - combase[0] = segbase[0] + segsz[0]; - segadj[1] = segadj[0] = -btextoffset; - etextpadoff = etextoffset = combase[0] + comsz[0]; - if (sepid) - { - etextpadoff = ld_roundup(etextoffset, 0x10, bin_off_t); - segadj[1] += etextpadoff - bdataoffset; - } - else if (bdataoffset == 0) - bdataoffset = etextpadoff; - segpos[1] = segbase[1] = edataoffset = bdataoffset; - combase[1] = segbase[1] + segsz[1]; -#ifndef DATASEGS - for (seg = 4; seg < NSEG; ++seg) - { - segpos[seg] = segbase[seg] = 0; - combase[seg] = segbase[seg] + segsz[seg]; - segadj[seg] = etextpadoff; - - etextpadoff += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t); - segadj[1] += ld_roundup(segsz[seg] + comsz[seg], 0x10, bin_off_t); - } - for (seg = 2; seg < 4; ++seg) -#else - for (seg = 2; seg < NSEG; ++seg) -#endif - { - segpos[seg] = segbase[seg] = combase[seg - 1] + comsz[seg - 1]; -#ifdef MC6809 - if (seg == DPSEG) - { - /* temporarily have fixed DP seg */ - /* adjust if nec so it only spans 1 page */ - tempoffset = segsz[seg] + comsz[seg]; - if (tempoffset > 0x100) - fatalerror("direct page segment too large"); - if ((((segbase[seg] + tempoffset) ^ segbase[seg]) - & ~(bin_off_t) 0xFF) != 0) - segpos[seg] = segbase[seg] = (segbase[seg] + 0xFF) - & ~(bin_off_t) 0xFF; - } -#endif - combase[seg] = segbase[seg] + segsz[seg]; - segadj[seg] = segadj[seg - 1]; - } - - /* relocate symbols by offsets of segments in memory */ - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr && !(symptr->flags & A_MASK)) - { - if (symptr->flags & (C_MASK | SA_MASK)) - symptr->value += combase[symptr->flags & SEGM_MASK]; - else - symptr->value += segbase[symptr->flags & SEGM_MASK]; - } - } - - /* adjust special symbols */ - for (seg = 0; seg < NSEG; ++seg) - { -#ifdef DATASEGS - if (segsz[seg] != 0) - /* only count data of nonzero length */ -#else - if (segsz[seg] != 0 && seg < 4) -#endif - edataoffset = segbase[seg] + segsz[seg]; - segboundary[5] = hexdigit[seg]; /* to __segX?H */ - segboundary[6] = 'D'; - setsym(segboundary, (tempoffset = segbase[seg]) + segsz[seg]); - /* __segXDH */ - segboundary[7] = 'L'; - setsym(segboundary, tempoffset); /* __segXDL */ - segboundary[6] = 'C'; - setsym(segboundary, tempoffset = combase[seg]); - /* __segXCL */ - segboundary[7] = 'H'; - setsym(segboundary, tempoffset + comsz[seg]); - /* __segXCH */ -#ifndef DATASEGS - if( seg > 3 ) - { - segboundary[6] = 'S'; - segboundary[7] = 'O'; - setsym(segboundary, (bin_off_t)(segadj[seg]-segadj[0])/0x10); - /* __segXSO */ - } -#endif - } - setsym("__etext", etextoffset); - setsym("__edata", edataoffset); -#ifdef DATASEGS - setsym("__end", endoffset = combase[NSEG - 1] + comsz[NSEG - 1]); -#else - setsym("__end", endoffset = combase[3] + comsz[3]); -#endif - setsym("__segoff", (bin_off_t)(segadj[1]-segadj[0])/0x10); - if( !bits32 ) - { - if( etextoffset > 65536L ) - fatalerror("text segment too large for 16bit"); - if( endoffset > 65536L ) - fatalerror("data segment too large for 16bit"); - } - - if( heap_top_value < 0x100 || endoffset > heap_top_value-0x100) - heap_top_value = endoffset + 0x8000; - if( heap_top_value > 0x10000 && !bits32 ) heap_top_value = 0x10000; - setsym("__heap_top", (bin_off_t)heap_top_value); - - openout(outfilename); -#ifndef MSDOS - if (cpm86) cpm86header(); - else -#endif -#ifndef VERY_SMALL_MEMORY - if (v7) - v7header(); - else -#endif - writeheader(); - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - linkmod(modptr); - padmod(modptr); - } - - /* dump symbol table */ - if (!stripflag) - { - seekout(FILEHEADERLENGTH - + (unsigned long) (etextpadoff - btextoffset) - + (unsigned long) (edataoffset - bdataoffset) - ); - extsym.n_numaux = extsym.n_type = 0; - for (modptr = modfirst; modptr != NUL_PTR; modptr = modptr->modnext) - if (modptr->loadflag) - { - register struct symstruct **symparray; - register struct symstruct *symptr; - - for (symparray = modptr->symparray; - (symptr = *symparray) != NUL_PTR; ++symparray) - if (symptr->modptr == modptr) - { -#if ELF_SYMS - if (symptr->name[0] == '_' && symptr->name[1] ) - strncpy((char *) extsym.n_name, symptr->name+1, - sizeof extsym.n_name); - else - { - memcpy((char *) extsym.n_name, "$", 1); - strncpy((char *) extsym.n_name+1, symptr->name, - sizeof(extsym.n_name)-1); - } -#else - strncpy((char *) extsym.n_name, symptr->name, - sizeof extsym.n_name); -#endif - u4cn((char *) &extsym.n_value, (u4_t) symptr->value, - sizeof extsym.n_value); - if ((flags = symptr->flags) & A_MASK) - extsym.n_sclass = N_ABS; - else if (flags & (E_MASK | I_MASK)) - extsym.n_sclass = C_EXT; - else - extsym.n_sclass = C_STAT; - if (!(flags & I_MASK) || - flags & C_MASK) - switch (flags & (A_MASK | SEGM_MASK)) - { -#ifdef DATASEGS - case 0: -#else - default: -#endif - extsym.n_sclass |= N_TEXT; - case A_MASK: - break; -#ifdef DATASEGS - default: -#else - case 1: case 2: case 3: - case A_MASK|1: case A_MASK|2: case A_MASK|3: -#endif - if (flags & (C_MASK | SA_MASK)) - extsym.n_sclass |= N_BSS; - else - extsym.n_sclass |= N_DATA; - break; - } - writeout((char *) &extsym, sizeof extsym); - ++nsym; -#if !ELF_SYMS - if( xsym ) - { - int i; - extsym.n_sclass = 0; - memset((void*)&extsym.n_value,0, - sizeof(extsym.n_value)); - - for(i=sizeof extsym.n_name; iname); - i+=sizeof extsym.n_name) - { - strncpy((char *) extsym.n_name, symptr->name+i, - sizeof extsym.n_name); - writeout((char *) &extsym, sizeof extsym); - ++nsym; - } - } -#endif - } - } - seekout((unsigned long) offsetof(struct exec, a_syms)); - u4cn(buf4, (u4_t) nsym * sizeof extsym, - memsizeof(struct exec, a_syms)); - writeout(buf4, memsizeof(struct exec, a_syms)); - } - closeout(); - executable(); -} - -static void linkmod(modptr) -struct modstruct *modptr; -{ - char buf[ABS_TEXT_MAX]; - int command; - unsigned char modify; - bin_off_t offset; - int symbolnum; - struct symstruct **symparray; - struct symstruct *symptr; - - setseg(0); - relocsize = 2; - symparray = modptr->symparray; - openin(modptr->filename); /* does nothing if already open */ - seekin(modptr->textoffset); - while (TRUE) - { - if ((command = readchar()) < 0) - prematureeof(); - modify = command & MODIFY_MASK; - switch (command & CM_MASK) - { - case CM_SPECIAL: - switch (modify) - { - case CM_EOT: - segpos[curseg] = spos; - return; - case CM_BYTE_SIZE: - relocsize = 1; - break; - case CM_WORD_SIZE: - relocsize = 2; - break; - case CM_LONG_SIZE: -#ifdef LONG_OFFSETS - relocsize = 4; - break; -#else - fatalerror("relocation by long offsets not implemented"); -#endif - case CM_1_SKIP: - skip(1); - break; - case CM_2_SKIP: - skip(2); - break; - case CM_4_SKIP: - skip(4); - break; - default: - if ((modify -= CM_0_SEG) >= NSEG) - inputerror("bad data in"); - setseg(modify); - break; - } - break; - case CM_ABSOLUTE: - if (modify == 0) - modify = ABS_TEXT_MAX; - readin(buf, (unsigned) modify); - writeout(buf, (unsigned) modify); - spos += (int) modify; - break; - case CM_OFFSET_RELOC: - offset = readsize(relocsize); - if (modify & R_MASK) - { -#ifndef DATASEGS - int m = (modify & SEGM_MASK); - if( curseg != m && m != SEGM_MASK ) - interseg(modptr->filename, modptr->archentry, (char*)0); -#endif - offset -= (spos + relocsize); - } - offtocn(buf, segbase[modify & SEGM_MASK] + offset, relocsize); - writeout(buf, relocsize); - spos += relocsize; - break; - case CM_SYMBOL_RELOC: - symptr = symparray[symbolnum = readconvsize((unsigned) - (modify & S_MASK ? 2 : 1))]; - offset = readconvsize((unsigned) modify & OF_MASK); - if (modify & R_MASK) - { -#ifndef DATASEGS - int m = (symptr->flags & SEGM_MASK); - if( curseg != m && m != SEGM_MASK ) - interseg(modptr->filename, modptr->archentry, symptr->name); -#endif - offset -= (spos + relocsize); - } - offset += symptr->value; - offtocn(buf, offset, relocsize); - writeout(buf, relocsize); - spos += relocsize; - } - } -} - -static void padmod(modptr) -struct modstruct *modptr; -{ - bin_off_t count; - fastin_t seg; - bin_off_t size; - unsigned sizecount; - char *sizeptr; - - for (seg = 0, sizeptr = modptr->segsize; seg < NSEG; ++seg) - { - size = cntooffset(sizeptr, - sizecount = segsizecount((unsigned) seg, modptr)); - sizeptr += sizecount; - if ((count = segpos[seg] - segbase[seg]) != size) - size_error(seg, count, size); - - /* pad to quad boundary */ - /* not padding in-between common areas which sometimes get into file */ - if ((size = ld_roundup(segpos[seg], 4, bin_off_t) - segpos[seg]) != 0) - { - setseg(seg); - writenulls(size); - segpos[seg] = spos; - } - segbase[seg] = segpos[seg]; - } -} - -static void setsym(name, value) -char *name; -bin_off_t value; -{ - struct symstruct *symptr; - - if ((symptr = findsym(name)) != NUL_PTR) - symptr->value = value; -} - -static void symres(name) -register char *name; -{ - register struct symstruct *symptr; - - if ((symptr = findsym(name)) != NUL_PTR) - { - if ((symptr->flags & SEGM_MASK) == SEGM_MASK) - symptr->flags &= ~SEGM_MASK | curseg; - if (symptr->flags != (I_MASK | curseg) || symptr->value != 0) - reserved(name); - symptr->flags = E_MASK | curseg; /* show defined, not common */ - } -} - -/* set new segment */ - -static void setseg(newseg) -fastin_pt newseg; -{ - if (newseg != curseg) - { - segpos[curseg] = spos; - spos = segpos[curseg = newseg]; - seekout(FILEHEADERLENGTH + (unsigned long) spos - + (unsigned long) segadj[curseg]); - } -} - -static void skip(countsize) -unsigned countsize; -{ - writenulls((bin_off_t) readsize(countsize)); -} - -#ifndef MSDOS -static void cpm86header() -{ - struct cpm86_exec header; - memset(&header, 0, sizeof header); - - if (sepid) - { - header.ce_group[0].cg_type = CG_CODE; - u2c2(header.ce_group[0].cg_len, (15 + etextpadoff) / 16); - u2c2(header.ce_group[0].cg_min, (15 + etextpadoff) / 16); - header.ce_group[1].cg_type = CG_DATA; - u2c2(header.ce_group[1].cg_len, (15 + edataoffset) / 16); - u2c2(header.ce_group[1].cg_min, (15 + endoffset ) / 16); - u2c2(header.ce_group[1].cg_max, 0x1000); - } - else - { - header.ce_group[0].cg_type = CG_CODE; - u2c2(header.ce_group[0].cg_len, (15 + edataoffset) / 16); - u2c2(header.ce_group[0].cg_min, (15 + endoffset ) / 16); - } - if( FILEHEADERLENGTH ) - writeout((char *) &header, FILEHEADERLENGTH); -} -#endif - -static void writeheader() -{ - struct exec header; - - memset(&header, 0, sizeof header); - header.a_magic[0] = A_MAGIC0; - header.a_magic[1] = A_MAGIC1; - header.a_flags = sepid ? A_SEP : A_EXEC; - if (uzp) - header.a_flags |= A_UZP; - header.a_cpu = bits32 ? A_I80386 : A_I8086; - header.a_hdrlen = FILEHEADERLENGTH; - offtocn((char *) &header.a_text, etextpadoff - btextoffset, - sizeof header.a_text); - offtocn((char *) &header.a_data, edataoffset - bdataoffset, - sizeof header.a_data); - offtocn((char *) &header.a_bss, endoffset - edataoffset, - sizeof header.a_bss); - if (uzp) - offtocn((char *) &header.a_entry, page_size(), - sizeof header.a_entry); - - offtocn((char *) &header.a_total, (bin_off_t) heap_top_value, - sizeof header.a_total); - if( FILEHEADERLENGTH ) - writeout((char *) &header, FILEHEADERLENGTH); -} - -#ifndef VERY_SMALL_MEMORY -static void v7header() -{ - struct v7_exec header; - - if( sizeof header != FILEHEADERLENGTH ) - fatalerror("Executable miscompiled, computed wrong header size"); - - memset(&header, 0, sizeof header); - - if( bits32 ) - fatalerror("V7 a.out format is for 16-bit only"); - - offtocn((char *) &header.magic, sepid ? V7_MAGIC3 : V7_OMAGIC, - sizeof header.magic); - - offtocn((char *) &header.textsize, etextpadoff - btextoffset, - sizeof header.textsize); - offtocn((char *) &header.datasize, edataoffset - bdataoffset, - sizeof header.datasize); - offtocn((char *) &header.bsssize, endoffset - edataoffset, - sizeof header.bsssize); - - if( !stripflag ) - fatalerror("Symbol table not implemented for V7 yet"); - - if( uzp ) - fatalerror("No QMAGIC for V7"); - - offtocn((char *) &header.entry, entryfirst->elsymptr->value, - sizeof header.entry); - - if( FILEHEADERLENGTH ) - writeout((char *) &header, FILEHEADERLENGTH); -} -#endif - -static void writenulls(count) -bin_off_t count; -{ - long lcount = count; - spos += count; -#if 0 - /* This will only work if we record the highest spos found an seek there - * at the end of the generation - */ - - seekout(FILEHEADERLENGTH + (unsigned long) spos - + (unsigned long) segadj[curseg]); - return; - -#endif - if( lcount < 0 ) - fatalerror("org command requires reverse seek"); - while (count-- > 0) - writechar(0); -} diff --git a/Applications/ld09/x86_aout.h b/Applications/ld09/x86_aout.h deleted file mode 100644 index 542a70df..00000000 --- a/Applications/ld09/x86_aout.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (C) 1990-1996 - * This file is part of the ld86 command for Linux-86 - * It is distributed under the GNU Library General Public License. - * - * - This may actually be BSD or Minix code, can someone clarify please. -RDB - */ - -#ifndef __AOUT_H -#define __AOUT_H - -/* If the host isn't an x86 all bets are off, use chars. */ -#if defined(i386) || defined(__BCC__) || defined(MSDOS) -typedef long Long; -#define __OUT_OK 1 -#else -/* Beware: this will probably allow some BE hosts to generate broken files. */ -#ifdef INT32_MAX -#include -typedef int32_t Long; -#define __OUT_OK 1 -#else -typedef char Long[4]; -#endif -#endif - -struct exec { /* a.out header */ - unsigned char a_magic[2]; /* magic number */ - unsigned char a_flags; /* flags, see below */ - unsigned char a_cpu; /* cpu id */ - unsigned char a_hdrlen; /* length of header */ - unsigned char a_unused; /* reserved for future use */ - unsigned char a_version[2]; /* version stamp (not used at present) */ - Long a_text; /* size of text segement in bytes */ - Long a_data; /* size of data segment in bytes */ - Long a_bss; /* size of bss segment in bytes */ - Long a_entry; /* entry point */ - Long a_total; /* total memory allocated */ - Long a_syms; /* size of symbol table */ - - /* SHORT FORM ENDS HERE */ - Long a_trsize; /* text relocation size */ - Long a_drsize; /* data relocation size */ - Long a_tbase; /* text relocation base */ - Long a_dbase; /* data relocation base */ -}; - -#define A_MAGIC0 (unsigned char) 0x01 -#define A_MAGIC1 (unsigned char) 0x03 -#define BADMAG(X) ((X).a_magic[0] != A_MAGIC0 ||(X).a_magic[1] != A_MAGIC1) - -/* CPU Id of TARGET machine (byte order coded in low order two bits) */ -#define A_NONE 0x00 /* unknown */ -#define A_I8086 0x04 /* intel i8086/8088 */ -#define A_M68K 0x0B /* motorola m68000 */ -#define A_NS16K 0x0C /* national semiconductor 16032 */ -#define A_I80386 0x10 /* intel i80386 */ -#define A_SPARC 0x17 /* Sun SPARC */ - -#define A_BLR(cputype) ((cputype&0x01)!=0) /* TRUE if bytes left-to-right */ -#define A_WLR(cputype) ((cputype&0x02)!=0) /* TRUE if words left-to-right */ - -/* Flags. */ -#define A_UZP 0x01 /* unmapped zero page (pages) */ -#define A_PAL 0x02 /* page aligned executable */ -#define A_NSYM 0x04 /* new style symbol table */ -#define A_EXEC 0x10 /* executable */ -#define A_SEP 0x20 /* separate I/D */ -#define A_PURE 0x40 /* pure text */ -#define A_TOVLY 0x80 /* text overlay */ - -/* Offsets of various things. */ -#define A_MINHDR 32 -#define A_TEXTPOS(X) ((long)(X).a_hdrlen) -#define A_HASRELS(X) ((X).a_hdrlen > (unsigned char) A_MINHDR) -#define A_HASEXT(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 8)) -#define A_HASLNS(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 16)) -#define A_HASTOFF(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 24)) -#ifdef __OUT_OK -#define A_DATAPOS(X) (A_TEXTPOS(X) + (X).a_text) -#define A_TRELPOS(X) (A_DATAPOS(X) + (X).a_data) -#define A_DRELPOS(X) (A_TRELPOS(X) + (X).a_trsize) -#define A_SYMPOS(X) (A_TRELPOS(X) + (A_HASRELS(X) ? \ - ((X).a_trsize + (X).a_drsize) : 0)) -#endif - -struct reloc { - long r_vaddr; /* virtual address of reference */ - unsigned short r_symndx; /* internal segnum or extern symbol num */ - unsigned short r_type; /* relocation type */ -}; - -/* r_tyep values: */ -#define R_ABBS 0 -#define R_RELLBYTE 2 -#define R_PCRBYTE 3 -#define R_RELWORD 4 -#define R_PCRWORD 5 -#define R_RELLONG 6 -#define R_PCRLONG 7 -#define R_REL3BYTE 8 -#define R_KBRANCHE 9 - -/* r_symndx for internal segments */ -#define S_ABS ((unsigned short)-1) -#define S_TEXT ((unsigned short)-2) -#define S_DATA ((unsigned short)-3) -#define S_BSS ((unsigned short)-4) - -struct nlist { /* symbol table entry */ - char n_name[8]; /* symbol name */ - Long n_value; /* value */ - unsigned char n_sclass; /* storage class */ - unsigned char n_numaux; /* number of auxiliary entries (not used) */ - unsigned short n_type; /* language base and derived type (not used) */ -}; - -/* Low bits of storage class (section). */ -#define N_SECT 07 /* section mask */ -#define N_UNDF 00 /* undefined */ -#define N_ABS 01 /* absolute */ -#define N_TEXT 02 /* text */ -#define N_DATA 03 /* data */ -#define N_BSS 04 /* bss */ -#define N_COMM 05 /* (common) */ - -/* High bits of storage class. */ -#define N_CLASS 0370 /* storage class mask */ -#define C_NULL 0 -#define C_EXT 0020 /* external symbol */ -#define C_STAT 0030 /* static */ - -#endif /* _AOUT_H */ diff --git a/Applications/ld09/x86_cpm86.h b/Applications/ld09/x86_cpm86.h deleted file mode 100644 index 0a858f51..00000000 --- a/Applications/ld09/x86_cpm86.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002 - * This file is part of the ld86 command for Linux-86 - * It is distributed under the GNU Library General Public License. - * - * CP/M-86 CMD file header - */ - -#ifndef __CPM86_H -#define __CPM86_H - -typedef char Short16[2]; - -struct cpm86_group { - unsigned char cg_type; /* 1=Code 2=Data */ - Short16 cg_len; /* Group length, paragraphs */ - Short16 cg_base; /* Group address, normally 0 for relocatable */ - Short16 cg_min; /* Minimum size, normally = group length */ - Short16 cg_max; /* Maximum size, normally 0x1000 (64k) */ -}; - - -struct cpm86_exec { /* CP/M-86 header */ - struct cpm86_group ce_group[8]; - unsigned char ce_spare[51]; - Short16 ce_rsxs; /* Record with RSX list */ - Short16 ce_fixups; /* Record with fixups */ - unsigned char ce_flags; /* Concurrent CP/M flags */ -}; - -/* Group types */ -#define CG_EMPTY 0 -#define CG_CODE 1 -#define CG_DATA 2 -#define CG_EXTRA 3 -#define CG_STACK 4 -#define CG_AUX1 5 -#define CG_AUX2 6 -#define CG_AUX3 7 -#define CG_AUX4 8 -#define CG_PURE 9 /* Code that is known to be pure */ - -#define CPM86_HEADERLEN 0x80 - -#endif /* _CPM86_H */