【问题标题】:What is the gcc equivalent of the -qnoweakexp xlC compiler flag?-qnoweakexp xlC 编译器标志的 gcc 等效项是什么?
【发布时间】: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


【解决方案1】:

不完全等效,但对于您的用例应该足够了:-fvisibility-inlines-hidden。此选项将导致内联函数(如来自标头的 STL 定义)无法从库中导出。有关此检查的更多信息GCC wiki

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2010-12-05
    相关资源
    最近更新 更多