告诉动态链接器调用我的函数而不是另一个共享库中的函数

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?

是的。

您需要做 两件事 才能完成这项工作:

  1. 在您的主程序中定义 Ini_Conf_Get_Field_Int() 函数(您已经在这样做)并且
  2. 在动态符号 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.