【发布时间】:2017-04-04 18:47:45
【问题描述】:
我们目前正在从 AIX 和 xlC 编译器迁移到 Linux 和 GNU 工具链。在我们的 C/C++ 编译过程中,我们使用 -qnoweakexp 编译器标志来禁用弱符号的导出。请查看xlc compiler reference。
我在gcc Options Summary 中找不到等效的编译器标志。最终目标是没有弱符号被导出到我们的编译目标。我能找到的最接近的 gcc 标志是 -fno-weak,但是 gcc manual 指出此标志不打算在生产代码中使用。
背景:我们需要将我们正在使用的框架的一些 C 库与我们的编译目标链接,这些库导出一些相同的弱符号,我们自己的代码不会使用这些符号这面旗帜。这导致分段错误偶尔发生。这些符号显然是为我们正在使用的一些 STL 容器生成的,例如:
std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >::_Clear()
即这不是某些符号在源代码中被明确注释为弱的情况,因此无法通过删除注释来解决问题。
【问题讨论】:
-
那不是 C,而是 C++。它们是不同的语言!
-
您确定 a) 您的 C++ 编译器为 STL 生成 weak 符号(GCC 的默认值是强的),并且 b) 错位的 C++ 符号与 C 符号发生冲突从其他图书馆?那些库也是你编译的吗?你能修改它们的来源吗?
-
另外,你看过
-fvisibility=hidden吗? (这仅适用于 C 库,如果您可以控制构建它们) -
在 AIX 上,我们使用相同的编译标志,
-qnoweakexp用于 C 代码(使用 xlc 编译)以及 C++ 代码(使用 xlC 编译),因此我认为会有类似的gcc 和 g++ 的编译标志,它可以控制弱符号的导出。我们目前正在检查 linux 上有问题的符号的弱点,resp。如果它们仍然与我们正在使用的框架的导出符号发生冲突。不幸的是,我们需要链接的库不是我们编译的,我们甚至无法去除有问题的符号。 -
所以我们已经从链接的 C 库以及我们编译的目标中导出了所有符号,对所有标记为弱的符号名称进行了解码,并比较了结果列表 - 它似乎匹配。在这种情况下,在 AIX 下,我们对每一个这样的弱符号都有错误,说它是重复的符号。但是在带有 g++ 的 linux 下,我们没有收到任何错误(使用
-Wall选项打开警告,会列出故意创建的重复符号问题)。我还应该检查什么以合理地确定我们不会出现段错误?我在哪里可以了解更多关于他的信息?
标签: gcc weak-symbol