jkh@pcsbst.UUCP (jkh) (08/11/89)
I think I've finally figured this out and thought I'd explain it for the benefit of those who said "When you figure it out, let me know." First off, it's "fasload()", not "funload()" as I said originally. Sorry for the typo! Second, AKCL and KCL seem to have different ideas as to what constitutes the fasload/faslink combo, with the AKCL side doing some things rather strangely (AKCL 1.179). First, the kcl side: In unixfasl.c, the routine fasload() is defined for both BSD and SYSV systems. Its job is to look at a "fasl" file (a .o produced by kcl that has some special data appended to it) and do the following: 1. See how big the text, data and bss are and malloc() sufficient space. 2. Read the special data at the end into a lisp object (type "object" in C) 3. Use ld create a new intermediate object file by incrementally linking the fasl file against the original kcl executable (never strip saved_kcl, for this reason!) at the address of the malloc'd space. In sysV, this is done by "ild" (the incremental loader) since the stock ld does not support -A. I had to write this program myself, using an ld param file that specified the kcl binary as a "NOLOAD" section. There are several examples of ild implementations in the kcl/ild directory if you're completely lost. 4. Open the intermediate object as an ordinary unix file, skip past the header and read textsize + datasize bytes (the intermediate object will have no bss) into the malloc'd memory. 5. Treat pointer to memory as a function pointer, passing address of memory, length of memory and "special data object" as parameters to call. This essentially calls the first function in the original fasl file. The routine faslink() is defined only for BSD. It functions similar to fasload(), except it does things in two passes. First, it combines any ancillary objects and libraries together with the faslfile and i-loads them with the kcl object (the address is set to the end of the heap). Then it reads the intermediate file produced for the text+data+bss size of everything and allocates the memory. Everything after that goes much the same as in fasload(). On sysV, if you manage to get fasload() working, it's actually not all that hard to get faslink() working as well. Just remember to link the first stage object with -r (using an ild that understands how to pass the extra object/library files to ld) and then do the fasload() steps on the intermediate binary. I'd be happy to provide more information on this step, if anyone is interested. P.S. Someone tried to send me the "how to" doc on getting PCL/CLX/CLUE up under AKCL, but I only got one line. Could you re-send it? Jordan Hubbard PCS Computer Systems. -- -------- Jordan Hubbard PCS Computer Systeme GmbH West Germany UUCP: pyramid!pcsbst!jkh jkh@meepmeep.pcs.com EUNET: unido!pcsbst!jkh ARPA: jkh@violet.berkeley.edu hubbard@decwrl.dec.com