如何使C函数动态导出

时间:2018-06-21 15:57:22

标签: gcc linker dynamic-linking

我的应用程序使用具有扩展API的静态库。 API可以从外部共享库或“本地”二进制文件中调用扩展初始化函数。也就是说,我可以将扩展初始化函数静态地包含在主要的可执行二进制文件中。

通过dlsym调用来搜索本地函数,并且应该从主二进制文件动态导出init函数。在nm通话之后:

nm -CD <binary>

应该列出我的初始化函数。

让我们假设init函数具有以下签名:

int init_func(INIT_STRUCT *);

此函数不能直接调用-只能通过dlsym调用来加载。

所以我有两个相关的问题:

  1. 如何强制链接器不从生成的二进制文件中排除此功能?
  2. 如何强制编译器/链接器动态导出此函数?

(我使用gcc来编译和链接程序)

2 个答案:

答案 0 :(得分:2)

不幸的是,GNU工具链的默认行为是默认情况下不从可执行文件中导出符号(与共享库相反,共享库默认情况下导出所有符号)。您可以使用大锤-rdynamic标志,该标志告诉链接器从可执行文件中导出 all 个符号。侵入性较小的解决方案是在链接时通过-Wl,--dynamic-list提供显式导出文件(请参见Clang sources中的示例用法)。

答案 1 :(得分:0)

好的,我将根据之前的评论发布答案。

要使所有功能动态导出:-rdynamic

要始终链接单个功能(即使未引用),则需要在链接行中添加-u<function>

要链接所有功能(甚至是未引用的功能),请使用--whole-archive。要返回正常链接,请使用--no-whole-archive