找不到另一个动态库中定义的符号

时间:2017-08-10 04:35:55

标签: c linux gcc

我写了一个程序,它加载a.so(通过dlopen),并在a.so内,dlopen b.sob.so使用a.so中实现的一些功能。我在运行时遇到了这个错误:

symbol lookup error, undefined symbol

nm a.so之后,我得到了这个未定义的符号,类型为" T"。 有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

在dlopen a.so时可以使用RTLD_GLOBAL标志,然后a.so定义的符号将可用于后续加载库的符号解析。

答案 1 :(得分:0)

使用b.so动态加载dlopen()时,它不会知道调用程序可执行文件中的符号(或您的案例中的共享对象)。因此,您将收到“未定义的符号”错误。调用层次结构在这里很重要,一旦加载它就不会成为所有符号的大池。

为了实现此功能,您可以在b.so中定义两个函数,在a.so中定义一个函数:

  1. 接收回调功能的功能(并保存/注册)。
  2. 执行回调函数的函数(之前已注册)。
  3. 然后,在a.so中你将有一个函数包装这个未定义的符号,让我们调用这个函数wrapper()。然后在a.so中你会:

    1. 动态加载b.so
    2. b.so调用注册函数,将其作为参数wrapper()(在a.so中定义),因为它需要回调。
    3. 执行b.so中的第二个功能,该功能实际上会调用wrapper()
    4. 然后你得到了你想要的东西 - 执行wrapper()并且不调用a.sob.so中定义的函数。