我的应用程序使用具有扩展API的静态库。 API可以从外部共享库或“本地”二进制文件中调用扩展初始化函数。也就是说,我可以将扩展初始化函数静态地包含在主要的可执行二进制文件中。
通过dlsym
调用来搜索本地函数,并且应该从主二进制文件动态导出init函数。在nm
通话之后:
nm -CD <binary>
应该列出我的初始化函数。
让我们假设init函数具有以下签名:
int init_func(INIT_STRUCT *);
此函数不能直接调用-只能通过dlsym
调用来加载。
所以我有两个相关的问题:
(我使用gcc
来编译和链接程序)
答案 0 :(得分:2)
不幸的是,GNU工具链的默认行为是默认情况下不从可执行文件中导出符号(与共享库相反,共享库默认情况下导出所有符号)。您可以使用大锤-rdynamic
标志,该标志告诉链接器从可执行文件中导出 all 个符号。侵入性较小的解决方案是在链接时通过-Wl,--dynamic-list
提供显式导出文件(请参见Clang sources中的示例用法)。
答案 1 :(得分:0)
好的,我将根据之前的评论发布答案。
要使所有功能动态导出:-rdynamic
。
要始终链接单个功能(即使未引用),则需要在链接行中添加-u<function>
。
要链接所有功能(甚至是未引用的功能),请使用--whole-archive
。要返回正常链接,请使用--no-whole-archive