鉴于
module.c
:
__attribute__((constructor)) int init_module() {
printf("Module init\n");
return 0;
}
__attribute__((destructor)) int deinit_module() {
printf("Module deinit\n");
return 0;
}
用
gcc -shared -fPIC -o module_A.so module.c
编译。
在此 so 文件上调用
dlopen()
,不会运行构造函数。
init_module()
函数的名称是罪魁祸首。将其更改为其他任何内容,例如 library_init()
,甚至进一步远离可能听起来像系统功能的任何内容:my_library_init()
。
似乎 https://man7.org/linux/man-pages/man2/init_module.2.html 是一个现有函数,所以链接器可能不允许您在加载库时意外调用它,只是因为您共享符号名称。