so共享库自带的初始化和范厨师
时间: 2023-11-29 13:07:20 浏览: 124
在 Linux 系统中,动态链接库(共享库)可以定义自己的初始化和清理函数,它们会在动态链接库加载和卸载时自动调用。
初始化函数的名称为 `_init`,其原型为:
```c
void _init(void);
```
清理函数的名称为 `_fini`,其原型为:
```c
void _fini(void);
```
当动态链接库加载时,动态链接器会自动调用 `_init` 函数;当动态链接库卸载时,动态链接器会自动调用 `_fini` 函数。
下面是一个简单的示例,演示如何在动态链接库中定义初始化和清理函数:
test.c 文件:
```c
#include <stdio.h>
__attribute__((constructor)) void init_func()
{
printf("test.so initialized\n");
}
__attribute__((destructor)) void uninit_func()
{
printf("test.so uninitialized\n");
}
void test_func()
{
printf("test_func called\n");
}
```
在上述代码中,我们使用 GCC 的 `__attribute__((constructor))` 和 `__attribute__((destructor))` 属性,分别将 `init_func` 和 `uninit_func` 函数定义为初始化函数和清理函数。在 `init_func` 函数中输出初始化信息,在 `uninit_func` 函数中输出清理信息。同时,我们定义了一个 `test_func` 函数,用于在主程序中调用。
编译命令:
```
gcc -shared -fPIC -o libtest.so test.c
```
在主程序中加载动态链接库,并调用其中的函数:
```c
#include <dlfcn.h>
int main()
{
void *handle = dlopen("./libtest.so", RTLD_NOW);
if (handle == NULL) {
fprintf(stderr, "dlopen failed: %s\n", dlerror());
return 1;
}
void (*test_func)();
test_func = (void (*)())dlsym(handle, "test_func");
if (test_func == NULL) {
fprintf(stderr, "dlsym failed: %s\n", dlerror());
dlclose(handle);
return 1;
}
test_func();
dlclose(handle);
return 0;
}
```
在上述代码中,我们使用 dlopen() 函数加载动态链接库,并使用 dlsym() 函数获取其中的函数指针。然后,我们调用动态链接库中的函数,完成相应的操作。在程序结束时,动态链接器会自动调用 `_fini` 函数来清理动态链接库。
阅读全文