【问题标题】:Symbols stay local and not exported properly符号保留在本地,未正确导出
【发布时间】:2015-03-16 12:38:02
【问题描述】:

一位同事给了我一个共享库的修改版本,他在其中添加了一个 GTK 小部件。
在检查共享库文件时,我看到新的小部件函数被定义为本地而不是全局。
我试图在函数上设置 GCC 的可见性属性(在声明本身之后,分号之前),它周围有 G_BEGIN_DECLS 和相同的公共头文件,并定义为库中正确导出的其他文件。
是否有我可能缺少的链接器命令行选项? gcc 使用的“可以”导出的文件列表,也许是导出函数的另一个定义?

【问题讨论】:

  • 我们需要一个高质量的水晶球来回答这个问题。尝试将您的问题简化为一个小示例(一个十行程序应该足以演示该问题),然后您可以发布它,并附上代码和命令行。
  • 如果我可以用一个编译命令行将我的问题减少到一个 10 行程序,那么我就可以用谷歌搜索每个命令行参数并自己找到问题。共享库是LXDE的libfm,是不是缩小了一点?
  • 是的,一旦减少,问题可能会很明显,这就是重点...首先,您应该只需要编译提供有问题的小部件的文件,这应该仍然有同样的问题。然后您可以开始删除该文件的大部分内容。不太可能的是,当您没有显示代码、没有命令行等时,有人会猜到失败的原因。

标签: c gcc gtk shared-libraries


【解决方案1】:

检查共享库文件时,我发现新的小部件函数被定义为本地而非全局。

默认情况下,共享库中的所有符号都会被导出(除非您使用-fvisibility=hiddenprotected 进行编译。

由于观察到您的符号是LOCAL,因此最好确定您的链接命令使用链接器版本脚本来控制符号可见性(隐藏除显式导出的符号之外的所有符号),并且您没有修改该版本脚本将您的函数添加到导出列表。

在链接命令行中查找-Wl,--version-script=...,并适当修改版本脚本。

另见this answer

【讨论】:

  • 谢谢,搜索版本帮助我找到了问题。我搜索了一个可见性标志,但不知道是否更改了默认值(因为我看到的文档是几年前的)。
【解决方案2】:

我发现该库使用正则表达式来过滤导出(-export-symbols-regex 开关),添加另一个正则表达式使符号正确导出,现在我一切都正确链接了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2015-06-04
    • 2022-06-16
    • 2023-04-10
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多