初めてのポスター。CS2年生。
C ソース -> GCC コンパイル -> Linux 実行環境のコンテキストで、仮想アドレス空間の .data セクションに静的変数を作成する方法を調べています。
Cプログラムはtest.c
int main()
{
register int i = 0;
register int sum = 0;
static int staticVar[10] = {1,2,3,4,5,6,7,8,9,-1};
Loop:
sum = sum + staticVar[i]; //optimized away
i = i+1;
if(i != 10)
goto Loop;
return 0;
}
GDB に ' disass /m
' を要求すると、staticVar[] 作成用のコードがないことがわかります。これは、.s ファイルを検査すると、プロセス作成時にそこに配置された仮想アドレス空間の読み取り/書き込み .data セグメントに変数が存在することが明らかになるためです。 (このプロセスは私が興味を持っているものです)。
(私は ' ' でしたが) の出力を調べるとreadelf -A test.o
、オブジェクト ファイルには、データ セグメント内の配列の作成であると想定するアセンブリが含まれています。これがELF出力です。
(この出力を生成するコマンドを教えていただければボーナスです。readelfを使用して複製することはできません。Webサイトからコマンドを取得し、出力を保存しました。どのように生成されたか思い出せません)
[をちょきちょきと切る]
00000000 <staticVar.1359>:
0:01 00 add %eax,(%eax)
2:00 00 add %al,(%eax)
4:02 00 add (%eax),%al
6:00 00 add %al,(%eax)
8:03 00 add (%eax),%eax
a:00 00 add %al,(%eax)
c:04 00 add $0x0,%al
e:00 00 add %al,(%eax)
10:05 00 00 00 06 add $0x6000000,%eax
15:00 00 add %al,(%eax)
17:00 07 add %al,(%edi)
19:00 00 add %al,(%eax)
1b:00 08 add %cl,(%eax)
1d:00 00 add %al,(%eax)
1f:00 09 add %cl,(%ecx)
21:00 00 add %al,(%eax)
23:00 ff add %bh,%bh
25:ff (bad)
26:ff (bad)
27:ff .byte 0xff
[をちょきちょきと切る]
仮定 (修正してください) : このアセンブリは実行可能ファイルに存在し、load_elf_binary() または execve() によって開始される一連の関数の一部によって実行されます。私には at&t (基本的なインテル) 構文の知識はありませんが、直感的にさえ、これらの命令が配列を構築する方法がわかりません。レジスタ値を一緒に追加しているように見えます。
結論:この静的配列のライフサイクル、特にそれを構築する「不足しているコード」がどこにあるのか、どうすればそれを確認できるのか、可能な限り知りたいです。または、ローダープロセスをデバッグ (ステップスルー) するにはどうすればよいですか? __start_libc エントリ (またはそのようなもの) でメインの前にブレークポイントを設定しようとしましたが、この領域で有望なものを特定できませんでした。
追加情報へのリンクは素晴らしいです!御時間ありがとうございます!