在当前 Linux 发行版上打包 C++11 软件是不是安全?

Posted

技术标签:

【中文标题】在当前 Linux 发行版上打包 C++11 软件是不是安全?【英文标题】:Is it safe to package C++11 software on current Linux distributions?在当前 Linux 发行版上打包 C++11 软件是否安全? 【发布时间】:2015-01-29 20:02:45 【问题描述】:

作为 Linux 发行版的下游维护者,我通常维护的一些包开始在其代码库中使用 C++11 功能。它们都依赖于 Linux 发行版打包的不同库。

Problems with the ABI 可能在将 C++11 代码与 C++98 和 AFAIK 混合时出现,当前大多数主要 Linux 发行版在编译软件生成包时默认不启用 C++11 标志。

问题是:主要的 Linux 发行版是如何处理 C++11 代码的输入的?在使用系统库时,是否有适当的方法来检查或避免 ABI 的这些问题?

谢谢。

【问题讨论】:

您能否提供有关“当前大多数主要 Linux 发行版都未启用 C++11 标志”的参考? 你在混合 g++ 版本吗?如果不是,我相信这个问题在 GCC 4.8 中已修复 @Mgetz 4.8.1 仍然至少提到了一个问题,而 4.8.2 提到了一些非常小的问题。 @Puppy 你看到 Yakk 提到的例子了吗?也许您应该要求它,而不是因为“没有必要”而称其为 BS。没有什么是必要的。然而它被允许发生。 (在实践层面上存在现实。无论标准是否愿意) 假设只有那个“意外”。由于没有管理 ABI 和 ABI 互操作性的标准,我不确定如何给出权威答案。我很确定它需要的不仅仅是“编译器开发人员永远不会那样做,不是吗?!” 【参考方案1】:

除了 C++11 可以激发二进制更改之外,该问题与 C++11 与 C++98 无关。由 C++11 推动的二进制更改并没有什么特别之处。它们与常规二进制更改一样具有破坏性或非破坏性。此外,只有在库维护者特别选择更改其二进制接口时,它们才会更改。

换句话说,这与标准版本无关,与库有关,除非库明确选择为不同的标准版本提供两个不同的二进制接口(这仍然是库的选择)。除了这种情况,你在 C++98 中和在 C++11 中一样坏。 Itanium 在支持 C++11 的版本和支持 C++98 的版本之间向后兼容,因此不会损坏编译器 ABI。

从记忆中,除非你使用的是 4.7.0,他们为了好玩而破坏了它然后再破坏,你使用 libstdc++ 是非常安全的——当他们可以做出重大突破时,他们正在为未来的版本存储 ABI 破坏。

换句话说,虽然向 C++11 的过渡期可能会带来额外的动机来破坏 ABI,从而带来额外的风险,但实际上使用 C++11 本身并不会带来任何额外的风险。

【讨论】:

以上是关于在当前 Linux 发行版上打包 C++11 软件是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

Linux安装包不通用?解决方案来了!

Linux安装包不通用?解决方案来了!

linux系统中,啥是pre-compiled binary

Linux 发行版上的 windeployqt.exe

xdg-open 默认在每个 linux 发行版上都可用吗?

如何在亚马逊 Linux 发行版上安装 nginx 1.9.15