首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使C函数动态导出

如何使C函数动态导出
EN

Stack Overflow用户
提问于 2018-06-21 15:57:22
回答 2查看 898关注 0票数 0

我的应用程序使用带有扩展API的静态库。API能够从外部共享库或“本地”二进制文件中调用extension函数。也就是说,我可以静态地将扩展init函数包含到主可执行二进制文件中。

通过dlsym调用搜索本地函数,从主二进制动态导出init函数。这是按照nm调用进行的:

代码语言:javascript
代码运行次数:0
运行
复制
nm -CD <binary>

应该列出我的init功能。

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

代码语言:javascript
代码运行次数:0
运行
复制
int init_func(INIT_STRUCT *);

这个函数不是直接调用的-它只应该通过dlsym调用来加载。

因此,我有两个相关的问题:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-02 16:22:57

好的,我会根据之前的评论发布一个答案。

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

要始终链接单个函数(即使没有引用),需要将-u<function>添加到链接行中。

要链接所有函数(甚至未引用),请使用--whole-archive。若要返回到正常链接,请使用--no-whole-archive

票数 0
EN

Stack Overflow用户

发布于 2018-06-21 16:39:54

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50972892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档