1. ホーム
  2. c

[解決済み] <puts@plt>とは具体的にどのような意味ですか?

2022-02-19 12:46:09

質問事項

今、私はアセンブラプログラミングに少しでも近づこうと、簡単なハローワールドプログラムのアセンブラコードを見ています。

#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はデータに使われます。