![是否可以確定預先建置的 RPM 包上使用了哪些建置標誌?](https://rvso.com/image/178467/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E7%A2%BA%E5%AE%9A%E9%A0%90%E5%85%88%E5%BB%BA%E7%BD%AE%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%E5%BB%BA%E7%BD%AE%E6%A8%99%E8%AA%8C%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。如果您發現事實並非如此,那麼這將是提交錯誤報告或以其他方式聯繫經銷商並報告差異的一個很好的理由。