all: as09
as09: $(OBJS)
- $(CC) -o $@ $(OBJS)
+ $(CC) -o $@ --nostdio $(OBJS)
clean realclean clobber:
rm -f *.rel as09 *~
brk(heapend);
if(sbrk(0) != heapend)
as_abort(NOMEMEORY);
-#else
-#ifdef SOS_EDOS
- heapend = stackreg() - STAKSIZ;
#else
heapptr = malloc(USERMEM);
heapend = heapptr + USERMEM;
as_abort(NOMEMEORY);
#endif
#endif
-#endif
}
void *temp_buf(void)
#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
/* 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"
/* write 1 offset_t, order to suit target */
-void writeoff(offset)
-offset_t offset;
+void writeoff(offset_t offset)
{
char buf[sizeof offset];
/* common routine for PSHS/PULS/PSHU/PULU */
-void sustack(stackreg)
-reg_pt stackreg;
+void sustack(reg_pt stackreg)
{
reg_pt reg;
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;
/* 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))) &&
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;
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";
#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;
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 $@
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 $@
+++ /dev/null
-/*
- * 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 <stdio.h>
-#ifdef __STDC__
-#include <unistd.h>
-#include <stdlib.h>
-#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);
-}
-
/* 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 */
/* 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 */
#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
if(*progname=='/')
refname=progname+1;
+ /* FIXME: we need a malloc with error check here */
#ifdef REL_OUTPUT
drelbuf = malloc(DRELBUFSIZE);
drelbuftop = drelbuf + DRELBUFSIZE;
{
if (errcount)
unlink(outputname);
-#ifndef MSDOS
else
chmod(outputname, outputperms);
-#endif
}
void flusherr(void)
#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;
putbyte(*message++);
}
-static void putstrn(char *message)
+static void putstrn(const char *message)
{
putstr(message);
putbyte('\n');
#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);
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)
{
#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)
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)
}
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'])
for(ar=1; ar<argc; ar++) if( ar != libarg && argv[ar][0] != '-' )
{
char * ptr;
+ /* FIXME: strlcpy etc */
if( stat(argv[ar], &st) < 0 ) fatalerror("Cannot stat object");
if((ptr=strchr(argv[ar], '/'))) ptr++; else ptr=argv[ar];
memset(&arbuf, ' ', sizeof(arbuf));
strcpy(buf, ptr); strcat(buf, "/ ");
strncpy(arbuf.ar_name, buf, sizeof(arbuf.ar_name));
+ /* FIXME: use ltoa ita for Fuzix */
snprintf(arbuf.ar_date, 12, "%-12ld", (long)st.st_mtime);
snprintf(arbuf.ar_uid, 6, "%-6d", (int)(st.st_uid%1000000L));
snprintf(arbuf.ar_gid, 6, "%-6d", (int)(st.st_gid%1000000L));
if( fwrite(&arbuf, 1, sizeof(arbuf), fd) != sizeof(arbuf) )
fatalerror("Cannot write header");
+ /* FIXME: can overflow and off_t may not be size_t*/
ptr = malloc(st.st_size+2);
if( ptr == 0 ) fatalerror("Out of memory");
ptr[st.st_size] = ' ';
fatalerror("Cannot read input file");
fclose(ifd);
+ /* FIXME: may overflow */
if( st.st_size&1 ) st.st_size++;
if( fwrite(ptr, 1, st.st_size, fd) != st.st_size )
fatalerror("Cannot write output file");
+ free(ptr);
}
fclose(fd);
exit(0);
+++ /dev/null
-
-#include <stdio.h>
-#ifdef __STDC__
-#include <unistd.h>
-#include <stdlib.h>
-#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
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;
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);
sections = 1;
return 1;
}
-#ifndef VERY_SMALL_MEMORY
- if( buf[1] == 1 ) /* 04xx octal */
- {
- sections = 1;
- return 2;
- }
-#endif
return error("Bad magic number");
}
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<h_len; i++)
- {
- header[i] = get_word();
- }
-}
-
-void
-size_v7()
-{
- if( display_mode == 0 )
- printf("text\tdata\tbss\tdec\thex\tfilename\n");
-
- printf("%ld\t%ld\t%ld\t%ld\t%lx\t%s\n",
- header[1], header[2], header[3],
- header[1]+ header[2]+ header[3],
- header[1]+ header[2]+ header[3],
- ifname);
-
- tot_size_text += header[1];
- tot_size_data += header[2];
- tot_size_bss += header[3];
-}
-
-void
-dump_v7()
-{
- int i;
- long l;
-
- printf("TYPE:");
- switch (header[0]) {
- case 0405: printf(" overlay"); break;
- case 0407: printf(" impure"); break;
- case 0410: printf(" read-only text"); break;
- case 0411: printf(" pure"); break;
- case 0413: printf(" demand load"); break;
- default: printf(" (unknown)"); break;
- }
- printf("\n");
-
- if( header[5] )
- printf("a_entry = 0x%08lx\n", header[5]);
- printf("\n");
-
- size_aout();
- printf("\n");
-
- printf("TEXTSEG\n");
- fseek(ifd, (long)h_len, 0);
- for(l=0; l<header[1]; l++)
- {
- if( (i=getc(ifd)) == EOF ) break;
- hex_output(i);
- }
- hex_output(EOF);
-
- printf("DATASEG\n");
- fseek(ifd, (long)h_len+header[1], 0);
- for(l=0; l<header[2]; l++)
- {
- if( (i=getc(ifd)) == EOF ) break;
- hex_output(i);
- }
- hex_output(EOF);
-}
-#endif
static unsigned readfileheader(void)
{
- struct
- {
- char magic[2];
- char count[2]; /* really an int */
- }
- fileheader;
- char filechecksum; /* part of fileheader but would unalign */
+ char fileheader[5];
- readin((char *) &fileheader, sizeof fileheader);
- readin(&filechecksum, sizeof filechecksum);
- if (filechecksum != checksum((char *) &fileheader, sizeof fileheader))
+ readin(fileheader, sizeof fileheader);
+ if ((unsigned char)fileheader[4] != checksum(fileheader, 4))
input1error(" is not an object file (checksum failed)");
- return c2u2(fileheader.count);
+ return c2u2(fileheader + 2);
}
/* read the next module */
return TRUE;
}
-static unsigned checksum(char *string, unsigned length)
+static unsigned checksum(char *stringp, unsigned length)
{
unsigned char sum; /* this is a 1-byte checksum */
+ unsigned char *string = (unsigned char *)stringp;
for (sum = 0; length-- != 0;)
sum += *string++ & 0xFF;
+++ /dev/null
-#ifndef _BSD_A_OUT_H
-#define _BSD_A_OUT_H
-
-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 short a_version; /* 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_EXEC 0x10 /* executable */
-#define A_SEP 0x20 /* separate I/D */
-#define A_PURE 0x40 /* pure text */ /* not used */
-#define A_TOVLY 0x80 /* text overlay */ /* not used */
-
-/* Tell a.out.gnu.h not to define `struct exec'. */
-#define __STRUCT_EXEC_OVERRIDE__
-
-/* Hide M_386 from enum declaration in a.out.h. */
-#define M_386 HIDE_M_386
-
-#ifndef __A_OUT_GNU_H__
-#define __A_OUT_GNU_H__
-
-#if defined(sequent) && defined(i386)
-#define a_magic a_info
-#include <a.out.h>
-#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
-\f
-#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. */
-\f
-#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 */
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <stdint.h>
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);
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);
+++ /dev/null
-/* 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 */
+++ /dev/null
-
-/* 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
+++ /dev/null
-/*
- * 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"
+++ /dev/null
-/* 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; i<strlen(symptr->name);
- 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);
-}
+++ /dev/null
-/* 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 <stdint.h>
-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 */
+++ /dev/null
-/* 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 */