アドレス変換された範囲のチェックサム
ほとんどの場合、ielftoolは、ツールが仮想(または実行/論理)アドレス、つまりアプリケーションが使用するメモリアドレス上で動作するかのように使用できます。しかし、これは厳密には正しくありません。ielftoolはELFファイルで動作するためです。実際にはELFファイルの物理アドレスを使用しています。
ほとんどの場合、物理アドレスと論理アドレスはほぼ常に同じなので、これは問題ではありません。ただし、アプリケーションがアドレス変換とリンクされている場合(参照logicalディレクティブ)、コンテンツは2つのアドレスを持ちます。論理アドレス(実行時に存在する場所)と物理アドレス(実行前に存在する場所)です。
ELFファイルのシンボルテーブルは論理アドレスのみを使用し、物理アドレスを持つシンボルは存在しないため、チェックサム範囲の指定でシンボルを使用することの利便性は、アドレス変換されたチェックサム範囲では使えません。代わりに、明示的な物理チェックサム範囲を使用する必要があります。
例:
アドレス範囲0x5'0000–0x5'FFFFのチェックサムを計算したいとします。このとき、次の2つのシンボルがあります:__checksum_start=0x5'0000および__checksum_end=0x5'FFFF。
アプリケーションがアドレス変換なしにリンクされている場合、次のように指定できます。
‑‑checksum __checksum:4,crc32;__checksum_start-__checksum_end
しかし、アプリケーションがアドレス変換とリンクされている場合、例えば0x5'0000–0x5'FFFF の範囲が0x1000'0000–0x1000'FFFFに変換されたと仮定すると、次のように指定する必要があります。
‑‑checksum __checksum:4,crc32;0x1000'0000-0x1000'FFFF
注記
チェックサムシンボル__checksumは、標準のシンボルであり、仮想アドレスを持っているため、そのまま使用できます。ielftoolは、チェックサム範囲で指定された物理バイトを処理し、アプリケーションがアクセスできるように、計算結果をチェックサムシンボルの仮想アドレスに保存します。