![是否可以确定预构建的 RPM 包上使用了哪些构建标志?](https://linux22.com/image/178467/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E7%A1%AE%E5%AE%9A%E9%A2%84%E6%9E%84%E5%BB%BA%E7%9A%84%20RPM%20%E5%8C%85%E4%B8%8A%E4%BD%BF%E7%94%A8%E4%BA%86%E5%93%AA%E4%BA%9B%E6%9E%84%E5%BB%BA%E6%A0%87%E5%BF%97%EF%BC%9F.png)
我一直在 CentOS 6 虚拟机上使用 Quagga 动态路由守护进程。我想使用一个只有在使用该--multipath=X
标志构建 RPM 时才能访问的功能。我正在使用的 RPM 已经构建并从 CentOS 存储库获取。
有没有办法查明 RPM 是否是使用此标志构建的,或者我是否必须从源代码构建并自己提供该标志?
我下载了 RPM 源包,并注意到在提供的规范文件中,多路径参数设置为 64。因此,如果需要,我可以自己构建它。
答案1
一般来说,用于构建用户空间二进制文件的特定编译器标志不会保留在二进制文件中。他们没有理由这样做。
您通常可以通过检查它来找出用于构建二进制文件的编译器和编译器版本,crt0
但即使该信息也可以通过使用自定义crt0
.
假设它不是静态二进制文件,您可以通过检查二进制文件正在使用哪些共享对象(“.so”)以及二进制文件正在使用每个共享对象中的哪些函数来推断特定的编译/构建时间选项。
如果您有源代码,则可以检查反汇编列表,并以合理的准确性确定在构建二进制文件时是否使用了特定的选项标志。
答案2
正如 @fpmurphy 所说,编译器标志通常不会保留在二进制文件中。诸如此类的构建时选项--multipath=X
最有可能是./configure
脚本的选项,因此它们可能会执行诸如控制文件生成之类的操作config.h
,然后该文件将参与构建过程而根本不会影响编译器标志。
但是当一个程序有很多这样的选项时,就会有有时(并非总是)一种找出相关构建时选项状态的方法。如果此信息可用,通常可以通过programname --version
显示版本信息的类似选项来显示。
我根本不认识Quagga,但是描述其终端模式命令的文档部分有一个看起来很有前途的命令:
命令:显示版本
显示 Quagga 的当前版本及其构建主机信息。
“构建主机信息”可能只包含有关构建时选项的信息。或者也可能不会。但如果我没有更容易的信息来源,那将是我首先查看的地方之一。
如果软件已打包,并且您可以找到相应的源代码包,那么一般的想法是,源代码包包含生成二进制文件所需的所有构建时配置,该二进制文件在功能上至少与相应软件中分发的二进制文件 100% 等效。同一发行版的二进制包。如果发行版使用新的“可重现构建”技术,则生成的二进制文件甚至可能是逐位相同的。
因此,源代码包(对于 RPM,尤其是其.spec
文件)是有关相应二进制包中使用的构建时选项的良好信息源。
假设.spec
您检查的文件的源 RPM 也来自 CentOS 的存储库,并且与您的二进制文件具有相同的版本,则标准假设是,是的,--multipath=64
用于生成二进制 RPM。如果您发现事实并非如此,那么这将是提交错误报告或以其他方式联系经销商并报告差异的一个很好的理由。