告诉动态链接器调用我的函数而不是另一个共享库中的函数
Tell Dynamic Linker To Call My Function Instead of Function In Another Shared Library
我有一个闭源库,它有一个我需要通过 dlsym 调用的函数(它是我正在编写的驱动程序的一部分,控制硬件的唯一方法是调用这个闭源库中的函数)它引用另一个库中的另一个函数来加载配置信息。是否可以让我在库中调用的函数调用我自己的函数来加载配置信息?这是我正在尝试做的代码说明(为简洁起见,我跳过了变量声明):
int main(int argc, char** argv)
{
library = dlopen("/usr/local/lib/libuLinux_hal.so", RTLD_LAZY);
func_point = dlsym(library, "ec_sys_set_fan_speed");
func_point(arg1, arg2); // Makes a call to Ini_Conf_Get_Field_Int and does other stuff
}
int Ini_Conf_Get_Field_Int(int arg)
{
// Do stuff
return 0;
}
libuLinux_hal.so 库中的 ec_sys_set_fan_speed 函数调用名为 Ini_Conf_Get_Field_Int 的函数(位于另一个库中)。我想以某种方式告诉动态链接器在我的程序中调用我自己的 Ini_Conf_Get_Field_Int 函数。这可能吗?
编辑:根据 Employed Russian 的回答,我将编译语句修改为:
cc -o qnap-ec qnap-ec-helper.c -Wall -O2 -ldl -Wl,--export-dynamic-symbol=Ini_Conf_Get_Field_Int
但是我收到以下错误:
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic-symbol=Ini_Conf_Get_Field_Int; defaulting to 00000000000011c0
如果有帮助,我的 ld 版本信息是
GNU ld (GNU Binutils for Ubuntu) 2.34
Is this possible?
是的。
您需要做 两件事 才能完成这项工作:
- 在您的主程序中定义
Ini_Conf_Get_Field_Int()
函数(您已经在这样做)并且
- 在动态符号 table 中使该函数 导出 (在
nm -D a.out | grep ' Ini_Conf_Get_Field_Int$'
的输出中可见)。
您可能缺少第 2 步。
要完成第 2 步,在链接主执行程序时使用 -Wl,--export-dynamic
标志table。
如果您的链接器支持 --export-dynamic-symbol
标志,更好的解决方案是使用 -Wl,--export-dynamic-symbol,Ini_Conf_Get_Field_Int
.
我有一个闭源库,它有一个我需要通过 dlsym 调用的函数(它是我正在编写的驱动程序的一部分,控制硬件的唯一方法是调用这个闭源库中的函数)它引用另一个库中的另一个函数来加载配置信息。是否可以让我在库中调用的函数调用我自己的函数来加载配置信息?这是我正在尝试做的代码说明(为简洁起见,我跳过了变量声明):
int main(int argc, char** argv)
{
library = dlopen("/usr/local/lib/libuLinux_hal.so", RTLD_LAZY);
func_point = dlsym(library, "ec_sys_set_fan_speed");
func_point(arg1, arg2); // Makes a call to Ini_Conf_Get_Field_Int and does other stuff
}
int Ini_Conf_Get_Field_Int(int arg)
{
// Do stuff
return 0;
}
libuLinux_hal.so 库中的 ec_sys_set_fan_speed 函数调用名为 Ini_Conf_Get_Field_Int 的函数(位于另一个库中)。我想以某种方式告诉动态链接器在我的程序中调用我自己的 Ini_Conf_Get_Field_Int 函数。这可能吗?
编辑:根据 Employed Russian 的回答,我将编译语句修改为:
cc -o qnap-ec qnap-ec-helper.c -Wall -O2 -ldl -Wl,--export-dynamic-symbol=Ini_Conf_Get_Field_Int
但是我收到以下错误:
/usr/bin/ld: warning: cannot find entry symbol xport-dynamic-symbol=Ini_Conf_Get_Field_Int; defaulting to 00000000000011c0
如果有帮助,我的 ld 版本信息是
GNU ld (GNU Binutils for Ubuntu) 2.34
Is this possible?
是的。
您需要做 两件事 才能完成这项工作:
- 在您的主程序中定义
Ini_Conf_Get_Field_Int()
函数(您已经在这样做)并且 - 在动态符号 table 中使该函数 导出 (在
nm -D a.out | grep ' Ini_Conf_Get_Field_Int$'
的输出中可见)。
您可能缺少第 2 步。
要完成第 2 步,在链接主执行程序时使用 -Wl,--export-dynamic
标志table。
如果您的链接器支持 --export-dynamic-symbol
标志,更好的解决方案是使用 -Wl,--export-dynamic-symbol,Ini_Conf_Get_Field_Int
.