Add some analysis of the V7 linker to see link order and symbols, add dump.good.map
authorNick Downing <nick@ndcode.org>
Fri, 12 Aug 2022 06:29:36 +0000 (16:29 +1000)
committerNick Downing <nick@ndcode.org>
Fri, 12 Aug 2022 06:29:36 +0000 (16:29 +1000)
usr/src/cmd/a.sh
usr/src/cmd/aout_hex2bin.py
usr/src/cmd/dump.good.map [new file with mode: 0644]
usr/src/cmd/l.sh [new file with mode: 0755]
usr/src/cmd/ld.c

index 69ceae4..37945c6 100755 (executable)
@@ -9,6 +9,42 @@ export PATH=`pwd`/../../../bin:`pwd`
 #cc -n -s -o dump dump.o
 cc -O -S dump.c
 as -l -o dump.o dump.s
-ld -bD=0x2800 -L/lib /lib/crt0.o -o dump -n -s -m1 -u -w dump.o -lc
+
+# use link order from aslink library search
+#ld -bD=0x2800 -L/lib /lib/crt0.o -o dump -n -s -m1 -u -w dump.o -lc
+
+# use link order determined by l.sh
+ld -bD=0x2800 -L/lib /lib/crt0.o -o dump -n -s -m1 -u -w dump.o \
+../libc/printf.o \
+../libc/doprnt.o \
+../libc/ffltpr.o \
+../libc/strout.o \
+../libc/flsbuf.o \
+../libc/data.o \
+../libc/cuexit.o \
+../libc/atoi.o \
+../libc/atol.o \
+../libc/ctime.o \
+../libc/malloc.o \
+../libc/isatty.o \
+../libc/l3.o \
+../libc/stty.o \
+../libc/close.o \
+../libc/creat.o \
+../libc/ioctl.o \
+../libc/lseek.o \
+../libc/open.o \
+../libc/read.o \
+../libc/sbrk.o \
+../libc/sync.o \
+../libc/time.o \
+../libc/write.o \
+../libc/almul.o \
+../libc/cerror.o \
+../libc/ldiv.o \
+../libc/lmul.o \
+../libc/lrem.o \
+../libc/csv.o
+
 /usr/bin/python3 aout_hex2bin.py dumpI.ihx dumpD.ihx dump <dump.map
 chmod a+x dump
index 8f23ac8..6094b5c 100755 (executable)
@@ -42,7 +42,7 @@ data_size = (data_size + 1) & ~1
 bss_size = D_size - data_size
 bss_size = (bss_size + 1) & ~1
 
-entry_point = intelhexI.start_addr['EIP'] | 1
+entry_point = intelhexI.start_addr['EIP']
 
 hdr = [0] * HEADER_SIZE
 hdr[0] = NMAGIC & 0xff
@@ -58,6 +58,7 @@ hdr[0xa] = entry_point & 0xff
 hdr[0xb] = (entry_point >> 8) & 0xff
 # 0xc, 0xd = pad (unsupported)
 # 0xe, 0xf = relflg (unsupported)
+hdr[0xe] = 1
 
 intelhexI.padding = 0
 text = list(intelhexI.tobinstr(0, text_size - 1))
diff --git a/usr/src/cmd/dump.good.map b/usr/src/cmd/dump.good.map
new file mode 100644 (file)
index 0000000..6215ff0
--- /dev/null
@@ -0,0 +1,102 @@
+symbol 0000 start
+symbol 003c _main
+symbol 034c _pass
+symbol 0422 _icat
+symbol 04c2 _indir
+symbol 058a _mark
+symbol 064a _add
+symbol 0714 _dump
+symbol 079e _dmpspc
+symbol 07d8 _bitmap
+symbol 0840 _spclrec
+symbol 087e _dsrch
+symbol 093a _nullf
+symbol 0942 _bread
+symbol 099c _CLR
+symbol 09b0 _taprec
+symbol 0a02 _tapsrec
+symbol 0a44 _flusht
+symbol 0b7c _otape
+symbol 0bc8 _prdate
+symbol 0bfa _getitim
+symbol 0cc8 _putitim
+symbol 0e0a _est
+symbol 0eae _bmapest
+symbol 0efe _printf
+symbol 0f2a __doprnt
+symbol 1176 pfloat
+symbol 1176 pgen
+symbol 1176 pscien
+symbol 1180 __strout
+symbol 1240 __flsbuf
+symbol 1322 _fflush
+symbol 1374 __cleanu
+symbol 1392 _fclose
+symbol 13f4 _exit
+symbol 1402 _atoi
+symbol 1462 _atol
+symbol 14fe _ctime
+symbol 1514 _localti
+symbol 163e _gmtime
+symbol 17d6 _asctime
+symbol 1896 _dysize
+symbol 1900 _malloc
+symbol 1a3a _free
+symbol 1a58 _realloc
+symbol 1b02 _isatty
+symbol 1b2a _ltol3
+symbol 1b4e _l3tol
+symbol 1b72 _stty
+symbol 1b8c _gtty
+symbol 1ba6 _close
+symbol 1bbc _creat
+symbol 1bda _ioctl
+symbol 1c00 _lseek
+symbol 1c2c _open
+symbol 1c4a _read
+symbol 1c6c _sbrk
+symbol 1c96 _brk
+symbol 1cb6 _sync
+symbol 1cc0 _time
+symbol 1cd8 _ftime
+symbol 1cea _write
+symbol 1d0c almul
+symbol 1d38 cerror
+symbol 1d46 ldiv
+symbol 1df8 lmul
+symbol 1e1e lrem
+symbol 1ebc csv
+symbol 1ec8 cret
+symbol 2002 _density
+symbol 21ac __iob
+symbol 224c __lastbu
+symbol 22f6 _mpxip
+symbol 22f8 _spcl
+symbol 2550 _sblock
+symbol 2708 _itab
+symbol 4708 _clrmap
+symbol 6708 _dirmap
+symbol 8708 _nodmap
+symbol a708 _disk
+symbol a70a _tape
+symbol a70c _increm
+symbol a70e _incno
+symbol a710 _uflag
+symbol a712 _fi
+symbol a714 _to
+symbol a716 _ino
+symbol a718 _nsubdir
+symbol a71a _ntape
+symbol a71c _nadded
+symbol a71e _dadded
+symbol a720 _tsize
+symbol a724 _esize
+symbol a728 _asize
+symbol a72c _tblock
+symbol cf2c _tdaddr
+symbol cf7c _trecno
+symbol cf7e __sobuf
+symbol d17e __sibuf
+symbol d37e _errno
+symbol d380 _environ
+symbol d3ba _end
diff --git a/usr/src/cmd/l.sh b/usr/src/cmd/l.sh
new file mode 100755 (executable)
index 0000000..ac52e36
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+git checkout ../../../bin/as ../../../bin/cc ../../../bin/ld ../../../lib/c[012] ../../../lib/*crt0.o ../../../lib/libc.a c/cvopt
+if ! test -d ../../../tmp
+then
+  ln -s /tmp ../../../tmp
+fi
+export APOUT_ROOT=`pwd`/../../..
+export PATH=`pwd`/../../../bin:`pwd`
+# set up to produce a trace of object files linked
+cc -n -s -O ld.c -o ld
+mv ld ../../../bin
+# link something
+cc -n -s -O dump.c -o dump
index 48f52a9..75d077a 100644 (file)
@@ -2,6 +2,7 @@
  *  link editor
  */
 
+#include <stdio.h> /* Nick */
 #include <signal.h>
 #include "sys/types.h"
 #include "sys/stat.h"
@@ -663,27 +664,33 @@ middle()
                        nund++;
                        printf("%.8s\n", sp->sname);
                }
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
 
        case EXTERN+ABS:
        default:
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
 
        case EXTERN+TEXT:
                sp->svalue += torigin;
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
 
        case EXTERN+DATA:
                sp->svalue += dorigin;
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
 
        case EXTERN+BSS:
                sp->svalue += borigin;
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
 
        case EXTERN+COMM:
                sp->stype = EXTERN+BSS;
                sp->svalue += corigin;
+ fprintf(stderr, "symbol %04x %.8s\n", sp->svalue, sp->sname);
                continue;
        }
        if (sflag || xflag)
@@ -961,6 +968,7 @@ struct buf *buf;
 mkfsym(s)
 char *s;
 {
+ fprintf(stderr, "mkfsym %s\n", s);
 
        if (sflag || xflag)
                return;