forsyth: ld analog to cc Reference: /n/atom/patch/applied/lddir Date: Sun Aug 16 03:32:05 CES 2015 Signed-off-by: quanstro@quanstro.net # rm /sys/src/cmd/8l/elf.c # rm /sys/src/cmd/8l/elf.h --- /sys/src/cmd/5l/mkfile Sun Aug 16 03:30:45 2015 +++ /sys/src/cmd/5l/mkfile Sun Aug 16 03:30:46 2015 @@ -16,7 +16,7 @@ HFILES=\ l.h\ ../5c/5.out.h\ - ../8l/elf.h\ + ../ld/elf.h\ BIN=/$objtype/bin CFLAGS=$CFLAGS -. -I. @@ -27,8 +27,8 @@ enam.$O: ../5c/enam.c $CC $CFLAGS ../5c/enam.c -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c x:V: $O.out $O.out -la -o/dev/null x.5 --- /sys/src/cmd/6l/mkfile Sun Aug 16 03:30:48 2015 +++ /sys/src/cmd/6l/mkfile Sun Aug 16 03:30:49 2015 @@ -15,7 +15,7 @@ HFILES=\ l.h\ ../6c/6.out.h\ - ../8l/elf.h\ + ../ld/elf.h\ BIN=/$objtype/bin CFLAGS=$CFLAGS -. -I. @@ -31,5 +31,5 @@ enam.$O: ../6c/enam.c $CC $CFLAGS ../6c/enam.c -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c --- /sys/src/cmd/8l/mkfile Sun Aug 16 03:30:51 2015 +++ /sys/src/cmd/8l/mkfile Sun Aug 16 03:30:52 2015 @@ -15,7 +15,7 @@ HFILES=\ l.h\ ../8c/8.out.h\ - ../8l/elf.h\ + ../ld/elf.h\ BIN=/$objtype/bin CFLAGS=$CFLAGS -. -I. @@ -31,5 +31,5 @@ enam.$O: ../8c/enam.c $CC $CFLAGS ../8c/enam.c -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c --- /sys/src/cmd/9l/mkfile Sun Aug 16 03:30:54 2015 +++ /sys/src/cmd/9l/mkfile Sun Aug 16 03:30:56 2015 @@ -28,5 +28,5 @@ $CC $CFLAGS ../9c/enam.c cnam.c: l.h rc mkcname -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c --- /sys/src/cmd/ql/mkfile Sun Aug 16 03:30:58 2015 +++ /sys/src/cmd/ql/mkfile Sun Aug 16 03:30:59 2015 @@ -19,7 +19,7 @@ HFILES=\ l.h\ ../qc/q.out.h\ - ../8l/elf.h\ + ../ld/elf.h\ BIN=/$objtype/bin CFLAGS=$CFLAGS -. -I. @@ -27,7 +27,7 @@ enam.$O: ../qc/enam.c $CC $CFLAGS ../qc/enam.c -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c cnam.c: l.h rc mkcname --- /sys/src/cmd/vl/mkfile Sun Aug 16 03:31:01 2015 +++ /sys/src/cmd/vl/mkfile Sun Aug 16 03:31:02 2015 @@ -17,7 +17,7 @@ HFILES=\ l.h\ ../vc/v.out.h\ - ../8l/elf.h\ + ../ld/elf.h\ BIN=/$objtype/bin CFLAGS=$CFLAGS -. -I. @@ -25,8 +25,8 @@ enam.$O: ../vc/enam.c $CC $CFLAGS ../vc/enam.c -elf.$O: ../8l/elf.c - $CC $CFLAGS ../8l/elf.c +elf.$O: ../ld/elf.c + $CC $CFLAGS ../ld/elf.c x:V: $O.out $O.out -la -o/dev/null x.v --- /sys/src/cmd/ld/mkfile Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/mkfile Sun Aug 16 03:31:03 2015 @@ -0,0 +1,2 @@ +all clean install nuke:VQ: + # --- /sys/src/cmd/ld/Nt.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/Nt.c Sun Aug 16 03:31:04 2015 @@ -0,0 +1,51 @@ +#include +#include + +/* + * We can't include l.h, because Windoze wants to use some names + * like FLOAT and ABC which we declare. Define what we need here. + */ +typedef unsigned char uchar; +typedef unsigned int uint; +typedef unsigned long ulong; + +#define Chunk (1*1024*1024) + +void* +mysbrk(ulong size) +{ + void *v; + static int chunk; + static uchar *brk; + + if(chunk < size) { + chunk = Chunk; + if(chunk < size) + chunk = Chunk + size; + brk = VirtualAlloc(NULL, chunk, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + if(brk == 0) + return (void*)-1; + } + v = brk; + chunk -= size; + brk += size; + return v; +} + +double +cputime(void) +{ + return 0.0; +} + +int +fileexists(char *name) +{ + int fd; + + fd = open(name, OREAD); + if(fd < 0) + return 0; + close(fd); + return 1; +} --- /sys/src/cmd/ld/Plan9.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/Plan9.c Sun Aug 16 03:31:05 2015 @@ -0,0 +1,16 @@ +#include "l.h" + +void* +mysbrk(ulong size) +{ + return sbrk(size); +} + +int +fileexists(char *s) +{ + uchar dirbuf[400]; + + /* it's fine if stat result doesn't fit in dirbuf, since even then the file exists */ + return stat(s, dirbuf, sizeof(dirbuf)) >= 0; +} --- /sys/src/cmd/ld/Posix.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/Posix.c Sun Aug 16 03:31:06 2015 @@ -0,0 +1,46 @@ +#include "l.h" +#include +#include +#include +#undef getwd +#include /* For sysconf() and _SC_CLK_TCK */ + +void* +mysbrk(usize size) +{ + return (void*)sbrk(size); +} + +double +cputime(void) +{ + + struct tms tmbuf; + double ret_val; + + /* + * times() only fails if &tmbuf is invalid. + */ + (void)times(&tmbuf); + /* + * Return the total time (in system clock ticks) + * spent in user code and system + * calls by both the calling process and its children. + */ + ret_val = (double)(tmbuf.tms_utime + tmbuf.tms_stime + + tmbuf.tms_cutime + tmbuf.tms_cstime); + /* + * Convert to seconds. + */ + ret_val *= sysconf(_SC_CLK_TCK); + return ret_val; + +} + +int +fileexists(char *name) +{ + struct stat sb; + + return stat(name, &sb) >= 0; +} --- /sys/src/cmd/ld/elf.c Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/elf.c Sun Aug 16 03:31:07 2015 @@ -0,0 +1,266 @@ +/* + * emit 32- or 64-bit elf headers for any architecture. + * this is a component of ?l. + */ +#include "l.h" + +enum { + /* offsets into string table */ + Stitext = 1, + Stidata = 7, + Stistrtab = 13, +}; + +void +elfident(int bo, int class) +{ + strnput("\177ELF", 4); /* e_ident */ + cput(class); + cput(bo); /* byte order */ + cput(1); /* version = CURRENT */ + if(debug['k']){ /* boot/embedded/standalone */ + cput(255); + cput(0); + } + else{ + cput(0); /* osabi = SYSV */ + cput(0); /* abiversion = 3 */ + } + strnput("", 7); +} + +void +elfstrtab(void) +{ + /* string table */ + cput(0); + strnput(".text", 5); /* +1 */ + cput(0); + strnput(".data", 5); /* +7 */ + cput(0); + strnput(".strtab", 7); /* +13 */ + cput(0); + cput(0); +} + +void +elf32phdr(void (*putl)(long), ulong type, ulong off, ulong vaddr, ulong paddr, + ulong filesz, ulong memsz, ulong prots, ulong align) +{ + putl(type); + putl(off); + putl(vaddr); + putl(paddr); + putl(filesz); + putl(memsz); + putl(prots); + putl(align); +} + +void +elf32shdr(void (*putl)(long), ulong name, ulong type, ulong flags, ulong vaddr, + ulong off, ulong sectsz, ulong link, ulong addnl, ulong align, + ulong entsz) +{ + putl(name); + putl(type); + putl(flags); + putl(vaddr); + putl(off); + putl(sectsz); + putl(link); + putl(addnl); + putl(align); + putl(entsz); +} + +static void +elf32sectab(void (*putl)(long)) +{ + seek(cout, HEADR+textsize+datsize+symsize, 0); + elf32shdr(putl, Stitext, Progbits, Salloc|Sexec, INITTEXT, + HEADR, textsize, 0, 0, 0x10000, 0); + elf32shdr(putl, Stidata, Progbits, Salloc|Swrite, INITDAT, + HEADR+textsize, datsize, 0, 0, 0x10000, 0); + elf32shdr(putl, Stistrtab, Strtab, 1 << 5, 0, + HEADR+textsize+datsize+symsize+3*Shdr32sz, 14, 0, 0, 1, 0); + elfstrtab(); +} + +/* if addpsects > 0, putpsects must emit exactly that many psects. */ +void +elf32(int mach, int bo, int addpsects, void (*putpsects)(Putl)) +{ + ulong phydata; + void (*putw)(long), (*putl)(long); + + if(bo == ELFDATA2MSB){ + putw = wput; + putl = lput; + }else if(bo == ELFDATA2LSB){ + putw = wputl; + putl = lputl; + }else{ + print("elf32 byte order is mixed-endian\n"); + errorexit(); + return; + } + + elfident(bo, ELFCLASS32); + putw(EXEC); + putw(mach); + putl(1L); /* version = CURRENT */ + putl(entryvalue()); /* entry vaddr */ + putl(Ehdr32sz); /* offset to first phdr */ + if(debug['S']) + putl(HEADR+textsize+datsize+symsize); /* offset to first shdr */ + else + putl(0); + putl(0L); /* flags */ + putw(Ehdr32sz); + putw(Phdr32sz); + putw(3 + addpsects); /* # of Phdrs */ + putw(Shdr32sz); + if(debug['S']){ + putw(3); /* # of Shdrs */ + putw(2); /* Shdr table index */ + }else{ + putw(0); + putw(0); + } + + /* + * could include ELF headers in text -- 8l doesn't, + * but in theory it aids demand loading. + */ + elf32phdr(putl, PT_LOAD, HEADR, INITTEXT, INITTEXTP, + textsize, textsize, R|X, INITRND); /* text */ + /* + * we need INITDATP, but it has to be computed. + * assume distance between INITTEXT & INITTEXTP is also + * correct for INITDAT and INITDATP. + */ + phydata = INITDAT - (INITTEXT - INITTEXTP); + elf32phdr(putl, PT_LOAD, HEADR+textsize, INITDAT, phydata, + datsize, datsize+bsssize, R|W|X, INITRND); /* data */ + elf32phdr(putl, NOPTYPE, HEADR+textsize+datsize, 0, 0, + symsize, lcsize, R, 4); /* symbol table */ + if (addpsects > 0) + putpsects(putl); + cflush(); + + if(debug['S']) + elf32sectab(putl); +} + +/* + * elf64 + */ + +void +elf64phdr(void (*putl)(long), void (*putll)(vlong), ulong type, uvlong off, + uvlong vaddr, uvlong paddr, uvlong filesz, uvlong memsz, ulong prots, + uvlong align) +{ + putl(type); + putl(prots); + putll(off); + putll(vaddr); + putll(paddr); + putll(filesz); + putll(memsz); + putll(align); +} + +void +elf64shdr(void (*putl)(long), void (*putll)(vlong), ulong name, ulong type, + uvlong flags, uvlong vaddr, uvlong off, uvlong sectsz, ulong link, + ulong addnl, uvlong align, uvlong entsz) +{ + putl(name); + putl(type); + putll(flags); + putll(vaddr); + putll(off); + putll(sectsz); + putl(link); + putl(addnl); + putll(align); + putll(entsz); +} + +static void +elf64sectab(void (*putl)(long), void (*putll)(vlong)) +{ + seek(cout, HEADR+textsize+datsize+symsize, 0); + elf64shdr(putl, putll, Stitext, Progbits, Salloc|Sexec, INITTEXT, + HEADR, textsize, 0, 0, 0x10000, 0); + elf64shdr(putl, putll, Stidata, Progbits, Salloc|Swrite, INITDAT, + HEADR+textsize, datsize, 0, 0, 0x10000, 0); + elf64shdr(putl, putll, Stistrtab, Strtab, 1 << 5, 0, + HEADR+textsize+datsize+symsize+3*Shdr64sz, 14, 0, 0, 1, 0); + elfstrtab(); +} + +/* if addpsects > 0, putpsects must emit exactly that many psects. */ +void +elf64(int mach, int bo, int addpsects, void (*putpsects)(Putl)) +{ + uvlong phydata; + void (*putw)(long), (*putl)(long); + void (*putll)(vlong); + + if(bo == ELFDATA2MSB){ + putw = wput; + putl = lput; + putll = llput; + }else if(bo == ELFDATA2LSB){ + putw = wputl; + putl = lputl; + putll = llputl; + }else{ + print("elf64 byte order is mixed-endian\n"); + errorexit(); + return; + } + + elfident(bo, ELFCLASS64); + putw(EXEC); + putw(mach); + putl(1L); /* version = CURRENT */ + putll(entryvalue()); /* entry vaddr */ + putll(Ehdr64sz); /* offset to first phdr */ + if(debug['S']) + putll(HEADR+textsize+datsize+symsize); /* offset to 1st shdr */ + else + putll(0); + putl(0L); /* flags */ + putw(Ehdr64sz); + putw(Phdr64sz); + putw(3 + addpsects); /* # of Phdrs */ + putw(Shdr64sz); + if(debug['S']){ + putw(3); /* # of Shdrs */ + putw(2); /* Shdr table index */ + }else{ + putw(0); + putw(0); + } + + elf64phdr(putl, putll, PT_LOAD, HEADR, INITTEXT, INITTEXTP, + textsize, textsize, R|X, INITRND); /* text */ + /* + * see 32-bit ELF case for physical data address computation. + */ + phydata = INITDAT - (INITTEXT - INITTEXTP); + elf64phdr(putl, putll, PT_LOAD, HEADR+textsize, INITDAT, phydata, + datsize, datsize+bsssize, R|W, INITRND); /* data */ + elf64phdr(putl, putll, NOPTYPE, HEADR+textsize+datsize, 0, 0, + symsize, lcsize, R, 4); /* symbol table */ + if (addpsects > 0) + putpsects(putl); + cflush(); + + if(debug['S']) + elf64sectab(putl, putll); +} --- /sys/src/cmd/ld/elf.h Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/ld/elf.h Sun Aug 16 03:31:08 2015 @@ -0,0 +1,97 @@ +enum { + Ehdr32sz = 52, + Phdr32sz = 32, + Shdr32sz = 40, + + Ehdr64sz = 64, + Phdr64sz = 56, + Shdr64sz = 64, +}; + +/* from /sys/src/libmach/elf.h */ +enum { + /* Ehdr codes */ + MAG0 = 0, /* ident[] indexes */ + MAG1 = 1, + MAG2 = 2, + MAG3 = 3, + CLASS = 4, + DATA = 5, + VERSION = 6, + + ELFCLASSNONE = 0, /* ident[CLASS] */ + ELFCLASS32 = 1, + ELFCLASS64 = 2, + ELFCLASSNUM = 3, + + ELFDATANONE = 0, /* ident[DATA] */ + ELFDATA2LSB = 1, + ELFDATA2MSB = 2, + ELFDATANUM = 3, + + NOETYPE = 0, /* type */ + REL = 1, + EXEC = 2, + DYN = 3, + CORE = 4, + + NONE = 0, /* machine */ + M32 = 1, /* AT&T WE 32100 */ + SPARC = 2, /* Sun SPARC */ + I386 = 3, /* Intel 80386 */ + M68K = 4, /* Motorola 68000 */ + M88K = 5, /* Motorola 88000 */ + I486 = 6, /* Intel 80486 */ + I860 = 7, /* Intel i860 */ + MIPS = 8, /* Mips R2000 */ + S370 = 9, /* Amdhal */ + MIPSR4K = 10, /* Mips R4000 */ + SPARC64 = 18, /* Sun SPARC v9 */ + POWER = 20, /* PowerPC */ + POWER64 = 21, /* PowerPC64 */ + ARM = 40, /* ARM */ + AMD64 = 62, /* Amd64 */ + ARM64 = 183, /* ARM64 */ + + NO_VERSION = 0, /* version, ident[VERSION] */ + CURRENT = 1, + + /* Phdr Codes */ + NOPTYPE = 0, /* type */ + PT_LOAD = 1, + DYNAMIC = 2, + INTERP = 3, + NOTE = 4, + SHLIB = 5, + PHDR = 6, + + R = 0x4, /* flags */ + W = 0x2, + X = 0x1, + + /* Shdr Codes */ + Progbits = 1, /* section types */ + Strtab = 3, + Nobits = 8, + + Swrite = 1, /* section attributes (flags) */ + Salloc = 2, + Sexec = 4, +}; + +typedef void (*Putl)(long); + +void elf32(int mach, int bo, int addpsects, void (*putpsects)(Putl)); +void elf32phdr(void (*putl)(long), ulong type, ulong off, ulong vaddr, + ulong paddr, ulong filesz, ulong memsz, ulong prots, ulong align); +void elf32shdr(void (*putl)(long), ulong name, ulong type, ulong flags, + ulong vaddr, ulong off, ulong sectsz, ulong link, ulong addnl, + ulong align, ulong entsz); + +void elf64(int mach, int bo, int addpsects, void (*putpsects)(Putl)); +void elf64phdr(void (*putl)(long), void (*putll)(vlong), ulong type, + uvlong off, uvlong vaddr, uvlong paddr, uvlong filesz, uvlong memsz, + ulong prots, uvlong align); +void elf64shdr(void (*putl)(long), void (*putll)(vlong), ulong name, + ulong type, uvlong flags, uvlong vaddr, uvlong off, uvlong sectsz, + ulong link, ulong addnl, uvlong align, uvlong entsz); --- /sys/src/cmd/5l/l.h Sun Aug 16 03:31:10 2015 +++ /sys/src/cmd/5l/l.h Sun Aug 16 03:31:11 2015 @@ -2,7 +2,7 @@ #include #include #include "../5c/5.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern --- /sys/src/cmd/6l/l.h Sun Aug 16 03:31:13 2015 +++ /sys/src/cmd/6l/l.h Sun Aug 16 03:31:14 2015 @@ -2,7 +2,7 @@ #include #include #include "../6c/6.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern @@ -121,7 +121,7 @@ MINSIZ = 8, STRINGSZ = 200, MINLC = 1, - MAXIO = 8192, + MAXIO = 6*8192, MAXHIST = 20, /* limit of path elements for history symbols */ Yxxx = 0, @@ -381,8 +381,6 @@ vlong entryvalue(void); void errorexit(void); void export(void); -int find1(long, int); -int find2(long, int); void follow(void); void gethunk(void); void histtoauto(void); --- /sys/src/cmd/8l/l.h Sun Aug 16 03:31:17 2015 +++ /sys/src/cmd/8l/l.h Sun Aug 16 03:31:18 2015 @@ -2,7 +2,7 @@ #include #include #include "../8c/8.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern --- /sys/src/cmd/9l/l.h Sun Aug 16 03:31:21 2015 +++ /sys/src/cmd/9l/l.h Sun Aug 16 03:31:22 2015 @@ -2,7 +2,7 @@ #include #include #include "../9c/9.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern --- /sys/src/cmd/ql/l.h Sun Aug 16 03:31:24 2015 +++ /sys/src/cmd/ql/l.h Sun Aug 16 03:31:25 2015 @@ -2,7 +2,7 @@ #include #include #include "../qc/q.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern --- /sys/src/cmd/vl/l.h Sun Aug 16 03:31:27 2015 +++ /sys/src/cmd/vl/l.h Sun Aug 16 03:31:29 2015 @@ -2,7 +2,7 @@ #include #include #include "../vc/v.out.h" -#include "../8l/elf.h" +#include "../ld/elf.h" #ifndef EXTERN #define EXTERN extern