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:
Magomed Kostoev (mkostoevr) 2020-04-30 08:47:52 +00:00
parent 7fa0f1b5ea
commit 46051e254f
4 changed files with 129 additions and 18 deletions

View File

@ -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=

View 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);
}

View 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

View File

@ -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