Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1881 → Rev 1882

/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