forked from KolibriOS/kolibrios
Add <dlfcn.h> functions to libck.a (these functions initialize COFF library the same way as dll.inc)
git-svn-id: svn://kolibrios.org@7847 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
7fa0f1b5ea
commit
46051e254f
@ -6,11 +6,11 @@ echo ####################################################
|
||||
rem #### CONFIG SECTION ####
|
||||
set LIBNAME=libck.a
|
||||
set INCLUDE=include
|
||||
set CC=kos32-tcc
|
||||
set CC=kos32-tcc
|
||||
set CFLAGS=-c -nostdinc -DGNUC -I"%cd%\%INCLUDE%" -Wall
|
||||
set AR=kos32-ar
|
||||
set ASM=fasm
|
||||
set dirs=stdio memory kolibrisys string stdlib math
|
||||
set dirs=stdio memory kolibrisys string stdlib math dlfcn
|
||||
rem #### END OF CONFIG SECTION ####
|
||||
|
||||
set objs=
|
||||
|
89
programs/develop/ktcc/trunk/libc/dlfcn/dlfcn.c
Normal file
89
programs/develop/ktcc/trunk/libc/dlfcn/dlfcn.c
Normal file
@ -0,0 +1,89 @@
|
||||
#include <kos32sys1.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
void *ptr;
|
||||
} KosExp;
|
||||
|
||||
typedef struct {
|
||||
void **importNames;
|
||||
char * libraryName;
|
||||
} KosImp;
|
||||
|
||||
static const char *__error;
|
||||
|
||||
static int stdcall dll_Load(KosImp *importTable);
|
||||
|
||||
static int stdcall dll_Load(KosImp *importTableEntry) {
|
||||
for (; importTableEntry->importNames; importTableEntry++) {
|
||||
char libPath[256] = "/sys/lib/";
|
||||
KosExp *exports = NULL;
|
||||
void **libImports = importTableEntry->importNames;
|
||||
|
||||
strcat(libPath, importTableEntry->libraryName);
|
||||
if (!(exports = dlopen(libPath, 0))) { return 1; }
|
||||
for (; *libImports; libImports++) {
|
||||
if (!(*libImports = dlsym(exports, *libImports))) { return 1; }
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlopen.html
|
||||
// Current implementation fully ignores "mode" parameter
|
||||
void *dlopen(const char *name, int mode) {
|
||||
KosExp *exports = NULL;
|
||||
|
||||
// загрузить либу сискаллом
|
||||
asm volatile ("int $0x40":"=a"(exports):"a"(68), "b"(19), "c"(name));
|
||||
if (!exports) {
|
||||
char libPath[256] = "/sys/lib/";
|
||||
|
||||
strcat(libPath, name);
|
||||
asm volatile ("int $0x40":"=a"(exports):"a"(68), "b"(19), "c"(libPath));
|
||||
if (!exports) {
|
||||
__error = "Library not found in \"/sys/lib/\" nor current folder";
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
// Вызвать что-нибудь что начинается с "lib_"
|
||||
for (KosExp *export = exports; export->name; export++) {
|
||||
if (!memcmp(export->name, "lib_", 4)) {
|
||||
asm volatile (
|
||||
"call *%4" ::
|
||||
"a"(sysmalloc),
|
||||
"b"(sysfree),
|
||||
"c"(sysrealloc),
|
||||
"d"(dll_Load),
|
||||
"r"(export->ptr));
|
||||
}
|
||||
}
|
||||
return exports;
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlsym.html
|
||||
void *dlsym(void *handle, const char *name) {
|
||||
KosExp *exp = handle;
|
||||
|
||||
for (; exp->name; exp++) {
|
||||
if (!strcmp(exp->name, name)) {
|
||||
return exp->ptr;
|
||||
}
|
||||
}
|
||||
__error = "Symbol not found";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlclose.html
|
||||
int dlclose(void *handle) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlerror.html
|
||||
char *dlerror(void) {
|
||||
return strdup(__error);
|
||||
}
|
14
programs/develop/ktcc/trunk/libc/include/dlfcn.h
Normal file
14
programs/develop/ktcc/trunk/libc/include/dlfcn.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef _DLFCN_H
|
||||
#define _DLFCN_H
|
||||
|
||||
#define RTLD_LAZY 0x00001
|
||||
#define RTLD_NOW 0x00002
|
||||
#define RTLD_GLOBAL 0x00100
|
||||
#define RTLD_LOCAL 0
|
||||
|
||||
int dlclose(void *handle);
|
||||
char *dlerror(void);
|
||||
void *dlopen(const char *name, int mode);
|
||||
void *dlsym(void *restrict handle, const char *restrict name);
|
||||
|
||||
#endif
|
@ -9,30 +9,38 @@ public sysrealloc
|
||||
align 4
|
||||
sysmalloc:
|
||||
push ebx
|
||||
mov eax,68
|
||||
mov ebx,12
|
||||
mov ecx,[esp+8] ;size
|
||||
int 0x40
|
||||
push ecx
|
||||
mov eax,68
|
||||
mov ebx,12
|
||||
mov ecx,[esp+12] ;size
|
||||
int 0x40
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 4
|
||||
ret 4
|
||||
|
||||
align 4
|
||||
sysfree:
|
||||
push ebx
|
||||
mov eax,68
|
||||
mov ebx,13
|
||||
mov ecx,[esp+8]
|
||||
int 0x40
|
||||
push ecx
|
||||
mov eax,68
|
||||
mov ebx,13
|
||||
mov ecx,[esp+12]
|
||||
int 0x40
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 4
|
||||
ret 4
|
||||
|
||||
align 4
|
||||
sysrealloc:
|
||||
push ebx
|
||||
mov ebx,20
|
||||
mov eax,68
|
||||
mov edx,[esp+8] ; pointer
|
||||
mov ecx,[esp+12] ; size
|
||||
int 0x40
|
||||
push ecx
|
||||
push edx
|
||||
mov eax,68
|
||||
mov ebx,20
|
||||
mov ecx,[esp+20] ; size
|
||||
mov edx,[esp+16] ; pointer
|
||||
int 0x40
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
ret 8
|
||||
ret 8
|
||||
|
Loading…
Reference in New Issue
Block a user