Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7847 | Boppan | 1 | #include |
2 | |||
3 | #include |
||
4 | #include |
||
5 | #include |
||
6 | |||
7 | typedef struct { |
||
8 | char *name; |
||
9 | void *ptr; |
||
10 | } KosExp; |
||
11 | |||
12 | typedef struct { |
||
13 | void **importNames; |
||
14 | char * libraryName; |
||
15 | } KosImp; |
||
16 | |||
17 | static const char *__error; |
||
18 | |||
19 | static int stdcall dll_Load(KosImp *importTable); |
||
20 | |||
21 | static int stdcall dll_Load(KosImp *importTableEntry) { |
||
22 | for (; importTableEntry->importNames; importTableEntry++) { |
||
23 | char libPath[256] = "/sys/lib/"; |
||
24 | KosExp *exports = NULL; |
||
25 | void **libImports = importTableEntry->importNames; |
||
26 | |||
27 | strcat(libPath, importTableEntry->libraryName); |
||
28 | if (!(exports = dlopen(libPath, 0))) { return 1; } |
||
29 | for (; *libImports; libImports++) { |
||
30 | if (!(*libImports = dlsym(exports, *libImports))) { return 1; } |
||
31 | } |
||
32 | } |
||
33 | return 0; |
||
34 | } |
||
35 | |||
36 | // https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlopen.html |
||
37 | // Current implementation fully ignores "mode" parameter |
||
38 | void *dlopen(const char *name, int mode) { |
||
39 | KosExp *exports = NULL; |
||
40 | |||
41 | // загрузить либу сискаллом |
||
42 | asm volatile ("int $0x40":"=a"(exports):"a"(68), "b"(19), "c"(name)); |
||
43 | if (!exports) { |
||
44 | char libPath[256] = "/sys/lib/"; |
||
45 | |||
46 | strcat(libPath, name); |
||
47 | asm volatile ("int $0x40":"=a"(exports):"a"(68), "b"(19), "c"(libPath)); |
||
48 | if (!exports) { |
||
49 | __error = "Library not found in \"/sys/lib/\" nor current folder"; |
||
50 | return NULL; |
||
51 | } |
||
52 | } |
||
53 | // Вызвать что-нибудь что начинается с "lib_" |
||
54 | for (KosExp *export = exports; export->name; export++) { |
||
55 | if (!memcmp(export->name, "lib_", 4)) { |
||
56 | asm volatile ( |
||
57 | "call *%4" :: |
||
58 | "a"(sysmalloc), |
||
59 | "b"(sysfree), |
||
60 | "c"(sysrealloc), |
||
61 | "d"(dll_Load), |
||
62 | "r"(export->ptr)); |
||
63 | } |
||
64 | } |
||
65 | return exports; |
||
66 | } |
||
67 | |||
68 | // https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlsym.html |
||
69 | void *dlsym(void *handle, const char *name) { |
||
70 | KosExp *exp = handle; |
||
71 | |||
72 | for (; exp->name; exp++) { |
||
73 | if (!strcmp(exp->name, name)) { |
||
74 | return exp->ptr; |
||
75 | } |
||
76 | } |
||
77 | __error = "Symbol not found"; |
||
78 | return NULL; |
||
79 | } |
||
80 | |||
81 | // https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlclose.html |
||
82 | int dlclose(void *handle) { |
||
83 | return 0; |
||
84 | } |
||
85 | |||
86 | // https://pubs.opengroup.org/onlinepubs/007908799/xsh/dlerror.html |
||
87 | char *dlerror(void) { |
||
88 | return strdup(__error); |
||
89 | } |