我的应用程序使用带有扩展API的静态库。API能够从外部共享库或“本地”二进制文件中调用extension函数。也就是说,我可以静态地将扩展init函数包含到主可执行二进制文件中。
通过dlsym
调用搜索本地函数,从主二进制动态导出init函数。这是按照nm
调用进行的:
nm -CD <binary>
应该列出我的init功能。
让我们假设init函数具有以下签名:
int init_func(INIT_STRUCT *);
这个函数不是直接调用的-它只应该通过dlsym
调用来加载。
因此,我有两个相关的问题:
(我使用gcc
编译和链接我的程序)
发布于 2018-08-02 08:22:57
好的,我会根据之前的评论发布一个答案。
使所有函数动态导出:-rdynamic
。
要始终链接单个函数(即使没有引用),需要将-u<function>
添加到链接行中。
要链接所有函数(甚至未引用),请使用--whole-archive
。若要返回到正常链接,请使用--no-whole-archive
发布于 2018-06-21 08:39:54
不幸的是,GNU工具链的默认行为是默认不从可执行文件导出符号(与默认导出所有符号的共享库相反)。您可以使用一个大锤-rdynamic
标志,它告诉链接器从您的可执行文件导出所有符号。一个不那么麻烦的解决方案是在链接时通过-Wl,--dynamic-list
提供显式导出文件(参见Clang源中的示例用法)。
https://stackoverflow.com/questions/50972892
复制相似问题