llvm-ifs - 共享對象存根工具¶
語法¶
llvm-ifs [選項] 輸入
說明¶
llvm-ifs 是一個工具,它可以從 ELF 共享對象或基於文本的存根共同產生用於共享對象的可讀文本存根(.ifs 文件)和可鏈接的共享對象存根(.so 文件)。基於文本的存根對於監控共享對象的 ABI 更改非常有用。可鏈接的共享對象存根可用於在共享庫的 ABI 不變時避免不必要的重新鏈接。
IFS 格式¶
以下是由 llvm-ifs 生成的共享對象的文本表示(IFS)示例
--- !ifs-v1
IFSVersion: 3.0
SoName: libtest.so /* Optional */
Target: x86_64-unknown-linux-gnu /* Optional, format 1, same format as llvm target triple */
Target: { Arch: x86_64, Endianness: little, Bitwidth: 64 } /* Optional, format 2 */
NeededLibs:
- libc.so.6
Symbols:
- { Name: sym0, Type: Notype }
- { Name: sym1, Type: Object, Size: 0 }
- { Name: sym2, Type: Func, Weak: false }
- { Name: sym3, Type: TLS }
- { Name: sym4, Type: Unknown, Warning: foo }
...
IFSVersion
:IFS 文件的版本,用於讀取器相容性。SoName
(可選):正在生成存根的共享對象文件的名稱。Target
(可選):此共享對象的架構、位元組序和位數信息。它可以是顯式格式,也可以是隱式 LLVM 三元組格式。它是可選的,可以通過命令行選項覆蓋。NeededLibs
:此庫所依賴的外部共享對象列表。Symbols
:鏈接每個符號的對象所需的所有數據的集合,按名稱升序排序。Name
:符號名稱。Type
:符號是對象、函數、無類型、線程局部存儲還是未知。未明確支持的符號類型將映射為未知,以提高信噪比。Size
:相關符號的大小,不適用於函數,對於 NoType 符號是可選的。Undefined
:符號是否在此共享對象文件中定義。Weak
:符號是否應被視為弱符號。Warning
(可選):鏈接此符號時要輸出的警告文本。
此基於 YAML 的文本格式包含生成可鏈接的 ELF 共享對象以及 Apple TAPI 格式文件所需的一切。符號的順序已排序,因此可以使用 diff 工具輕鬆比較這些文件。如果文件內容發生更改,則表示潛在的 ABI 破壞性更改。
ELF 存根格式¶
鏈接器可以使用的最小 ELF 文件應具有以下正確填充的部分
ELF 標頭。
區段標頭。
動態符號表 (
.dynsym
區段)。動態字串表 (
.dynstr
區段)。動態表 (
.dynamic
區段)。DT_SYMTAB
項目。DT_STRTAB
項目。DT_STRSZ
項目。DT_NEEDED
項目。(可選)DT_SONAME
項目。(可選)
區段標頭字串表 (
.shstrtab
區段)
這個 ELF 檔案可能與依賴程式標頭的 ELF 分析工具存在相容性問題。像 LLD 這樣的連結器可以正常處理這種最小化的 ELF 檔案,而不會出現錯誤。
選項¶
- --input-format=[IFS|ELF|OtherObjectFileFormats]¶
指定輸入檔案格式。目前僅支援文字 IFS 檔案和 ELF 共享物件檔案。這個旗標是可選的,因為可以推斷輸入格式。
- --output-elf=<輸出檔名>¶
指定 ELF 共享物件存根的輸出檔案。
- --output-ifs=<輸出檔名>¶
指定文字 IFS 的輸出檔案。
- --output-tbd=<輸出檔名>¶
指定 Apple TAPI tbd 的輸出檔案。
- --arch=[x86_64|AArch64|...]¶
這個旗標是可選的,只有在讀取未定義
Arch
(架構)的 IFS 檔案時才應使用。這個旗標定義輸出檔案的架構,可以是 ELF ‘e_machine’ 欄位支援的任何字串。如果值與 IFS 檔案衝突,將會報告錯誤並停止程式。
- --endianness=[little|big]¶
這個旗標是可選的,只有在讀取未定義
Endianness
的 IFS 檔案時才應使用。這個旗標定義輸出檔案的位元組順序。如果值與 IFS 檔案衝突,將會報告錯誤並停止程式。
- --bitwidth=[32|64]¶
這個旗標是可選的,只有在讀取未定義
BitWidth
的 IFS 檔案時才應使用。這個旗標定義輸出檔案的位元寬度。如果值與輸入 IFS 檔案衝突,將會報告錯誤並停止程式。
- --target=<目標 三元組>¶
這個旗標是可選的,並且僅應在讀取未定義任何目標資訊的 IFS 檔案時使用。此旗標使用 llvm 目標三元組定義輸出檔案的架構、位元組序和位元寬度。此旗標不能與其他與目標相關的旗標同時使用。
- --hint-ifs-target=<target triple>¶
此旗標是可選的,並且僅應在讀取 ELF 共享物件並產生 IFS 檔案時使用。預設情況下,llvm-ifs 將使用“
Arch
、Endianness
和BitWidth
”欄位來反映輸入物件檔案中的目標資訊。使用此旗標將告訴 llvm-ifs 輸出 IFS 檔案中的預期目標三元組。如果該值與物件檔案中的目標資訊相符,則此值將用於生成的 IFS 中的“目標:”欄位中。如果它與輸入物件檔案衝突,將會報告錯誤並停止程式。
- --hint-ifs-target¶
這個旗標是可選的,並且僅應在輸出 IFS 檔案時使用。此旗標會從 IFS 檔案中刪除
Arch
欄位,以便稍後可以覆蓋它。
- --strip-ifs-endianness¶
這個旗標是可選的,並且僅應在輸出 IFS 檔案時使用。此旗標會從 IFS 檔案中刪除
Endianness
欄位,以便稍後可以覆蓋它。
- --strip-ifs-bitwidth¶
這個旗標是可選的,並且僅應在輸出 IFS 檔案時使用。此旗標會從 IFS 檔案中刪除
BitWidth
欄位,以便稍後可以覆蓋它。
- --strip-ifs-target¶
這個旗標是可選的,並且僅應在輸出 IFS 檔案時使用。此旗標會從 IFS 檔案中刪除
Target
欄位,以便稍後可以覆蓋它。
- --write-if-changed¶
設定此旗標後,僅當輸出檔案不存在或內容與現有檔案不同時,llvm-ifs 才會寫入輸出檔案。
- --strip-size¶
設定此旗標後,llvm-ifs 將從輸出 ifs 檔案中移除大小欄位。這對於僅打算鏈接到不需要複製重定位的位置無關程式碼的共享物件,或者物件的大小不是要跟踪的 abi 的有用部分時非常有用。
結束狀態¶
如果 llvm-ifs 成功,它將以 0 結束。否則,如果發生錯誤,它將以非零值結束。