[解決済み] <puts@plt>とは具体的にどのような意味ですか?
質問事項
今、私はアセンブラプログラミングに少しでも近づこうと、簡単なハローワールドプログラムのアセンブラコードを見ています。
#include <stdio.h>
int main ()
{
int i;
for(i=0; i<10; i++)
{
printf("Hello, world!\n");
}
return 0;
}
次に、簡単なアセンブラコマンドがどのように動作するかを理解するために、アセンブラコードを順を追って見ていき、何が起こっているかを分析します。
0x000000000040052d <+0>: push rbp
0x000000000040052e <+1>: mov rbp,rsp
0x0000000000400531 <+4>: sub rsp,0x10
0x0000000000400535 <+8>: mov DWORD PTR [rbp-0x4],0x0
0x000000000040053c <+15>: jmp 0x40054c <main+31>
0x000000000040053e <+17>: mov edi,0x4005e4
0x0000000000400543 <+22>: call 0x400410 <puts@plt>
0x0000000000400548 <+27>: add DWORD PTR [rbp-0x4],0x1
0x000000000040054c <+31>: cmp DWORD PTR [rbp-0x4],0x9
0x0000000000400550 <+35>: jle 0x40053e <main+17>
0x0000000000400552 <+37>: mov eax,0x0
0x0000000000400557 <+42>: leave
0x0000000000400558 <+43>: ret
問題は、この行がよくわからないことです。
0x0000000000400543 <+22>: call 0x400410 <puts@plt>
0x400410のアドレスをいろいろと見てみたのですが、これが何をするものなのかよくわかりません :/ また、これが何を意味するのかもわかりません。
<puts@plt>
この特定の行を理解するために誰かが私を助けることができれば、本当に素晴らしいことです :) ご挨拶 眠い
どのように解決するのですか?
PLTとはProcedure Linkage Tableのこと。相対アドレス指定が可能なマシンで、ロード時に固定化するためにELFファイルで使用される特殊な技術です。
呼び出している関数が他のモジュール(典型的にはlibc.so.)にある。 x そのため、プログラムをロードして実行する際には、その関数の実際のアドレスを指定する必要があります。
PLTは基本的に、実行ファイル(または.soファイル)内の未解決の参照をすべて集めた領域です。PLTは、ターゲットマシンのジャンプ命令と同じ形式で、実際のアドレスは未記入のままです。アドレスを埋めるのはローダー次第です。このプロセスはフィックスアップと呼ばれます。
モジュールの残りの部分は相対アドレスを使ってPLT経由で関数呼び出しを行い、リンク時にPLTへのオフセットが分かっているので、そこで何も修正する必要はありません。つまり、モジュールの大部分はスワップ・ファイルではなくモジュール・ファイルにマッピングされ続けることになります。
また、PLTを補完するものとして、GOT(Global Offset Table)があることに留意する必要がある。PLTが関数呼び出しに使われるのに対して、GOTはデータに使われます。
関連
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】シンプルなC言語のscanfが機能しない?重複
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] ポインタの「デリファレンス」とはどういう意味ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】GCC Cコードで静的宣言が非静的宣言に続くことを解決するには?
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル