80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
#include <mach-o/rld.h>
 | 
						|
 | 
						|
extern void Free_Symbols (SYMTAB *);
 | 
						|
extern void Call_Initializers (SYMTAB *, char *, int);
 | 
						|
 | 
						|
void Load_Object (Object names) {
 | 
						|
    long retval;
 | 
						|
    struct mach_header *hdr;
 | 
						|
    char **filenames, *libs;
 | 
						|
    NXStream *err_stream;
 | 
						|
    register int i, n;
 | 
						|
    Object port, tail, fullnames;
 | 
						|
    extern char *strtok();
 | 
						|
    GC_Node3;
 | 
						|
    Alloca_Begin;
 | 
						|
 | 
						|
    port = tail = fullnames = Null;
 | 
						|
    GC_Link3 (port, tail, fullnames);
 | 
						|
    for (n = 0, tail = names; !Nullp (tail); n++, tail = Cdr (tail)) {
 | 
						|
	port = General_Open_File (Car (tail), P_INPUT, Var_Get (V_Load_Path));
 | 
						|
	fullnames = Cons (PORT(port)->name, fullnames);
 | 
						|
	(void)P_Close_Input_Port (port);
 | 
						|
    }
 | 
						|
    GC_Unlink;
 | 
						|
 | 
						|
    libs = "";
 | 
						|
    tail = Var_Get (V_Load_Libraries);
 | 
						|
    if (TYPE(tail) == T_String)
 | 
						|
	Get_Strsym_Stack (tail, libs);
 | 
						|
 | 
						|
    Alloca (filenames, char**, (n+1 + strlen (libs)/2) * sizeof (char *));
 | 
						|
    for (i = 0; i < n; i++, fullnames = Cdr (fullnames)) {
 | 
						|
	Object s;
 | 
						|
 | 
						|
	s = Car (fullnames);
 | 
						|
	Get_Strsym_Stack (s, filenames[i]);
 | 
						|
    }
 | 
						|
 | 
						|
    /* Append the load-libraries to the end of the list of filenames
 | 
						|
     * to be passed to rld_load:
 | 
						|
     */
 | 
						|
    for ( ; (filenames[i] = strtok (libs, " \t")) != 0; i++, libs = 0)
 | 
						|
	;
 | 
						|
    if (Verb_Load) {
 | 
						|
	printf ("[rld_load: ");
 | 
						|
	for (i = 0; filenames[i]; i++) printf ("%s ", filenames[i]);
 | 
						|
	printf ("]\n");
 | 
						|
    }
 | 
						|
 | 
						|
    Disable_Interrupts;
 | 
						|
    /* Construct a stream for error logging:
 | 
						|
     */
 | 
						|
    if ((err_stream = NXOpenFile (fileno (stderr), NX_WRITEONLY)) == 0)
 | 
						|
	Primitive_Error ("NXOpenFile failed");
 | 
						|
 | 
						|
    retval = rld_load (err_stream, /* report error messages here */
 | 
						|
	&hdr,                      /* return header address here */
 | 
						|
	filenames,                 /* load these */
 | 
						|
	"/dev/null");              /* doesn't work if NULL?! */
 | 
						|
    NXClose (err_stream);
 | 
						|
    if (retval != 1)
 | 
						|
	Primitive_Error ("rld_load() failed");
 | 
						|
 | 
						|
    /* Grab the symbol table from the just-loaded file:
 | 
						|
     */
 | 
						|
    if (The_Symbols)
 | 
						|
	Free_Symbols (The_Symbols);
 | 
						|
    The_Symbols = Snarf_Symbols (hdr);
 | 
						|
    Call_Initializers (The_Symbols, 0, PR_CONSTRUCTOR);
 | 
						|
    Call_Initializers (The_Symbols, 0, PR_EXTENSION);
 | 
						|
    Enable_Interrupts;
 | 
						|
    Alloca_End;
 | 
						|
}
 | 
						|
 | 
						|
void Finit_Load () {
 | 
						|
}
 | 
						|
 | 
						|
void Fork_Load () {
 | 
						|
}
 |