/programs/develop/libraries/menuetlibc/programs/ld-dll/Makefile |
---|
0,0 → 1,6 |
OUTFILE = ld-dll |
OBJS = kernel.o dll_list.o |
CFLAGS = -O2 -fomit-frame-pointer |
LIBS = -lmcoff |
include $(MENUETDEV)/makefiles/Makefile_for_program |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/programs/develop/libraries/menuetlibc/programs/ld-dll/dll_desc.h |
---|
0,0 → 1,9 |
typedef struct { |
char dll_name[1]; |
} dll_req_entry_t; |
typedef struct { |
dll_req_entry_t req_list[0]; |
} dll_req_t; |
#define DLL_REQ_LIST_NAME "__DLL_REQUIRE_LIST__" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/programs/develop/libraries/menuetlibc/programs/ld-dll/dll_list.c |
---|
0,0 → 1,119 |
#include"ld-dll.h" |
#define MAX_DLL 32 |
static dll_t dll_list[MAX_DLL]; |
SYMENT * dl_find_dll_symbol(char * name,dll_t ** xdll) |
{ |
dll_t * dll; |
SYMENT * __ret; |
int i; |
for(dll=dll_list+0,i=0;i<MAX_DLL;i++,dll++) |
{ |
if(dll->obj) |
{ |
__ret=find_coff_symbol(dll->obj,name); |
if(__ret) |
{ |
*xdll=dll; |
return __ret; |
} |
} |
} |
*xdll=(dll_t *)NULL; |
return 0; |
} |
unsigned long dl_get_ref(char * symname) |
{ |
dll_t * dll; |
SYMENT * sym=dl_find_dll_symbol(symname,&dll); |
if(!sym && !dll) return 0; |
return sym->e_value+dll->obj->co_sections[sym->e_scnum-1].s_scnptr+dll->obj->co_loadaddr; |
} |
void init_dll(void) |
{ |
int i; |
for(i=0;i<MAX_DLL;i++) |
dll_list[i].obj=NULL; |
} |
dll_t * load_dll(char * name) |
{ |
dll_t * p; |
int i; |
dprintf("Load dll '%s'\n",name); |
for(i=0,p=dll_list+0;i<MAX_DLL;i++,p++) |
{ |
if(!p->obj) |
{ |
p->obj=mcoff_load_file(name); |
p->d_name=strdup(name); |
if(!p->obj) return NULL; |
return p; |
} |
} |
return NULL; |
} |
dll_t * find_dll(char * name) |
{ |
dll_t * p; |
int i,j=strlen(name); |
for(i=0,p=dll_list+0;i<MAX_DLL;i++,p++) |
{ |
if(p->obj) |
{ |
if(strlen(p->d_name)==j && |
!strncmp(name,p->d_name,j)) return p; |
} |
} |
return NULL; |
} |
int dll_symlookupfn(coffobj_t * obj,unsigned long * sym_val, |
unsigned long * sym_sect,int index) |
{ |
SYMENT * symtab; |
unsigned long lookup; |
char xname[9]; |
char * symnamep; |
symtab=obj->co_symtab+index; |
*sym_sect=(unsigned long)symtab->e_scnum; |
if(symtab->e_scnum>0) |
{ |
*sym_val=symtab->e_value; |
return 0; |
} |
if(symtab->e.e.e_zeroes==0) |
{ |
symnamep=(char *)(((long)obj->co_strtab)+symtab->e.e.e_offset); |
} else { |
symnamep=(char *)symtab->e.e_name; |
memset(xname,0,9); |
memcpy(xname,symnamep,8); |
symnamep=xname; |
} |
lookup=kexport_lookup(symnamep); |
if(lookup) |
{ |
*sym_val=lookup; |
return 0; |
} |
lookup=dl_get_ref(symnamep); |
if(!lookup) return -1; |
*sym_val=lookup; |
return 0; |
} |
int relocate_dlls(void) |
{ |
int i; |
dll_t * dll; |
for(i=0,dll=dll_list+0;i<MAX_DLL;i++,dll++) |
if(dll->obj) |
if(relocate_coff_file(dll->obj,dll_symlookupfn)) return -1; |
return 0; |
} |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/programs/develop/libraries/menuetlibc/programs/ld-dll/kernel.c |
---|
0,0 → 1,37 |
#include"ld-dll.h" |
#define EX(x) \ |
{ "_"#x , (unsigned long)&x } |
extern void * sbrk(int); |
extern void _exit(int); |
static struct { |
char * name; |
unsigned long ptr; |
} kextable[]={ |
EX(sbrk), |
EX(errno), |
EX(malloc), |
EX(free), |
EX(realloc), |
EX(atexit), |
EX(exit), |
EX(getenv), |
EX(_exit), |
}; |
#define NR_KEX (sizeof(kextable)/sizeof(kextable[0])) |
unsigned long kexport_lookup(char * name) |
{ |
int i,j; |
j=strlen(name); |
for(i=0;i<NR_KEX;i++) |
{ |
if(strlen(kextable[i].name)==j && |
!strncmp(kextable[i].name,name,j)) return kextable[i].ptr; |
} |
return 0; |
} |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/programs/develop/libraries/menuetlibc/programs/ld-dll/ld-dll.h |
---|
0,0 → 1,25 |
#ifndef __LD_DLL_H |
#define __LD_DLL_H |
#include<stdio.h> |
#include<stdlib.h> |
#include<string.h> |
#include<errno.h> |
#include<mcoff/mcoff.h> |
unsigned long kexport_lookup(char * name); |
typedef struct { |
coffobj_t * obj; |
void (* entry_point)(void); |
char * d_name; |
} dll_t; |
SYMENT * dl_find_dll_symbol(char * name,dll_t ** xdll); |
unsigned long dl_get_ref(char * symname); |
void init_dll(void); |
dll_t * load_dll(char * name); |
int relocate_dlls(void); |
dll_t * find_dll(char * name); |
#endif |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/programs/develop/libraries/menuetlibc/programs/ld-dll/main.c |
---|
0,0 → 1,54 |
#include"ld-dll.h" |
#include"dll_desc.h" |
dll_t * main_program; |
static char * std_dll_paths[]={ |
"/rd/1/", |
"/hd/1/menuetos/", |
"/hd/1/menuetos/dll/", |
"./", |
NULL |
}; |
static char dll_name_buf[1024]; |
dll_t * do_load_dll( |
void main(void) |
{ |
init_dll(); |
main_program=load_dll("/rd/1/test.app"); |
if(!main_program) |
{ |
dprintf("Main load failed\n"); |
exit(-1); |
} |
{ dll_t * tmp; |
if(!(tmp=load_dll("/rd/1/vcrt.dll"))) |
{ |
dprintf("Unable to load vcrt.dll\n"); |
exit(-1); |
} |
dprintf("Looking for entry point\n"); |
tmp->entry_point=(void *)mcoff_get_ref(tmp->obj,"_DllMain"); |
if(tmp->entry_point) tmp->entry_point(); |
if(!(tmp=load_dll("MOSKRNL.SO"))) |
if(!(tmp=load_dll("/RD/1/MOSKRNL.SO"))) |
if(!(tmp=load_dll("/HD/1/MENUETOS/MOSKRNL.SO"))) |
{ |
dprintf("Unable to load moskrnl.so\n"); |
exit(-1); |
} |
tmp->entry_point=(void *)mcoff_get_ref(tmp->obj,"_DllMain"); |
if(tmp->entry_point) tmp->entry_point(); |
} |
relocate_dlls(); |
main_program->entry_point=(void *)mcoff_get_ref(main_program->obj,"_main"); |
if(!main_program->entry_point) |
{ |
dprintf("Failed to find main program entry point\n"); |
exit(-1); |
} |
main_program->entry_point(); |
exit(0); |
} |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |