From Learning Linux Binary Analysis by Ryan “elfmaster” O “Neill 。32ページで、作成者は次のように述べています。
32ビットELFファイルの再配置レコードは64ビットの場合と同じですが、ただし、32ビット整数を使用します。次の例は、オブジェクトファイルコードが32ビットとしてコンパイルされるため、64ビットでは一般的に使用されない暗黙の加数を示すことができます。暗黙の加数は、再配置レコードがiv id = =を含まない
ElfN_Rel
タイプの構造に格納されている場合に発生します。 “e1460a5786″>
フィールドであるため、加数は再配置ターゲット自体に格納されます。 64ビットの実行可能ファイルは、明示的な加数 divを含むElfN_Rela
構造体を使用する傾向があります。 >。両方のシナリオを理解する価値があると思いますが、暗黙の加数はもう少し混乱するので、この領域に光を当てることは理にかなっています。
とは「加数」の実際の定義?
コメント
- english.stackexchange.com/search?q=addend
- Addend + addend、minuend-subtrahend、multiplicand * multiplier、dividend / divisor
回答
これは単に「追加された番号」、この場合は「ベースロードアドレスに追加された番号」を意味すると思います(またはセグメントロードアドレス)を使用して、この再配置の最終ポインタを計算します。
バイナリを0x400000でメモリにロードすると、0x401234に0x405678を指すポインタがあると想像してみてください。バイナリを0x800000でロードした場合、これは0x805678を指すはずなので、再配置する必要があります。)ELFはわかりませんが、これを読んだところ、
-
in t暗黙の場合、再配置テーブルはオフセットのみをバイナリ(この場合は0x1234)に格納し、バイナリのオフセット0x1234には、ターゲットオフセット0x5678を格納します。したがって、再配置は、再配置テーブル
*(base + A) += base
の各アドレス
A
に対してになります(これこれは、PEファイルでの再配置テーブルの動作方法です。)
-
明示的な場合、再配置テーブルは、オフセットをバイナリとターゲットオフセットの両方に格納します(0x1234 0x5678)。したがって、ここでの再配置は、再配置テーブル
*(base + A) = base + B
の各アドレスペア
A, B
に対してです。この場合、オフセット0x1234でバイナリに何が入るのかわかりません。
回答
- Augend は、加算の対象となる数値を意味する用語です
- 加数は追加する番号です。
Dictionary.com 、
「3 + 4」の紙を見つめていることに気付いたことがありますか」と書かれていて、「これら2つのそれぞれの量のそれぞれに適切な用語は何ですか?」いいえ?最初の数字はaugend とに追加される番号は加数です。
他の数学用語のグラフは、ウィキペディアの「計算結果」 、
なぜここに特別な用語があるのですか?
- まあ、それはおそらく、アセンブリで
add rbi, rax
が実際に結果をrbi
に保存するためです。したがって、最初の引数を知ることは、add
に対する単なる引数ではなく、宛先です。add rax, rbi
は結果をrax
に保存します。代わりにアセンブリが演算子で表示された場合は、rbi += rax
とrax += rbi
があります。 - 加数は常にオフセットではなく、被加数は常にベースであるとは限りません。ただし、この特定の例では、「オフセット」の方がはるかに適切です。
-
この特定のケースでは、「暗黙のオフセット」という用語は、 Tool Interface Standard(TIS)Executable and Linking Format(ELF)Specification Version 1.2 にあります。
…
Elf32_Rela
エントリのみに明示的な加数が含まれます。タイプは、変更する場所に暗黙の加数を格納します。プロセッサアーキテクチャに応じて、いずれかの形式が必要になるか、より便利になる場合があります。したがって、特定のマシンの実装では、コンテキストに応じて1つのフォームのみを使用することも、いずれかのフォームを使用することもできます。