如何使C函数动态导出
How to make C function dynamically exported
我的应用程序使用具有扩展名 API 的静态库。 API 能够从外部共享库或 "local" 二进制文件调用扩展初始化函数。也就是说,我可以将扩展初始化函数静态地包含到主要的可执行二进制文件中。
本地函数由 dlsym
调用搜索,初始化函数应该从主二进制文件中动态导出。那是在 nm
调用之后:
nm -CD <binary>
应该列出我的初始化函数。
让我们假设 init 函数有这个签名:
int init_func(INIT_STRUCT *);
此函数不能直接调用 - 它只能通过 dlsym
调用加载。
所以我有两个相关的问题:
- 如何强制 linker 不从生成的二进制文件中排除此函数?
- 如何强制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
我的应用程序使用具有扩展名 API 的静态库。 API 能够从外部共享库或 "local" 二进制文件调用扩展初始化函数。也就是说,我可以将扩展初始化函数静态地包含到主要的可执行二进制文件中。
本地函数由 dlsym
调用搜索,初始化函数应该从主二进制文件中动态导出。那是在 nm
调用之后:
nm -CD <binary>
应该列出我的初始化函数。
让我们假设 init 函数有这个签名:
int init_func(INIT_STRUCT *);
此函数不能直接调用 - 它只能通过 dlsym
调用加载。
所以我有两个相关的问题:
- 如何强制 linker 不从生成的二进制文件中排除此函数?
- 如何强制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