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=<ターゲット トリプル>

このフラグはオプションであり、ELF共有オブジェクトを読み取ってIFSファイルを生成する場合にのみ使用する必要があります。デフォルトでは、llvm-ifsは「ArchEndianness、およびBitWidth」フィールドを使用して、入力オブジェクトファイルのターゲット情報を反映します。このフラグを使用すると、llvm-ifsに出力IFSファイルで予期されるターゲットトリプルが通知されます。値がオブジェクトファイルのターゲット情報と一致する場合、この値は生成されたIFSの「Target:」フィールドで使用されます。入力オブジェクトファイルと競合する場合、エラーが報告され、プログラムは停止します。

--hint-ifs-target

このフラグはオプションであり、IFSファイルを出力する場合にのみ使用する必要があります。このフラグは、後でオーバーライドできるように、Arch フィールドをIFSファイルから削除します。

--strip-ifs-endianness

このフラグはオプションであり、IFSファイルを出力する場合にのみ使用する必要があります。このフラグは、後でオーバーライドできるように、Endianness フィールドをIFSファイルから削除します。

--strip-ifs-bitwidth

このフラグはオプションであり、IFSファイルを出力する場合にのみ使用する必要があります。このフラグは、後でオーバーライドできるように、BitWidth フィールドをIFSファイルから削除します。

--strip-ifs-target

このフラグはオプションであり、IFSファイルを出力する場合にのみ使用する必要があります。このフラグは、後でオーバーライドできるように、Target フィールドをIFSファイルから削除します。

--write-if-changed

このフラグが設定されている場合、llvm-ifsは、出力ファイルがまだ存在しない場合、またはコンテンツが既存のファイルと異なる場合にのみ、出力ファイルを書き込みます。

--strip-size

このフラグが設定されている場合、llvm-ifs は出力 ifs ファイルからサイズフィールドを削除します。これは、コピー再配置を必要としない位置独立コードとのリンクのみを目的とした共有オブジェクト、またはオブジェクトのサイズがABIで追跡するのに有用な部分ではない場合に役立ちます。

終了ステータス

llvm-ifs が成功した場合、0 で終了します。そうでない場合、エラーが発生した場合、0 以外の値で終了します。