如何使C函数动态导出

How to make C function dynamically exported

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

本地函数由 dlsym 调用搜索,初始化函数应该从主二进制文件中动态导出。那是在 nm 调用之后:

nm -CD <binary>

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

让我们假设 init 函数有这个签名:

int init_func(INIT_STRUCT *);

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

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

  1. 如何强制 linker 不从生成的二进制文件中排除此函数?
  2. 如何强制compiler/linker动态导出这个函数?

(我使用 gcc 编译和 link 我的程序)

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

好的,我会post根据之前的评论回答。

动态导出所有函数:-rdynamic.

要始终对单个函数进行 linked(即使未被引用),您需要将 -u<function> 添加到 link 行。

到link 所有函数(甚至未引用的函数)都使用--whole-archive。要 return 到正常 linking 使用 --no-whole-archive