diff options
Diffstat (limited to 'bin86-0.3/ld/ld.c')
-rw-r--r-- | bin86-0.3/ld/ld.c | 180 |
1 files changed, 0 insertions, 180 deletions
diff --git a/bin86-0.3/ld/ld.c b/bin86-0.3/ld/ld.c deleted file mode 100644 index 04ffe83..0000000 --- a/bin86-0.3/ld/ld.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * bin86/ld/ld.c - * - * Copyright (C) 1992 Bruce Evans - */ - -/* ld.c - linker for Introl format (6809 C) object files 6809/8086/80386 */ - -#ifdef STDC_HEADERS_MISSING -extern int errno; -#else -#include <errno.h> -#endif - -#include "const.h" -#include "byteord.h" -#include "type.h" -#include "globvar.h" - -#define MAX_LIBS (NR_STDLIBS + 5) -#define NR_STDLIBS 1 - -PUBLIC long text_base_address; /* XXX */ - -PRIVATE bool_t flag[128]; -PRIVATE char *libs[MAX_LIBS] = { -#ifdef MC6809 - "/usr/local/lib/m09/", -#else - /* One of the following values will be inserted at run time. */ -# define std386lib "/usr/local/lib/i386/" -# define std86lib "/usr/local/lib/i86/" -#endif - 0 -}; -PRIVATE int lastlib = NR_STDLIBS; - -FORWARD char *buildname P((char *pre, char *mid, char *suf)); -FORWARD char *expandlib P((char *fn)); - -PRIVATE char *buildname(pre, mid, suf) -char *pre; -char *mid; -char *suf; -{ - char *name; - - name = ourmalloc(strlen(pre) + strlen(mid) + strlen(suf) + 1); - strcpy(name, pre); - strcat(name, mid); - strcat(name, suf); - return name; -} - -PRIVATE char *expandlib(fn) -char *fn; -{ - char *path; - int i; - -#ifndef MC6809 - libs[0] = flag['3'] ? std386lib : std86lib; -#endif - - for (i = lastlib - 1; i >= 0; --i) - { - path = ourmalloc(strlen(libs[i]) + strlen(fn) + 1); - strcpy(path, libs[i]); - strcat(path, fn); - if (access(path, R_OK) == 0) - return path; - ourfree(path); - } - return NULL; -} - -PUBLIC int main(argc, argv) -int argc; -char **argv; -{ - register char *arg; - int argn; - static char crtprefix[] = "crt"; - static char crtsuffix[] = ".o"; - char *infilename; - static char libprefix[] = "lib"; - static char libsuffix[] = ".a"; - char *outfilename; - char *tfn; - - ioinit(argv[0]); - objinit(); - syminit(); - typeconv_init(BIG_ENDIAN, LONG_BIG_ENDIAN); -#if 0 - flag['z'] = flag['3'] = sizeof(char *) >= 4; -#else - flag['z'] = 0; - flag['3'] = sizeof(char *) >= 4; -#endif - outfilename = NULL; - for (argn = 1; argn < argc; ++argn) - { - arg = argv[argn]; - if (*arg != '-') - readsyms(arg, flag['t']); - else - switch (arg[1]) - { - case '0': /* use 16-bit libraries */ - case '3': /* use 32-bit libraries */ - case 'M': /* print symbols linked */ - case 'i': /* separate I & D output */ - case 'm': /* print modules linked */ -#ifdef BSD_A_OUT - case 'r': /* relocatable output */ -#endif - case 's': /* strip symbols */ - case 't': /* trace modules linked */ - case 'z': /* unmapped zero page */ - if (arg[2] == 0) - flag[arg[1]] = TRUE; - else if (arg[2] == '-' && arg[3] == 0) - flag[arg[1]] = FALSE; - else - usage(); - if (arg[1] == '0') /* flag 0 is negative logic flag 3 */ - flag['3'] = !flag['0']; - break; - case 'C': /* startfile name */ - tfn = buildname(crtprefix, arg + 2, crtsuffix); - if ((infilename = expandlib(tfn)) == NULL) - fatalerror(tfn); - readsyms(infilename, flag['t']); - break; - case 'L': /* library path */ - if (lastlib < MAX_LIBS) - libs[lastlib++] = arg + 2; - else - fatalerror("too many library paths"); - break; - case 'O': /* library file name */ - if ((infilename = expandlib(arg + 2)) == NULL) - fatalerror(arg); - readsyms(infilename, flag['t']); - break; - case 'T': /* text base address */ - if (arg[2] != 0 || ++argn >= argc) - usage(); - errno = 0; - text_base_address = strtoul(argv[argn], (char **) NULL, 16); - if (errno != 0) - use_error("invalid text address"); - break; - case 'l': /* library name */ - tfn = buildname(libprefix, arg + 2, libsuffix); - if ((infilename = expandlib(tfn)) == NULL) - fatalerror(tfn); - readsyms(infilename, flag['t']); - break; - case 'o': /* output file name */ - if (arg[2] != 0 || ++argn >= argc || outfilename != NULL) - usage(); - outfilename = argv[argn]; - break; - default: - usage(); - } - } - linksyms(flag['r']); - if (outfilename == NULL) - outfilename = "a.out"; - writebin(outfilename, flag['i'], flag['3'], flag['s'], flag['z']); - if (flag['m']) - dumpmods(); - if (flag['M']) - dumpsyms(); - flusherr(); - return errcount ? 1 : 0; -} |