home *** CD-ROM | disk | FTP | other *** search
- /*
- Copyright (C) 1994 M. Hagiya, W. Schelter, T. Yuasa
-
- This file is part of GNU Common Lisp, herein referred to as GCL
-
- GCL is free software; you can redistribute it and/or modify it under
- the terms of the GNU LIBRARY GENERAL PUBLIC LICENSE as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- GCL is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
- License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with GCL; see the file COPYING. If not, write to the Free Software
- Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
-
-
- /* make sure we do allocate aligned for double */
- /* actually I understand that ld -A wants alignment on
- the page. ie multiple of 0x1000
- */
-
- #define ALIGN 12
- char *
- alloc_contblock_aligned(size)
- int size;
- {
- char *tmp_alloc = ALLOC_ALIGNED(alloc_contblock,size,(1<<12));
- bzero(tmp_alloc, size);
- return(tmp_alloc);
- }
-
- #define alloc_contblock alloc_contblock_aligned
-
-
-
- #ifdef BSD
- #include <a.out.h>
- #endif
-
- #ifdef ATT
- #ifdef mips
- #include <unistd.h>
- #include <aouthdr.h>
- #endif
- #include <filehdr.h>
- #include <scnhdr.h>
- #include <syms.h>
- #endif
-
- #ifdef E15
- #include <a.out.h>
- #define exec bhdr
- #define a_text tsize
- #define a_data dsize
- #define a_bss bsize
- #define a_syms ssize
- #define a_trsize rtsize
- #define a_drsize rdsize
- #endif
-
-
- #define MAXPATHLEN 1024
-
-
- int
- fasload(faslfile)
- object faslfile;
- {
-
- #ifdef BSD
- struct exec header, newheader;
- #define textsize header.a_text
- #define datasize header.a_data
- #define bsssize header.a_bss
- #define textstart sizeof(header)
- #define newbsssize newheader.a_bss
- #endif
-
- #ifdef ATT
- struct filehdr fileheader;
- struct scnhdr sectionheader;
- #ifdef mips
- struct aouthdr aouthdr, newaouthdr;
- HDRR symhdr;
- # define textsize aouthdr.tsize
- # define datasize aouthdr.dsize
- # define bsssize aouthdr.bsize
- # define textstart sectionheader.s_scnptr
- # define newdatasize newaouthdr.dsize
- # define newbsssize newaouthdr.bsize
- #else
- int textsize, datasize, bsssize;
- int textstart;
- #endif /* mips */
- #endif
-
- #ifdef E15
- struct exec header;
- #define textsize header.a_text
- #define datasize header.a_data
- #define bsssize header.a_bss
- #define textstart sizeof(header)
- #endif
-
- object memory, data, tempfile;
- FILE *fp;
- char filename[MAXPATHLEN];
- char tempfilename[32];
- char command[MAXPATHLEN * 2];
- int i;
- object *old_vs_base = vs_base;
- object *old_vs_top = vs_top;
- #ifdef IBMRT
-
- #endif
-
- coerce_to_filename(faslfile, filename);
-
- faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
- vs_push(faslfile);
- fp = faslfile->sm.sm_fp;
-
- #ifdef BSD
- fread(&header, sizeof(header), 1, fp);
- #endif
- #ifdef ATT
- fread(&fileheader, sizeof(fileheader), 1, fp);
- #ifdef mips
- fread(&aouthdr, AOUTHSZ, 1, fp);
- #else
- #ifdef S3000
- if(fileheader.f_opthdr != 0) fseek(fp,fileheader.f_opthdr,1);
- #endif
- fread(§ionheader, sizeof(sectionheader), 1, fp);
- textsize = sectionheader.s_size;
- textstart = sectionheader.s_scnptr;
- fread(§ionheader, sizeof(sectionheader), 1, fp);
- datasize = sectionheader.s_size;
- fread(§ionheader, sizeof(sectionheader), 1, fp);
- if (strcmp(sectionheader.s_name, ".bss") == 0)
- bsssize = sectionheader.s_size;
- else
- bsssize = 0;
- #endif /* mips */
- #endif
- #ifdef E15
- fread(&header, sizeof(header), 1, fp);
- #endif
-
- memory = alloc_object(t_cfdata);
- memory->cfd.cfd_self = NULL;
- memory->cfd.cfd_start = NULL;
- memory->cfd.cfd_size = textsize + datasize + bsssize;
- #ifdef mips
- #define MIPS_ROUND 0xC
- memory->cfd.cfd_size += MIPS_ROUND; /* room for 'ld' to round text upward */
- #endif
- vs_push(memory);
- memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
-
- #ifdef BSD
- fseek(fp,
- header.a_text+header.a_data+
- header.a_syms+header.a_trsize+header.a_drsize,
- 1);
- fread(&i, sizeof(i), 1, fp);
- fseek(fp, i - sizeof(i), 1);
- #endif
-
- #ifdef ATT
- #ifdef mips
- fseek(fp, fileheader.f_symptr, SEEK_SET);
- fread(&symhdr, cbHDRR, 1, fp);
- fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
- #else
- fseek(fp,
- fileheader.f_symptr + SYMESZ*fileheader.f_nsyms,
- 0);
- fread(&i, sizeof(i), 1, fp);
- fseek(fp, i - sizeof(i), 1);
- while ((i = getc(fp)) == 0)
- ;
- ungetc(i, fp);
- #endif /* mips */
- #endif
-
- #ifdef E15
- fseek(fp,
- header.a_text+header.a_data+
- header.a_syms+header.a_trsize+header.a_drsize,
- 1);
- #endif
-
- data = read_fasl_vector(faslfile);
- vs_push(data);
- close_stream(faslfile, TRUE);
-
- sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
-
- AGAIN:
-
- #ifdef BSD
- sprintf(command,
- "ld -d -N -x -A %s -T %x %s -o %s",
- kcl_self,
- memory->cfd.cfd_start,
- filename,
- tempfilename);
- #endif
- #ifdef ATT
- #ifdef mips
- sprintf(command,
- "ld -s -A %s -N -T %x %s -o %s",
- kcl_self,
- (long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
- filename,
- tempfilename);
- #else
- coerce_to_filename(symbol_value(siVsystem_directory),
- system_directory);
- sprintf(command,
- "%sild %s %d %s %s",
- system_directory,
- kcl_self,
- memory->cfd.cfd_start,
- filename,
- tempfilename);
- #endif /* mips */
- #endif
- #ifdef E15
- coerce_to_filename(symbol_value(siVsystem_directory),
- system_directory);
- sprintf(command,
- "%sild %s %d %s %s",
- system_directory,
- kcl_self,
- memory->cfd.cfd_start,
- filename,
- tempfilename);
- #endif
-
- if (system(command) != 0)
- FEerror("The linkage editor failed.", 0);
-
- tempfile = make_simple_string(tempfilename);
- vs_push(tempfile);
- tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
- vs_push(tempfile);
- fp = tempfile->sm.sm_fp;
-
- #ifdef BSD
- fread(&newheader, sizeof(header), 1, fp);
- if (newbsssize != bsssize) {
- insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
- bsssize = newbsssize;
- memory->cfd.cfd_start = NULL;
- memory->cfd.cfd_size = textsize + datasize + bsssize;
- memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
- close_stream(tempfile, TRUE);
- unlink(tempfilename);
- goto AGAIN;
- }
- #endif
- #ifdef mips
- fseek(fp, FILHSZ, SEEK_CUR);
- fread(&newaouthdr, AOUTHSZ, 1, fp);
- if (newdatasize + newbsssize > datasize + bsssize) {
- insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
- datasize = newdatasize;
- bsssize = newbsssize;
- memory->cfd.cfd_start = NULL;
- memory->cfd.cfd_size = textsize + datasize + bsssize + MIPS_ROUND;
- memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
- close_stream(tempfile, TRUE);
- unlink(tempfilename);
- goto AGAIN;
- }
- fread(§ionheader, sizeof sectionheader, 1, fp);
- #endif
- if (fseek(fp, textstart, 0) < 0)
- error("file seek error");
- #ifdef mips
- printf("start address -T %x ",memory->cfd.cfd_start);
- bzero(memory->cfd.cfd_start, MIPS_ROUND);
- fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
- #else
- fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
- #endif
- close_stream(tempfile, TRUE);
-
- unlink(tempfilename);
-
- call_init(0,memory,data);
-
- vs_base = old_vs_base;
- vs_top = old_vs_top;
-
- return(memory->cfd.cfd_size);
- }
-
- #if defined BSD || defined mips
-
- int
- faslink(faslfile, ldargstring)
- object faslfile, ldargstring;
- {
- #ifdef mips
- struct filehdr faslheader;
- struct aouthdr aouthdr;
- struct scnhdr sectionheader;
- HDRR symhdr;
- #define ldcmdfmt "ld -s -A %s -N -T %x %s %s -o %s"
- #else
- struct exec header, faslheader;
- #define textsize header.a_text
- #define datasize header.a_data
- #define bsssize header.a_bss
- #define textstart sizeof(header)
- #define ldcmdfmt "ld -d -N -x -A %s -T %x %s %s -o %s"
- #endif
-
- object memory, data, tempfile;
- FILE *fp;
- char filename[MAXPATHLEN];
- char ldargstr[MAXPATHLEN];
- char tempfilename[32];
- char command[MAXPATHLEN * 2];
- char buf[BUFSIZ];
- int i;
- object *old_vs_base = vs_base;
- object *old_vs_top = vs_top;
- #ifdef IBMRT
-
- #endif
-
- coerce_to_filename(ldargstring, ldargstr);
- coerce_to_filename(faslfile, filename);
-
- sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
-
- sprintf(command,
- ldcmdfmt,
- kcl_self,
- (int)core_end,
- filename,
- ldargstr,
- tempfilename);
-
- if (system(command) != 0)
- FEerror("The linkage editor failed.", 0);
-
- fp = fopen(tempfilename, "r");
- setbuf(fp, buf);
- #ifdef mips
- fseek(fp, FILHSZ, SEEK_CUR);
- fread(&aouthdr, AOUTHSZ, 1, fp);
- #else
- fread(&header, sizeof(header), 1, fp);
- #endif
- memory = alloc_object(t_cfdata);
- memory->cfd.cfd_self = NULL;
- memory->cfd.cfd_start = NULL;
- memory->cfd.cfd_size = textsize + datasize + bsssize;
- #ifdef mips
- memory->cfd.cfd_size += MIPS_ROUND;
- #endif
- vs_push(memory);
- memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
- fclose(fp);
-
- faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
- vs_push(faslfile);
- fp = faslfile->sm.sm_fp;
- fread(&faslheader, sizeof(faslheader), 1, fp);
- #ifdef mips
- fseek(fp, AOUTHSZ, SEEK_CUR);
- fread(§ionheader, SCNHSZ, 1, fp);
- fseek(fp, faslheader.f_symptr, SEEK_SET);
- fread(&symhdr, cbHDRR, 1, fp);
- fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
- #else
- fseek(fp,
- faslheader.a_text+faslheader.a_data+
- faslheader.a_syms+faslheader.a_trsize+faslheader.a_drsize,
- 1);
- fread(&i, sizeof(i), 1, fp);
- fseek(fp, i - sizeof(i), 1);
- #endif
- data = read_fasl_vector(faslfile);
- vs_push(data);
- close_stream(faslfile, TRUE);
-
- sprintf(command,
- ldcmdfmt,
- kcl_self,
- #ifdef mips
- (long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
- #else
- memory->cfd.cfd_start,
- #endif
- filename,
- ldargstr,
- tempfilename);
-
- if (system(command) != 0)
- FEerror("The linkage editor failed.", 0);
-
- tempfile = make_simple_string(tempfilename);
- vs_push(tempfile);
- tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
- vs_push(tempfile);
- fp = tempfile->sm.sm_fp;
-
- #ifdef mips
- fseek(fp, FILHSZ, SEEK_CUR);
- fread(&aouthdr, AOUTHSZ, 1, fp);
- fread(§ionheader, sizeof sectionheader, 1, fp);
- #endif
-
- if (fseek(fp, textstart, 0) < 0)
- error("file seek error");
- #ifdef mips
- printf("start address -T %x ",memory->cfd.cfd_start);
- bzero(memory->cfd.cfd_start, MIPS_ROUND);
- fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
- #else
- fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
- #endif
- close_stream(tempfile, TRUE);
-
- unlink(tempfilename);
-
- call_init(0,memory,data);
-
- vs_base = old_vs_base;
- vs_top = old_vs_top;
-
- return(memory->cfd.cfd_size);
- }
-
- siLfaslink()
- {
- bds_ptr old_bds_top;
- int i;
- object package;
-
- check_arg(2);
- check_type_or_pathname_string_symbol_stream(&vs_base[0]);
- check_type_string(&vs_base[1]);
- vs_base[0] = coerce_to_pathname(vs_base[0]);
- vs_base[0]->pn.pn_type = FASL_string;
- vs_base[0] = namestring(vs_base[0]);
- package = symbol_value(Vpackage);
- old_bds_top = bds_top;
- bds_bind(Vpackage, package);
- i = faslink(vs_base[0], vs_base[1]);
- bds_unwind(old_bds_top);
- vs_top = vs_base;
- vs_push(make_fixnum(i));
- }
-
- #endif
-
- #define FASLINK
-