This is fasldlsym.c in view mode; [Download] [Up]
/*
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.
*/
#include <dlfcn.h>
#ifdef HAVE_AOUT
#include HAVE_AOUT
#endif
#ifdef HAVE_ELF
#include <elf.h>
#endif
/* cc -DVOL=volatile -G 0 -c foo.c ; ld -shared foo.o -o jim.o ; cat foo.data >> jim.o */
int did_a_dynamic_load;
struct name_list
{ struct name_list *next;
char name[1];
} ;
static struct name_list *loaded_files;
get_init_name(faslfile,init_fun)
object faslfile;
char *init_fun;
{
object path = coerce_to_pathname(faslfile);
char *p;
int n;
strcpy(init_fun,"init_");
coerce_to_filename(path->pn.pn_name,init_fun+5);
p = init_fun +5;
while(*p)
{if (*p == '-') *p = '_';
p++;}
}
fasload(faslfile)
object faslfile;
{ void *dlp ;
int (*fptr)();
char buf[200];
static count=0;
object memory;
object data;
char filename[MAXPATHLEN];
object faslstream;
coerce_to_filename(truename(faslfile), filename);
if (count == 0)
count = time(0);
sprintf(buf,"/tmp/ufas%dxXXXXXX",count++);
/* this is just to allow reloading in the same file twice.
*/
mktemp(buf);
symlink(filename,buf);
{ struct name_list *nl=
(void *) malloc(strlen(buf)+sizeof(struct name_list));
nl->next = loaded_files;
loaded_files = nl;
strcpy(nl->name,buf);
}
faslstream = open_stream(faslfile, smm_input, Cnil, sKerror);
#define MAKE_SHARED_LIB
#ifdef MAKE_SHARED_LIB
{ struct filehdr fhdr;
fread(&fhdr,1,sizeof(fhdr),faslstream->sm.sm_fp);
fseek(faslstream->sm.sm_fp,0,0);
if (IS_NOT_SHARED_OBJECT(fhdr,faslstream))
{ char com[600];
unlink(buf);
LD_SHARED(filename,buf);
system(com);
}
}
#endif
dlp = dlopen(buf,RTLD_NOW);
if (dlp ==0)
FEerror("Cant open for dynamic link ~a",1,make_simple_string(faslfile));
fptr = (int (*)())dlsym(dlp, "init_code");
if (fptr == 0)
{ /* maybe system-p compiled so init_filename */
char init_fun[200];
get_init_name(faslfile,init_fun);
fptr = (int (*)())dlsym(dlp, init_fun);
if (fptr == 0)
FEerror("Cant find init_code in ~a",1,make_simple_string(faslfile));}
SEEK_TO_END_OFILE(faslstream->sm.sm_fp);
data = read_fasl_vector(faslstream);
memory = alloc_object(t_cfdata);
memory->cfd.cfd_self = NULL;
memory->cfd.cfd_start = NULL;
memory->cfd.cfd_size = 0;
if(symbol_value(sLAload_verboseA)!=Cnil)
printf(" start address (dynamic) 0x%x ",fptr);
call_init(0,memory,data,fptr);
unlink(buf);
did_a_dynamic_load = 1;
return memory->cfd.cfd_size;
}
unlink_loaded_files()
{ while(loaded_files)
{ unlink(loaded_files->name);
loaded_files= loaded_files->next;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.