mirror of
https://github.com/Leonmmcoset/cleonos.git
synced 2026-04-24 11:14:01 +00:00
动态链接库+修复神秘光标问题
This commit is contained in:
48
cleonos/c/apps/dltest_main.c
Normal file
48
cleonos/c/apps/dltest_main.c
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
|
||||
typedef unsigned long long u64;
|
||||
typedef u64 (*dl_math2_fn)(u64, u64);
|
||||
typedef u64 (*dl_void_fn)(void);
|
||||
|
||||
int cleonos_app_main(int argc, char **argv, char **envp) {
|
||||
const char *lib_path = "/shell/libdemo.elf";
|
||||
void *handle;
|
||||
dl_math2_fn add_fn;
|
||||
dl_math2_fn mul_fn;
|
||||
dl_void_fn hello_fn;
|
||||
|
||||
(void)envp;
|
||||
|
||||
if (argc > 1 && argv != (char **)0 && argv[1] != (char *)0 && argv[1][0] != '\0') {
|
||||
lib_path = argv[1];
|
||||
}
|
||||
|
||||
handle = dlopen(lib_path, 0);
|
||||
if (handle == (void *)0) {
|
||||
(void)printf("[dltest] dlopen failed: %s\n", lib_path);
|
||||
return 1;
|
||||
}
|
||||
|
||||
add_fn = (dl_math2_fn)dlsym(handle, "cleonos_libdemo_add");
|
||||
mul_fn = (dl_math2_fn)dlsym(handle, "cleonos_libdemo_mul");
|
||||
hello_fn = (dl_void_fn)dlsym(handle, "cleonos_libdemo_hello");
|
||||
|
||||
if (add_fn == (dl_math2_fn)0 || mul_fn == (dl_math2_fn)0 || hello_fn == (dl_void_fn)0) {
|
||||
(void)puts("[dltest] dlsym failed");
|
||||
(void)dlclose(handle);
|
||||
return 2;
|
||||
}
|
||||
|
||||
(void)hello_fn();
|
||||
(void)printf("[dltest] add(7, 35) = %llu\n", add_fn(7ULL, 35ULL));
|
||||
(void)printf("[dltest] mul(6, 9) = %llu\n", mul_fn(6ULL, 9ULL));
|
||||
|
||||
if (dlclose(handle) != 0) {
|
||||
(void)puts("[dltest] dlclose failed");
|
||||
return 3;
|
||||
}
|
||||
|
||||
(void)puts("[dltest] PASS");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user