我写了一个程序,它加载a.so
(通过dlopen
),并在a.so
内,dlopen
b.so
。 b.so
使用a.so
中实现的一些功能。我在运行时遇到了这个错误:
symbol lookup error, undefined symbol
在nm a.so
之后,我得到了这个未定义的符号,类型为" T"。
有人可以帮忙吗?
答案 0 :(得分:2)
在dlopen a.so时可以使用RTLD_GLOBAL标志,然后a.so定义的符号将可用于后续加载库的符号解析。
答案 1 :(得分:0)
使用b.so
动态加载dlopen()
时,它不会知道调用程序可执行文件中的符号(或您的案例中的共享对象)。因此,您将收到“未定义的符号”错误。调用层次结构在这里很重要,一旦加载它就不会成为所有符号的大池。
为了实现此功能,您可以在b.so
中定义两个函数,在a.so
中定义一个函数:
然后,在a.so
中你将有一个函数包装这个未定义的符号,让我们调用这个函数wrapper()
。然后在a.so
中你会:
b.so
。b.so
调用注册函数,将其作为参数wrapper()
(在a.so
中定义),因为它需要回调。b.so
中的第二个功能,该功能实际上会调用wrapper()
。然后你得到了你想要的东西 - 执行wrapper()
并且不调用a.so
中b.so
中定义的函数。