Boost.Exception 符号出现在“nm”输出中是啥意思?它们会导致 ODR 违规吗?

Posted

技术标签:

【中文标题】Boost.Exception 符号出现在“nm”输出中是啥意思?它们会导致 ODR 违规吗?【英文标题】:What does it mean when Boost.Exception symbols show up in 'nm' output? Will they cause ODR violations?Boost.Exception 符号出现在“nm”输出中是什么意思?它们会导致 ODR 违规吗? 【发布时间】:2014-11-18 21:38:35 【问题描述】:

我在第 3 方静态链接库上运行它。我认为由于它是一个仅标头库(某些 MSVC 版本除外),它不会出现。也许我误解了 nm 应该显示的内容。我真正想知道的是,如果我链接到使用不同版本的 Boost 编译的库,它们是否会导致 ODR 违规。

查看输出:http://codepad.org/kJ86hiQg

一个小样本:

    W boost::exception_detail::clone_base::~clone_base()
    W boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >::~clone_impl()
    W boost::exception_detail::cloning_base::~cloning_base()
    W boost::exception_detail::counted_base::~counted_base()
    W boost::exception::~exception()

【问题讨论】:

【参考方案1】:

这些似乎是弱符号。

http://en.wikipedia.org/wiki/Weak_symbol


更新 ODR 违规首先不是由重复的链接器记录引起的。当编译器使用不同的同名符号定义时,它们引起

因此,简短的回答是: nm 显示这些弱符号不会 导致或表明 ODR 违规。但是,这些符号很弱这一事实并不意味着也不可能违反 ODR。

事实上,我认为完全有可能在没有此类符号的情况下出现 ODR 违规(例如,当具有相同重整名称的结构的布局由于不同的对齐或打包选项而不同时)跨翻译单元。

【讨论】:

抱歉,我已经修改了问题,以了解我真正想知道的:它是否会导致 ODR 违规。 @MattChambers 我也扩展了答案。 我试图了解使用 Boost.Exception 提供的(可能)不同的标头结构定义的库(我静态链接到的)是否会导致 ODR,如果实际上那些定义不同。当然,如果在客户端代码和库之间传递定义不同的对象,那就是 ABI 问题。但是,如果库和我的代码只在内部使用这些构造,那么还有 ODR 吗?我知道使用像 Boost.Regex 这样的编译库是可以的。 如果代码不混合(例如,如果您遵守 "Hourglass API interfaces" 准则),则没有问题。考虑一下:在最坏的情况下,您会从链接器收到重复的符号错误/警告,对吧?我想这些符号是有原因的。

以上是关于Boost.Exception 符号出现在“nm”输出中是啥意思?它们会导致 ODR 违规吗?的主要内容,如果未能解决你的问题,请参考以下文章

跨线程复制 boost::exception 崩溃

找不到 dyld 符号,但 nm 报告其他情况(OS X 更新问题)

boost exception

nm - 显示在 .so 文件中声明符号的文件

nm 命令中的“符号值”是啥意思?

nm 符号名称略有不同