2009年11月23日月曜日

【Linkers&Loaders】3 オブジェクトファイル 〜サンプルで見るELFの基本構造(私家版)〜

本書は、COM->EXE->a.out->ELF->PE->OMFと横断的に概要を紹介している。
ここでは、ELFに絞って、本書よりも多少深めに記述する。
サンプルの内部を具体的に調べる形で見ていく。

とても読みにくい、と思うのですが、まあ学習メモなので、、、
そんなものでも誰かの何かに役立つかもしれないので。

こつこつ。



*** サンプルで見るELFの基本構造(私家版)
**** ソース
***** a.c
3.7 $ cat a.c
char a(char *s)
{
return s[0];
}

***** m.c
3.7 $ cat m.c
extern char a(char *);
int main(int ac, char**av)
{
static char string[] = "Hello, world!\en";
a(string);
return 0;
}
3.7 $

**** 再配置可能オブジェクトの構造
***** a.o
3.7 $ readelf -a a.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 272 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 11
Section header string table index: 8

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000011 0000000000000000 AX 0 0 4
[ 2] .data PROGBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4
[ 3] .bss NOBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4
[ 4] .eh_frame PROGBITS 0000000000000000 00000058
0000000000000038 0000000000000000 A 0 0 8
[ 5] .rela.eh_frame RELA 0000000000000000 000004b0
0000000000000018 0000000000000018 9 4 8
[ 6] .comment PROGBITS 0000000000000000 00000090
0000000000000025 0000000000000000 0 0 1
[ 7] .note.GNU-stack PROGBITS 0000000000000000 000000b5
0000000000000000 0000000000000000 0 0 1
[ 8] .shstrtab STRTAB 0000000000000000 000000b5
0000000000000054 0000000000000000 0 0 1
[ 9] .symtab SYMTAB 0000000000000000 000003d0
00000000000000d8 0000000000000018 10 8 8
[10] .strtab STRTAB 0000000000000000 000004a8
0000000000000007 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 17 FUNC GLOBAL DEFAULT 1 a

No version information found in this file.

***** m.o
3.7 $ readelf -a m.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 296 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 12
Section header string table index: 9

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000020 0000000000000000 AX 0 0 4
[ 2] .rela.text RELA 0000000000000000 00000548
0000000000000030 0000000000000018 10 1 8
[ 3] .data PROGBITS 0000000000000000 00000060
0000000000000010 0000000000000000 WA 0 0 16
[ 4] .bss NOBITS 0000000000000000 00000070
0000000000000000 0000000000000000 WA 0 0 4
[ 5] .eh_frame PROGBITS 0000000000000000 00000070
0000000000000038 0000000000000000 A 0 0 8
[ 6] .rela.eh_frame RELA 0000000000000000 00000578
0000000000000018 0000000000000018 10 5 8
[ 7] .comment PROGBITS 0000000000000000 000000a8
0000000000000025 0000000000000000 0 0 1
[ 8] .note.GNU-stack PROGBITS 0000000000000000 000000cd
0000000000000000 0000000000000000 0 0 1
[ 9] .shstrtab STRTAB 0000000000000000 000000cd
0000000000000059 0000000000000000 0 0 1
[10] .symtab SYMTAB 0000000000000000 00000428
0000000000000108 0000000000000018 11 9 8
[11] .strtab STRTAB 0000000000000000 00000530
0000000000000018 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

Relocation section '.rela.text' at offset 0x548 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000010 00030000000a R_X86_64_32 0000000000000000 .data + 0
000000000015 000a00000002 R_X86_64_PC32 0000000000000000 a + fffffffffffffffc

Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

There are no unwind sections in this file.

Symbol table '.symtab' contains 11 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS m.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 16 OBJECT LOCAL DEFAULT 3 string.1551
6: 0000000000000000 0 SECTION LOCAL DEFAULT 5
7: 0000000000000000 0 SECTION LOCAL DEFAULT 8
8: 0000000000000000 0 SECTION LOCAL DEFAULT 7
9: 0000000000000000 32 FUNC GLOBAL DEFAULT 1 main
10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND a

No version information found in this file.
3.7 $

***** a.oの解説

3.7 $ readelf -a a.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00

char magic[4] = "\177ELF"
#o177は制御記号のdel。
(format "%x" (print ?E))
; => "45"
(format "%x" (print ?L))
; => "4c"
(format "%x" (print ?F))
; => "46"


Class: ELF64

アドレスのサイズ


Data: 2's complement, little endian

バイトオーダ他。


Version: 1 (current)

ELFのバージョン。固定らしい。


OS/ABI: UNIX - System V

ELFOSABI_LINUXの運用はまちまち。


ABI Version: 0

文字通り。

Type: REL (Relocatable file)

ELFのタイプ。

Machine: Advanced Micro Devices X86-64

Version: 0x1

Entry point address: 0x0

エントリーポイント。実行可能ファイル以外は0。


Start of program headers: 0 (bytes into file)

開始位置。


Start of section headers: 272 (bytes into file)

開始位置。


Flags: 0x0

アーキテクチャ固有フラグ。通常は0。


Size of this header: 64 (bytes)

このELFヘッダのサイズ。


Size of program headers: 0 (bytes)

プログラムヘッダのエントリひとつのサイズ。


Number of program headers: 0

Size of section headers: 64 (bytes)

セクションヘッダのエントリひとつのサイズ。


Number of section headers: 11
Section header string table index: 8

セクション名文字列を格納しているセクションの番号。


Section Headers:

ELFファイルの内部構造は2つのViewをもつ。
Section Viewはそのひとつ。
Section HeadersはSection Viewの構造を記述する。


[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align

Nr : 文字列テーブルにおける名前のインデックス。
Name : Nrを名前解決したもの。
Type : セクションタイプ。セクション内に格納する
情報によって分類。
NULL: 0
このセクションヘッダはinactive。対応するセクショ
ンは存在しない。
PROGBITS: 1
プログラムの内容を含むもの。コード、データ、デ
バッガ情報等。
SYMTAB: 2
シンボルテーブル。
STRTAB: 3
文字列テーブル。
RELA: 4
再配置情報。ベース値自体をこのセクションに含む
方式。
HASH: 5
実行時のシンボルハッシュテーブル。
DYNAMIC: 6
動的リンク情報。
NOTE: 7
NOBITS: 8
対応するセクションは存在しないが、それ以外は、
PROGBITS:と同じ。BSSにつかう。
REL: 9
再配置情報。コードに記述されている値をベース値
とする方式。
SHLIB: 10
予約されているが、意味が未確定。現状では、これ
がELFファイルに存在するなら、そのELFファイルは
System V ABIのConformance violationとなる。
DYNSYM: 11
動的リンク用のシンボル。
LOPROC: 0x70000000
processor固有情報の開始位置。processor固有情報
として何を記述するかというSemanticsはSysV ABIの
プロセッサ補遺で定義。
HIPROC: 0x7fffffff
processor固有情報の終了位置。
LOUSER: 0x80000000
application固有情報の開始位置。application固有
情報として何を記述するかというSematicsは個別に
定めてよい。
HIUSER: 0xffffffff
application固有情報の終了位置。

Address : lodableファイルの場合は、ベースアドレス。
それ以外は0。
Offset : セクションの先頭のファイル内の位置。
Size : セクションのサイズ(Byte)。
EntSize : セクションが配列の場合のエントリのサイズ
(Byte)。
Flags : フラグビット。ロード関係の情報。
SHF_WRITE (0x1)
このセクションを、実行時に、メモリ上で書き込み可能とする。
SHF_ALLOC (0x2)
このセクションを、実行時にメモリ上に配置する。
SHF_EXECINSTR (0x4)
このセクションは、実行可能なマシン語を含む。
SHF_MASKPROC (0xf0000000)
このマスクに含まれているビットは、processor固有
情報となる。processor補遺で定義する。

Link : 関連する情報を持つセクション。関連が無い
場合は、0。
Info : セクション固有の情報
Align : セクションを移動する場合の整列の粒度


[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0

セクションヘッダの先頭に置くセクションはNULLと決まっ
ている。

[ 1] .text PROGBITS 0000000000000000 00000040
0000000000000011 0000000000000000 AX 0 0 4

a.outのテキストセクション相当。

[ 2] .data PROGBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4

a.outのデータセクション相当。

[ 3] .bss NOBITS 0000000000000000 00000054
0000000000000000 0000000000000000 WA 0 0 4

a.outのBSSセクション相当。

[ 4] .eh_frame PROGBITS 0000000000000000 00000058
0000000000000038 0000000000000000 A 0 0 8

GCC拡張セクション?
例外が発生したときのアンワインドに関する情報を保持。

[ 5] .rela.eh_frame RELA 0000000000000000 000004b0
0000000000000018 0000000000000018 9 4 8

.relaNAMEは、NAMEセクションに対する再配置情報。

[ 6] .comment PROGBITS 0000000000000000 00000090
0000000000000025 0000000000000000 0 0 1

説明文字列用。

[ 7] .note.GNU-stack PROGBITS 0000000000000000 000000b5
0000000000000000 0000000000000000 0 0 1

.noteセクションは、処理系が独自に情報を保持すると
きに使う。この有無や内容は、ABIコンフォーマンスと
は無関係。

[ 8] .shstrtab STRTAB 0000000000000000 000000b5
0000000000000054 0000000000000000 0 0 1

セクション名用文字列を保持。

[ 9] .symtab SYMTAB 0000000000000000 000003d0
00000000000000d8 0000000000000018 10 8 8

シンボルテーブル。

[10] .strtab STRTAB 0000000000000000 000004a8
0000000000000007 0000000000000000 0 0 1

シンボルテーブル用文字列を保持。他のもの用の文字列
を含むこともあり。


Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

There are no program headers in this file.

まだ.oファイルだからか、プログラムヘッダは存在しな
い。

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

再配置セクションについては後述。

There are no unwind sections in this file.

Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 4
6: 0000000000000000 0 SECTION LOCAL DEFAULT 7
7: 0000000000000000 0 SECTION LOCAL DEFAULT 6
8: 0000000000000000 17 FUNC GLOBAL DEFAULT 1 a

これはELFのシンボルテーブルの中身。

- Value : シンボルの値
- Type : データ、関数、セクションシンボル、ファイ
ル他。
- Bind : local, global、weak他。
- Vis : 不明。
- Ndx : このシンボルが定義されているセクション番号。
またはABS、COMMONまたはUNDEF。
- Name : これは実際は、文字列テーブルの番号が入っ
ている。ここではその番号から引き当てた文字列を
表示している。


No version information found in this file.

***** m.oの解説
a.oとほぼ同じなので割愛。

***** 再配置セクションについて
- a.oの場合。

Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0

- m.oの場合。

Relocation section '.rela.text' at offset 0x548 contains 2 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000010 00030000000a R_X86_64_32 0000000000000000 .data + 0
000000000015 000a00000002 R_X86_64_PC32 0000000000000000 a + fffffffffffffffc

Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000000020 00020000000a R_X86_64_32 0000000000000000 .text + 0


- RELAの構造

r_offset :
- 再配置可能ファイルでは、セクション相対にて再配置
が必要な位置。
- 実行可能ファイルでは、仮想アドレス上の位置。

r_info :

2つを含む。
- シンボルテーブルのインデックス番号。このエントリ
が再配置情報を提供しているシンボルを特定する。
- 再配置のタイプ

r_append :
- 再配置フィールドの値の算出に使用する定数。

**** 再配置可能オブジェクトのセクションの内容
***** a.oの全てのセクション
3.7 $ objdump -s a.o

a.o: file format elf64-x86-64

Contents of section .text:
0000 554889e5 48897df8 488b45f8 0fb600c9 UH..H.}.H.E.....
0010 c3 .
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 01781001 .........zR..x..
0010 030c0708 90010000 1c000000 1c000000 ................
0020 00000000 11000000 00410e10 8602430d .........A....C.
0030 06000000 00000000 ........
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00 .3.2.

***** m.oの全てのセクション
3.7 $ objdump -s m.o

m.o: file format elf64-x86-64

Contents of section .text:
0000 554889e5 4883ec10 897dfc48 8975f0bf UH..H....}.H.u..
0010 00000000 e8000000 00b80000 0000c9c3 ................
Contents of section .data:
0000 48656c6c 6f2c2077 6f726c64 211b6e00 Hello, world!.n.
Contents of section .eh_frame:
0000 14000000 00000000 017a5200 01781001 .........zR..x..
0010 030c0708 90010000 1c000000 1c000000 ................
0020 00000000 20000000 00410e10 8602430d .... ....A....C.
0030 06000000 00000000 ........
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00 .3.2.

***** a.oの.text
3.7 $ objdump -d a.o

a.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <a>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 89 7d f8 mov %rdi,-0x8(%rbp)
8: 48 8b 45 f8 mov -0x8(%rbp),%rax
c: 0f b6 00 movzbl (%rax),%eax
f: c9 leaveq
10: c3 retq
3.7 $

***** m.oの.text
3.7 $ objdump -d m.o

m.o: file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 89 7d fc mov %edi,-0x4(%rbp)
b: 48 89 75 f0 mov %rsi,-0x10(%rbp)
f: bf 00 00 00 00 mov $0x0,%edi
14: e8 00 00 00 00 callq 19 <main+0x19>
19: b8 00 00 00 00 mov $0x0,%eax
1e: c9 leaveq
1f: c3 retq
3.7 $

**** 実行可能ファイルの構造
***** a.outの構造
3.7 $ readelf -a a.out
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4003c0
Start of program headers: 64 (bytes into file)
Start of section headers: 6208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 37
Section header string table index: 34

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[ 3] .hash HASH 0000000000400278 00000278
0000000000000018 0000000000000004 A 5 0 8
[ 4] .gnu.hash GNU_HASH 0000000000400290 00000290
000000000000001c 0000000000000000 A 5 0 8
[ 5] .dynsym DYNSYM 00000000004002b0 000002b0
0000000000000048 0000000000000018 A 6 1 8
[ 6] .dynstr STRTAB 00000000004002f8 000002f8
0000000000000038 0000000000000000 A 0 0 1
[ 7] .gnu.version VERSYM 0000000000400330 00000330
0000000000000006 0000000000000002 A 5 0 2
[ 8] .gnu.version_r VERNEED 0000000000400338 00000338
0000000000000020 0000000000000000 A 6 1 8
[ 9] .rela.dyn RELA 0000000000400358 00000358
0000000000000018 0000000000000018 A 5 0 8
[10] .rela.plt RELA 0000000000400370 00000370
0000000000000018 0000000000000018 A 5 12 8
[11] .init PROGBITS 0000000000400388 00000388
0000000000000018 0000000000000000 AX 0 0 4
[12] .plt PROGBITS 00000000004003a0 000003a0
0000000000000020 0000000000000010 AX 0 0 4
[13] .text PROGBITS 00000000004003c0 000003c0
00000000000001f8 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 00000000004005b8 000005b8
000000000000000e 0000000000000000 AX 0 0 4
[15] .rodata PROGBITS 00000000004005c8 000005c8
0000000000000004 0000000000000004 AM 0 0 4
[16] .eh_frame_hdr PROGBITS 00000000004005cc 000005cc
000000000000002c 0000000000000000 A 0 0 4
[17] .eh_frame PROGBITS 00000000004005f8 000005f8
00000000000000b4 0000000000000000 A 0 0 8
[18] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8
[19] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8
[20] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8
[21] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 6 0 8
[22] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8
[23] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000020 0000000000000008 WA 0 0 8
[24] .data PROGBITS 0000000000601010 00001010
0000000000000020 0000000000000000 WA 0 0 16
[25] .bss NOBITS 0000000000601030 00001030
0000000000000010 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00001030
0000000000000128 0000000000000000 0 0 1
[27] .debug_aranges PROGBITS 0000000000000000 00001160
0000000000000090 0000000000000000 0 0 16
[28] .debug_pubnames PROGBITS 0000000000000000 000011f0
0000000000000025 0000000000000000 0 0 1
[29] .debug_info PROGBITS 0000000000000000 00001215
00000000000001d7 0000000000000000 0 0 1
[30] .debug_abbrev PROGBITS 0000000000000000 000013ec
000000000000006f 0000000000000000 0 0 1
[31] .debug_line PROGBITS 0000000000000000 0000145b
0000000000000151 0000000000000000 0 0 1
[32] .debug_str PROGBITS 0000000000000000 000015ac
00000000000000a7 0000000000000001 MS 0 0 1
[33] .debug_ranges PROGBITS 0000000000000000 00001660
0000000000000090 0000000000000000 0 0 16
[34] .shstrtab STRTAB 0000000000000000 000016f0
0000000000000149 0000000000000000 0 0 1
[35] .symtab SYMTAB 0000000000000000 00002180
0000000000000720 0000000000000018 36 58 8
[36] .strtab STRTAB 0000000000000000 000028a0
00000000000001ff 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000006ac 0x00000000000006ac R E 200000
LOAD 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x0000000000000218 0x0000000000000228 RW 200000
DYNAMIC 0x0000000000000e40 0x0000000000600e40 0x0000000000600e40
0x00000000000001a0 0x00000000000001a0 RW 8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000020 0x0000000000000020 R 4
GNU_EH_FRAME 0x00000000000005cc 0x00000000004005cc 0x00000000004005cc
0x000000000000002c 0x000000000000002c R 4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8
GNU_RELRO 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e8 0x00000000000001e8 R 1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
08 .ctors .dtors .jcr .dynamic .got

Dynamic section at offset 0xe40 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400388
0x000000000000000d (FINI) 0x4005b8
0x0000000000000004 (HASH) 0x400278
0x000000006ffffef5 (GNU_HASH) 0x400290
0x0000000000000005 (STRTAB) 0x4002f8
0x0000000000000006 (SYMTAB) 0x4002b0
0x000000000000000a (STRSZ) 56 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 24 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400370
0x0000000000000007 (RELA) 0x400358
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400338
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x400330
0x0000000000000000 (NULL) 0x0

Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000600fe0 000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x370 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000601000 000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0

There are no unwind sections in this file.

Version symbols section '.gnu.version' contains 3 entries:
Addr: 0000000000400330 Offset: 0x000330 Link: 5 (.dynsym)
000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5)

Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000400338 Offset: 0x000338 Link: 6 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2

Notes at offset 0x00000254 with length 0x00000020:
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
3.7 $

***** a.outの構造の解説
再配置可能オブジェクトとの差異を中心にコメントする。


ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)

実行可能ファイルであることを示す。

Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x4003c0
Start of program headers: 64 (bytes into file)

再配置可能オブジェクトと異り、プログラムヘッダが存
在する。

Start of section headers: 6208 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 37
Section header string table index: 34

Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1

プログラムインタプリタのパスを含む。

[ 2] .note.ABI-tag NOTE 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4

ABI-tagが何を意味するかはGCCまたはLinuxの調査が必
要。

[ 3] .hash HASH 0000000000400278 00000278
0000000000000018 0000000000000004 A 5 0 8

シンボルハッシュテーブル。

[ 4] .gnu.hash GNU_HASH 0000000000400290 00000290
000000000000001c 0000000000000000 A 5 0 8

GCC拡張?

[ 5] .dynsym DYNSYM 00000000004002b0 000002b0
0000000000000048 0000000000000018 A 6 1 8

動的リンクのためのシンボルテーブル。

[ 6] .dynstr STRTAB 00000000004002f8 000002f8
0000000000000038 0000000000000000 A 0 0 1

.dynsymのための文字列テーブル。主にシンボル文字列
を含む。

[ 7] .gnu.version VERSYM 0000000000400330 00000330
0000000000000006 0000000000000002 A 5 0 2

GCC拡張?

[ 8] .gnu.version_r VERNEED 0000000000400338 00000338
0000000000000020 0000000000000000 A 6 1 8

GCC拡張?

[ 9] .rela.dyn RELA 0000000000400358 00000358
0000000000000018 0000000000000018 A 5 0 8

.dynのための再配置情報。

[10] .rela.plt RELA 0000000000400370 00000370
0000000000000018 0000000000000018 A 5 12 8

.pltのための再配置情報。

[11] .init PROGBITS 0000000000400388 00000388
0000000000000018 0000000000000000 AX 0 0 4

mainプログラムのまえに呼ぶコード。

[12] .plt PROGBITS 00000000004003a0 000003a0
0000000000000020 0000000000000010 AX 0 0 4

procedure linkage table (手続きリンクテーブル)。

[13] .text PROGBITS 00000000004003c0 000003c0
00000000000001f8 0000000000000000 AX 0 0 16
[14] .fini PROGBITS 00000000004005b8 000005b8
000000000000000e 0000000000000000 AX 0 0 4

process termination codeの後で実行されるコード。

[15] .rodata PROGBITS 00000000004005c8 000005c8
0000000000000004 0000000000000004 AM 0 0 4

読み出し専用データを含む.

[16] .eh_frame_hdr PROGBITS 00000000004005cc 000005cc
000000000000002c 0000000000000000 A 0 0 4

GCC拡張?

[17] .eh_frame PROGBITS 00000000004005f8 000005f8
00000000000000b4 0000000000000000 A 0 0 8
[18] .ctors PROGBITS 0000000000600e18 00000e18
0000000000000010 0000000000000000 WA 0 0 8

GCC拡張?

[19] .dtors PROGBITS 0000000000600e28 00000e28
0000000000000010 0000000000000000 WA 0 0 8

GCC拡張?

[20] .jcr PROGBITS 0000000000600e38 00000e38
0000000000000008 0000000000000000 WA 0 0 8

GCC拡張?

[21] .dynamic DYNAMIC 0000000000600e40 00000e40
00000000000001a0 0000000000000010 WA 6 0 8

動的リンク情報。

[22] .got PROGBITS 0000000000600fe0 00000fe0
0000000000000008 0000000000000008 WA 0 0 8

global offset table。

[23] .got.plt PROGBITS 0000000000600fe8 00000fe8
0000000000000020 0000000000000008 WA 0 0 8

GCC拡張?

[24] .data PROGBITS 0000000000601010 00001010
0000000000000020 0000000000000000 WA 0 0 16
[25] .bss NOBITS 0000000000601030 00001030
0000000000000010 0000000000000000 WA 0 0 8
[26] .comment PROGBITS 0000000000000000 00001030
0000000000000128 0000000000000000 0 0 1
[27] .debug_aranges PROGBITS 0000000000000000 00001160
0000000000000090 0000000000000000 0 0 16

GCC拡張?DWARF拡張?

[28] .debug_pubnames PROGBITS 0000000000000000 000011f0
0000000000000025 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[29] .debug_info PROGBITS 0000000000000000 00001215
00000000000001d7 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[30] .debug_abbrev PROGBITS 0000000000000000 000013ec
000000000000006f 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[31] .debug_line PROGBITS 0000000000000000 0000145b
0000000000000151 0000000000000000 0 0 1

GCC拡張?DWARF拡張?

[32] .debug_str PROGBITS 0000000000000000 000015ac
00000000000000a7 0000000000000001 MS 0 0 1

GCC拡張?DWARF拡張?

[33] .debug_ranges PROGBITS 0000000000000000 00001660
0000000000000090 0000000000000000 0 0 16

GCC拡張?DWARF拡張?

[34] .shstrtab STRTAB 0000000000000000 000016f0
0000000000000149 0000000000000000 0 0 1
[35] .symtab SYMTAB 0000000000000000 00002180
0000000000000720 0000000000000018 36 58 8
[36] .strtab STRTAB 0000000000000000 000028a0
00000000000001ff 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:

プログラムヘッダは、ファイルの内部構造をメモリ上の
イメージにもっていくための中心的情報である。


Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align

フィールドの意味は次のとおり。

p_type :

各ヘッダエントリのタイプを表す。

PT_NULL (0)

このエントリは使われていないことを示す。

PT_LOAD (1)

loadableセグメント。

PT_DYNAMIC (2)

このエントリは、動的リンクに関する情報を保持する。

PT_INTERP (3)

このエントリは、インタプルタのパスを保持する。

PT_NOTE (4)

このエントリは、追加情報を保持する。

PT_SHLIB (5)

これはまだ運用されていない。

PT_PHDR (6)

プログラムヘッダの位置自身を示す。

PT_LOPROC (0x70000000)

プロセッサ固有のフラグ領域の開始位置。

PT_HIPROC (0x7fffffff)

プロセッサ固有のフラグ領域の終了位置。

p_offset :
セグメントの先頭バイトの位置(ファイル先頭からバイト
で測る)

p_vaddr :

セグメントの先頭バイトの位置(仮想アドレス上におい
て)

p_paddr :

セグメントの先頭バイトの位置(物理アドレス上におい
て)。物理アドレスに配置するシステム用。

p_filesz :

ファイル上における該当セグメントのサイズ。

p_memsz :

メモリ上における該当セグメントのサイズ。

p_flags :

PF_X
Execute
PF_W
Write
PF_R
Read
PF_MASKPROC
undefined (processor specific)

p_align :

ページ整列のための情報。

さて各ヘッダエントリ。

Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8


INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]


LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x00000000000006ac 0x00000000000006ac R E 200000


LOAD 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x0000000000000218 0x0000000000000228 RW 200000


DYNAMIC 0x0000000000000e40 0x0000000000600e40 0x0000000000600e40
0x00000000000001a0 0x00000000000001a0 RW 8


NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000020 0x0000000000000020 R 4


GNU_EH_FRAME 0x00000000000005cc 0x00000000004005cc 0x00000000004005cc
0x000000000000002c 0x000000000000002c R 4


GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 8


GNU_RELRO 0x0000000000000e18 0x0000000000600e18 0x0000000000600e18
0x00000000000001e8 0x00000000000001e8 R 1

Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag
06 .eh_frame_hdr
07
08 .ctors .dtors .jcr .dynamic .got

このマッピングは、ヘッダが明示的に保持しているので
はなく、Section ViewとProgram Viewを重ねあわせて、
readelfが構成しているのだと思う。

Dynamic section at offset 0xe40 contains 21 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000c (INIT) 0x400388
0x000000000000000d (FINI) 0x4005b8
0x0000000000000004 (HASH) 0x400278
0x000000006ffffef5 (GNU_HASH) 0x400290
0x0000000000000005 (STRTAB) 0x4002f8
0x0000000000000006 (SYMTAB) 0x4002b0
0x000000000000000a (STRSZ) 56 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x600fe8
0x0000000000000002 (PLTRELSZ) 24 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x400370
0x0000000000000007 (RELA) 0x400358
0x0000000000000008 (RELASZ) 24 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x400338
0x000000006fffffff (VERNEEDNUM) 1
0x000000006ffffff0 (VERSYM) 0x400330
0x0000000000000000 (NULL) 0x0


動的リンクは先の話題なので割愛。


Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000600fe0 000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0

Relocation section '.rela.plt' at offset 0x370 contains 1 entries:
Offset Info Type Sym. Value Sym. Name + Addend
000000601000 000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0

There are no unwind sections in this file.

Version symbols section '.gnu.version' contains 3 entries:
Addr: 0000000000400330 Offset: 0x000330 Link: 5 (.dynsym)
000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.2.5)

Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000400338 Offset: 0x000338 Link: 6 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.2.5 Flags: none Version: 2

Notes at offset 0x00000254 with length 0x00000020:
Owner Data size Description
GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag)
3.7 $

***** a.outのセクション全て
3.7 $ objdump -s a.out

a.out: file format elf64-x86-64

Contents of section .interp:
400238 2f6c6962 36342f6c 642d6c69 6e75782d /lib64/ld-linux-
400248 7838362d 36342e73 6f2e3200 x86-64.so.2.
Contents of section .note.ABI-tag:
400254 04000000 10000000 01000000 474e5500 ............GNU.
400264 00000000 02000000 06000000 08000000 ................
Contents of section .hash:
400278 01000000 03000000 02000000 00000000 ................
400288 00000000 01000000 ........
Contents of section .gnu.hash:
400290 01000000 01000000 01000000 00000000 ................
4002a0 00000000 00000000 00000000 ............
Contents of section .dynsym:
4002b0 00000000 00000000 00000000 00000000 ................
4002c0 00000000 00000000 01000000 20000000 ............ ...
4002d0 00000000 00000000 00000000 00000000 ................
4002e0 1a000000 12000000 00000000 00000000 ................
4002f0 00000000 00000000 ........
Contents of section .dynstr:
4002f8 005f5f67 6d6f6e5f 73746172 745f5f00 .__gmon_start__.
400308 6c696263 2e736f2e 36005f5f 6c696263 libc.so.6.__libc
400318 5f737461 72745f6d 61696e00 474c4942 _start_main.GLIB
400328 435f322e 322e3500 C_2.2.5.
Contents of section .gnu.version:
400330 00000000 0200 ......
Contents of section .gnu.version_r:
400338 01000100 10000000 10000000 00000000 ................
400348 751a6909 00000200 2c000000 00000000 u.i.....,.......
Contents of section .rela.dyn:
400358 e00f6000 00000000 06000000 01000000 ..`.............
400368 00000000 00000000 ........
Contents of section .rela.plt:
400370 00106000 00000000 07000000 02000000 ..`.............
400380 00000000 00000000 ........
Contents of section .init:
400388 4883ec08 e85b0000 00e8ea00 0000e8e5 H....[..........
400398 01000048 83c408c3 ...H....
Contents of section .plt:
4003a0 ff354a0c 2000ff25 4c0c2000 0f1f4000 .5J. ..%L. ...@.
4003b0 ff254a0c 20006800 000000e9 e0ffffff .%J. .h.........
Contents of section .text:
4003c0 31ed4989 d15e4889 e24883e4 f0505449 1.I..^H..H...PTI
4003d0 c7c0e004 400048c7 c1f00440 0048c7c7 ....@.H....@.H..
4003e0 c0044000 e8c7ffff fff49090 4883ec08 ..@.........H...
4003f0 488b05e9 0b200048 85c07402 ffd04883 H.... .H..t...H.
400400 c408c390 90909090 90909090 90909090 ................
400410 554889e5 534883ec 08803d10 0c200000 UH..SH....=.. ..
400420 754bb830 0e600048 8b150a0c 2000482d uK.0.`.H.... .H-
400430 280e6000 48c1f803 488d58ff 4839da73 (.`.H...H.X.H9.s
400440 250f1f80 00000000 488d4201 488905e5 %.......H.B.H...
400450 0b2000ff 14c5280e 6000488b 15d70b20 . ....(.`.H....
400460 004839da 72e2c605 c30b2000 014883c4 .H9.r..... ..H..
400470 085bc9c3 6666662e 0f1f8400 00000000 .[..fff.........
400480 5548833d af092000 004889e5 741ab800 UH.=.. ..H..t...
400490 00000048 85c07410 bf380e60 004989c3 ...H..t..8.`.I..
4004a0 c941ffe3 0f1f4000 c9c39090 554889e5 .A....@.....UH..
4004b0 48897df8 488b45f8 0fb600c9 c3909090 H.}.H.E.........
4004c0 554889e5 4883ec10 897dfc48 8975f0bf UH..H....}.H.u..
4004d0 20106000 e8d3ffff ffb80000 0000c9c3 .`.............
4004e0 f3c36666 6666662e 0f1f8400 00000000 ..fffff.........
4004f0 48896c24 d84c897c 24f8488d 2d130920 H.l$.L.|$.H.-..
400500 004c8d3d 0c092000 4c896424 e04c896c .L.=.. .L.d$.L.l
400510 24e84c89 7424f048 895c24d0 4883ec38 $.L.t$.H.\$.H..8
400520 4c29fd41 89fe4989 f548c1fd 034989d4 L).A..I..H...I..
400530 e853feff ff4885ed 741c31db 0f1f4000 .S...H..t.1...@.
400540 4c89e24c 89ee4489 f741ff14 df4883c3 L..L..D..A...H..
400550 014839eb 72ea488b 5c240848 8b6c2410 .H9.r.H.\$.H.l$.
400560 4c8b6424 184c8b6c 24204c8b 7424284c L.d$.L.l$ L.t$(L
400570 8b7c2430 4883c438 c3909090 90909090 .|$0H..8........
400580 554889e5 534883ec 08488b05 88082000 UH..SH...H.... .
400590 4883f8ff 7419bb18 0e60000f 1f440000 H...t....`...D..
4005a0 4883eb08 ffd0488b 034883f8 ff75f148 H.....H..H...u.H
4005b0 83c4085b c9c39090 ...[....
Contents of section .fini:
4005b8 4883ec08 e84ffeff ff4883c4 08c3 H....O...H....
Contents of section .rodata:
4005c8 01000200 ....
Contents of section .eh_frame_hdr:
4005cc 011b033b 28000000 04000000 e0feffff ...;(...........
4005dc 44000000 f4feffff 64000000 14ffffff D.......d.......
4005ec 9c000000 24ffffff b4000000 ....$.......
Contents of section .eh_frame:
4005f8 14000000 00000000 017a5200 01781001 .........zR..x..
400608 030c0708 90010000 1c000000 1c000000 ................
400618 ac044000 11000000 00410e10 8602430d ..@......A....C.
400628 06000000 00000000 1c000000 3c000000 ............<...
400638 c0044000 20000000 00410e10 8602430d ..@. ....A....C.
400648 06000000 00000000 14000000 00000000 ................
400658 017a5200 01781001 1b0c0708 90010000 .zR..x..........
400668 14000000 1c000000 70feffff 02000000 ........p.......
400678 00000000 00000000 24000000 34000000 ........$...4...
400688 68feffff 89000000 004a8f02 8606660e h........J....f.
400698 4083078e 038d048c 05000000 00000000 @...............
4006a8 00000000 ....
Contents of section .ctors:
600e18 ffffffff ffffffff 00000000 00000000 ................
Contents of section .dtors:
600e28 ffffffff ffffffff 00000000 00000000 ................
Contents of section .jcr:
600e38 00000000 00000000 ........
Contents of section .dynamic:
600e40 01000000 00000000 10000000 00000000 ................
600e50 0c000000 00000000 88034000 00000000 ..........@.....
600e60 0d000000 00000000 b8054000 00000000 ..........@.....
600e70 04000000 00000000 78024000 00000000 ........x.@.....
600e80 f5feff6f 00000000 90024000 00000000 ...o......@.....
600e90 05000000 00000000 f8024000 00000000 ..........@.....
600ea0 06000000 00000000 b0024000 00000000 ..........@.....
600eb0 0a000000 00000000 38000000 00000000 ........8.......
600ec0 0b000000 00000000 18000000 00000000 ................
600ed0 15000000 00000000 00000000 00000000 ................
600ee0 03000000 00000000 e80f6000 00000000 ..........`.....
600ef0 02000000 00000000 18000000 00000000 ................
600f00 14000000 00000000 07000000 00000000 ................
600f10 17000000 00000000 70034000 00000000 ........p.@.....
600f20 07000000 00000000 58034000 00000000 ........X.@.....
600f30 08000000 00000000 18000000 00000000 ................
600f40 09000000 00000000 18000000 00000000 ................
600f50 feffff6f 00000000 38034000 00000000 ...o....8.@.....
600f60 ffffff6f 00000000 01000000 00000000 ...o............
600f70 f0ffff6f 00000000 30034000 00000000 ...o....0.@.....
600f80 00000000 00000000 00000000 00000000 ................
600f90 00000000 00000000 00000000 00000000 ................
600fa0 00000000 00000000 00000000 00000000 ................
600fb0 00000000 00000000 00000000 00000000 ................
600fc0 00000000 00000000 00000000 00000000 ................
600fd0 00000000 00000000 00000000 00000000 ................
Contents of section .got:
600fe0 00000000 00000000 ........
Contents of section .got.plt:
600fe8 400e6000 00000000 00000000 00000000 @.`.............
600ff8 00000000 00000000 b6034000 00000000 ..........@.....
Contents of section .data:
601010 00000000 00000000 00000000 00000000 ................
601020 48656c6c 6f2c2077 6f726c64 211b6e00 Hello, world!.n.
Contents of section .comment:
0000 00474343 3a202855 62756e74 7520342e .GCC: (Ubuntu 4.
0010 332e322d 31756275 6e747531 32292034 3.2-1ubuntu12) 4
0020 2e332e32 00004743 433a2028 5562756e .3.2..GCC: (Ubun
0030 74752034 2e332e32 2d317562 756e7475 tu 4.3.2-1ubuntu
0040 31322920 342e332e 32000047 43433a20 12) 4.3.2..GCC:
0050 28556275 6e747520 342e332e 322d3175 (Ubuntu 4.3.2-1u
0060 62756e74 75313229 20342e33 2e320000 buntu12) 4.3.2..
0070 4743433a 20285562 756e7475 20342e33 GCC: (Ubuntu 4.3
0080 2e322d31 7562756e 74753132 2920342e .2-1ubuntu12) 4.
0090 332e3200 00474343 3a202855 62756e74 3.2..GCC: (Ubunt
00a0 7520342e 332e322d 31756275 6e747531 u 4.3.2-1ubuntu1
00b0 32292034 2e332e32 00004743 433a2028 2) 4.3.2..GCC: (
00c0 5562756e 74752034 2e332e32 2d317562 Ubuntu 4.3.2-1ub
00d0 756e7475 31322920 342e332e 32000047 untu12) 4.3.2..G
00e0 43433a20 28556275 6e747520 342e332e CC: (Ubuntu 4.3.
00f0 322d3175 62756e74 75313229 20342e33 2-1ubuntu12) 4.3
0100 2e320000 4743433a 20285562 756e7475 .2..GCC: (Ubuntu
0110 20342e33 2e322d31 7562756e 74753132 4.3.2-1ubuntu12
0120 2920342e 332e3200 ) 4.3.2.
Contents of section .debug_aranges:
0000 4c000000 02008b00 00000800 00000000 L...............
0010 ec034000 00000000 17000000 00000000 ..@.............
0020 88034000 00000000 09000000 00000000 ..@.............
0030 b8054000 00000000 04000000 00000000 ..@.............
0040 00000000 00000000 00000000 00000000 ................
0050 3c000000 02003101 00000800 00000000 <.....1.........
0060 9b034000 00000000 05000000 00000000 ..@.............
0070 c1054000 00000000 05000000 00000000 ..@.............
0080 00000000 00000000 00000000 00000000 ................
Contents of section .debug_pubnames:
0000 21000000 02000000 00008b00 00006f00 !.............o.
0010 00005f49 4f5f7374 64696e5f 75736564 .._IO_stdin_used
0020 00000000 00 .....
Contents of section .debug_info:
0000 87000000 02000000 00000801 00000000 ................
0010 01a00000 00380000 00ec0340 00000000 .....8.....@....
0020 00ec0340 00000000 00000000 00020108 ...@............
0030 77000000 0202070c 00000002 04079300 w...............
0040 00000208 078e0000 00020106 79000000 ............y...
0050 0202051f 00000003 0405696e 74000208 ..........int...
0060 05850000 00040807 02010680 00000005 ................
0070 29000000 01198500 00000109 03c80540 )..............@
0080 00000000 00065700 000000a2 00000002 ......W.........
0090 004b0000 00080127 00000000 0000002f .K.....'......./
00a0 6275696c 642f6275 696c6464 2f676c69 build/buildd/gli
00b0 62632d32 2e387e32 30303830 3530352f bc-2.8~20080505/
00c0 6275696c 642d7472 65652f61 6d643634 build-tree/amd64
00d0 2d6c6962 632f6373 752f6372 74692e53 -libc/csu/crti.S
00e0 002f6275 696c642f 6275696c 64642f67 ./build/buildd/g
00f0 6c696263 2d322e38 7e323030 38303530 libc-2.8~2008050
0100 352f6275 696c642d 74726565 2f676c69 5/build-tree/gli
0110 62632d32 30303830 3530352f 63737500 bc-20080505/csu.
0120 474e5520 41532032 2e31382e 39330001 GNU AS 2.18.93..
0130 80a20000 0002005d 00000008 01c90000 .......]........
0140 00500000 002f6275 696c642f 6275696c .P.../build/buil
0150 64642f67 6c696263 2d322e38 7e323030 dd/glibc-2.8~200
0160 38303530 352f6275 696c642d 74726565 80505/build-tree
0170 2f616d64 36342d6c 6962632f 6373752f /amd64-libc/csu/
0180 6372746e 2e53002f 6275696c 642f6275 crtn.S./build/bu
0190 696c6464 2f676c69 62632d32 2e387e32 ildd/glibc-2.8~2
01a0 30303830 3530352f 6275696c 642d7472 0080505/build-tr
01b0 65652f67 6c696263 2d323030 38303530 ee/glibc-2008050
01c0 352f6373 7500474e 55204153 20322e31 5/csu.GNU AS 2.1
01d0 382e3933 000180 8.93...
Contents of section .debug_abbrev:
0000 01110125 0e130b03 0e1b0e11 01120110 ...%............
0010 06000002 24000b0b 3e0b030e 00000324 ....$...>......$
0020 000b0b3e 0b030800 00042400 0b0b3e0b ...>......$...>.
0030 00000534 00030e3a 0b3b0b49 133f0c02 ...4...:.;.I.?..
0040 0a000006 26004913 00000001 11001006 ....&.I.........
0050 55060308 1b082508 13050000 00011100 U.....%.........
0060 10065506 03081b08 25081305 000000 ..U.....%......
Contents of section .debug_line:
0000 23000000 02001d00 00000101 fb0e0d00 #...............
0010 01010101 00000001 00000100 696e6974 ............init
0020 2e630000 0000009e 00000002 00580000 .c...........X..
0030 000101fb 0e0d0001 01010100 00000100 ................
0040 00012f62 75696c64 2f627569 6c64642f ../build/buildd/
0050 676c6962 632d322e 387e3230 30383035 glibc-2.8~200805
0060 30352f62 75696c64 2d747265 652f616d 05/build-tree/am
0070 6436342d 6c696263 2f637375 00006372 d64-libc/csu..cr
0080 74692e53 00010000 00000902 ec034000 ti.S..........@.
0090 00000000 030a014b 753d2f30 4b020100 .......Ku=/0K...
00a0 01010009 02880340 00000000 00031801 .......@........
00b0 4b020500 01010009 02b80540 00000000 K..........@....
00c0 00032401 02040001 01840000 00020058 ..$............X
00d0 00000001 01fb0e0d 00010101 01000000 ................
00e0 01000001 2f627569 6c642f62 75696c64 ..../build/build
00f0 642f676c 6962632d 322e387e 32303038 d/glibc-2.8~2008
0100 30353035 2f627569 6c642d74 7265652f 0505/build-tree/
0110 616d6436 342d6c69 62632f63 73750000 amd64-libc/csu..
0120 6372746e 2e530001 00000000 09029b03 crtn.S..........
0130 40000000 00001a4b 02010001 01000902 @......K........
0140 c1054000 00000000 030f014b 02010001 ..@........K....
0150 01 .
Contents of section .debug_str:
0000 474e5520 4320342e 332e3200 73686f72 GNU C 4.3.2.shor
0010 7420756e 7369676e 65642069 6e740073 t unsigned int.s
0020 686f7274 20696e74 005f494f 5f737464 hort int._IO_std
0030 696e5f75 73656400 2f627569 6c642f62 in_used./build/b
0040 75696c64 642f676c 6962632d 322e387e uildd/glibc-2.8~
0050 32303038 30353035 2f627569 6c642d74 20080505/build-t
0060 7265652f 676c6962 632d3230 30383035 ree/glibc-200805
0070 30352f63 73750075 6e736967 6e656420 05/csu.unsigned
0080 63686172 006c6f6e 6720696e 74006c6f char.long int.lo
0090 6e672075 6e736967 6e656420 696e7400 ng unsigned int.
00a0 696e6974 2e6300 init.c.
Contents of section .debug_ranges:
0000 ffffffff ffffffff 00000000 00000000 ................
0010 ec034000 00000000 03044000 00000000 ..@.......@.....
0020 88034000 00000000 91034000 00000000 ..@.......@.....
0030 b8054000 00000000 bc054000 00000000 ..@.......@.....
0040 00000000 00000000 00000000 00000000 ................
0050 ffffffff ffffffff 00000000 00000000 ................
0060 9b034000 00000000 a0034000 00000000 ..@.......@.....
0070 c1054000 00000000 c6054000 00000000 ..@.......@.....
0080 00000000 00000000 00000000 00000000 ................
3.7 $
***** a.outのdisassemble
3.7 $ objdump -d a.out

a.out: file format elf64-x86-64


Disassembly of section .init:

0000000000400388 <_init>:
400388: 48 83 ec 08 sub $0x8,%rsp
40038c: e8 5b 00 00 00 callq 4003ec
400391: e8 ea 00 00 00 callq 400480
400396: e8 e5 01 00 00 callq 400580 <__do_global_ctors_aux>
40039b: 48 83 c4 08 add $0x8,%rsp
40039f: c3 retq

Disassembly of section .plt:

00000000004003a0 <__libc_start_main@plt-0x10>:
4003a0: ff 35 4a 0c 20 00 pushq 0x200c4a(%rip) # 600ff0 <_GLOBAL_OFFSET_TABLE_+0x8>
4003a6: ff 25 4c 0c 20 00 jmpq *0x200c4c(%rip) # 600ff8 <_GLOBAL_OFFSET_TABLE_+0x10>
4003ac: 0f 1f 40 00 nopl 0x0(%rax)

00000000004003b0 <__libc_start_main@plt>:
4003b0: ff 25 4a 0c 20 00 jmpq *0x200c4a(%rip) # 601000 <_GLOBAL_OFFSET_TABLE_+0x18>
4003b6: 68 00 00 00 00 pushq $0x0
4003bb: e9 e0 ff ff ff jmpq 4003a0 <_init+0x18>

Disassembly of section .text:

00000000004003c0 <_start>:
4003c0: 31 ed xor %ebp,%ebp
4003c2: 49 89 d1 mov %rdx,%r9
4003c5: 5e pop %rsi
4003c6: 48 89 e2 mov %rsp,%rdx
4003c9: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
4003cd: 50 push %rax
4003ce: 54 push %rsp
4003cf: 49 c7 c0 e0 04 40 00 mov $0x4004e0,%r8
4003d6: 48 c7 c1 f0 04 40 00 mov $0x4004f0,%rcx
4003dd: 48 c7 c7 c0 04 40 00 mov $0x4004c0,%rdi
4003e4: e8 c7 ff ff ff callq 4003b0 <__libc_start_main@plt>
4003e9: f4 hlt
4003ea: 90 nop
4003eb: 90 nop

00000000004003ec <call_gmon_start>:
4003ec: 48 83 ec 08 sub $0x8,%rsp
4003f0: 48 8b 05 e9 0b 20 00 mov 0x200be9(%rip),%rax # 600fe0 <_DYNAMIC+0x1a0>
4003f7: 48 85 c0 test %rax,%rax
4003fa: 74 02 je 4003fe <call_gmon_start+0x12>
4003fc: ff d0 callq *%rax
4003fe: 48 83 c4 08 add $0x8,%rsp
400402: c3 retq
400403: 90 nop
400404: 90 nop
400405: 90 nop
400406: 90 nop
400407: 90 nop
400408: 90 nop
400409: 90 nop
40040a: 90 nop
40040b: 90 nop
40040c: 90 nop
40040d: 90 nop
40040e: 90 nop
40040f: 90 nop

0000000000400410 <__do_global_dtors_aux>:
400410: 55 push %rbp
400411: 48 89 e5 mov %rsp,%rbp
400414: 53 push %rbx
400415: 48 83 ec 08 sub $0x8,%rsp
400419: 80 3d 10 0c 20 00 00 cmpb $0x0,0x200c10(%rip) # 601030 <__bss_start>
400420: 75 4b jne 40046d <__do_global_dtors_aux+0x5d>
400422: b8 30 0e 60 00 mov $0x600e30,%eax
400427: 48 8b 15 0a 0c 20 00 mov 0x200c0a(%rip),%rdx # 601038
40042e: 48 2d 28 0e 60 00 sub $0x600e28,%rax
400434: 48 c1 f8 03 sar $0x3,%rax
400438: 48 8d 58 ff lea -0x1(%rax),%rbx
40043c: 48 39 da cmp %rbx,%rdx
40043f: 73 25 jae 400466 <__do_global_dtors_aux+0x56>
400441: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
400448: 48 8d 42 01 lea 0x1(%rdx),%rax
40044c: 48 89 05 e5 0b 20 00 mov %rax,0x200be5(%rip) # 601038
400453: ff 14 c5 28 0e 60 00 callq *0x600e28(,%rax,8)
40045a: 48 8b 15 d7 0b 20 00 mov 0x200bd7(%rip),%rdx # 601038
400461: 48 39 da cmp %rbx,%rdx
400464: 72 e2 jb 400448 <__do_global_dtors_aux+0x38>
400466: c6 05 c3 0b 20 00 01 movb $0x1,0x200bc3(%rip) # 601030 <__bss_start>
40046d: 48 83 c4 08 add $0x8,%rsp
400471: 5b pop %rbx
400472: c9 leaveq
400473: c3 retq
400474: 66 66 66 2e 0f 1f 84 nopw %cs:0x0(%rax,%rax,1)
40047b: 00 00 00 00 00

0000000000400480 <frame_dummy>:
400480: 55 push %rbp
400481: 48 83 3d af 09 20 00 cmpq $0x0,0x2009af(%rip) # 600e38 <__JCR_END__>
400488: 00
400489: 48 89 e5 mov %rsp,%rbp
40048c: 74 1a je 4004a8 <frame_dummy+0x28>
40048e: b8 00 00 00 00 mov $0x0,%eax
400493: 48 85 c0 test %rax,%rax
400496: 74 10 je 4004a8 <frame_dummy+0x28>
400498: bf 38 0e 60 00 mov $0x600e38,%edi
40049d: 49 89 c3 mov %rax,%r11
4004a0: c9 leaveq
4004a1: 41 ff e3 jmpq *%r11
4004a4: 0f 1f 40 00 nopl 0x0(%rax)
4004a8: c9 leaveq
4004a9: c3 retq
4004aa: 90 nop
4004ab: 90 nop

00000000004004ac <a>:
4004ac: 55 push %rbp
4004ad: 48 89 e5 mov %rsp,%rbp
4004b0: 48 89 7d f8 mov %rdi,-0x8(%rbp)
4004b4: 48 8b 45 f8 mov -0x8(%rbp),%rax
4004b8: 0f b6 00 movzbl (%rax),%eax
4004bb: c9 leaveq
4004bc: c3 retq
4004bd: 90 nop
4004be: 90 nop
4004bf: 90 nop

00000000004004c0 <main>:
4004c0: 55 push %rbp
4004c1: 48 89 e5 mov %rsp,%rbp
4004c4: 48 83 ec 10 sub $0x10,%rsp
4004c8: 89 7d fc mov %edi,-0x4(%rbp)
4004cb: 48 89 75 f0 mov %rsi,-0x10(%rbp)
4004cf: bf 20 10 60 00 mov $0x601020,%edi
4004d4: e8 d3 ff ff ff callq 4004ac <a>
4004d9: b8 00 00 00 00 mov $0x0,%eax
4004de: c9 leaveq
4004df: c3 retq

00000000004004e0 <__libc_csu_fini>:
4004e0: f3 c3 repz retq
4004e2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004e9: 1f 84 00 00 00 00 00

00000000004004f0 <__libc_csu_init>:
4004f0: 48 89 6c 24 d8 mov %rbp,-0x28(%rsp)
4004f5: 4c 89 7c 24 f8 mov %r15,-0x8(%rsp)
4004fa: 48 8d 2d 13 09 20 00 lea 0x200913(%rip),%rbp # 600e14 <__init_array_end>
400501: 4c 8d 3d 0c 09 20 00 lea 0x20090c(%rip),%r15 # 600e14 <__init_array_end>
400508: 4c 89 64 24 e0 mov %r12,-0x20(%rsp)
40050d: 4c 89 6c 24 e8 mov %r13,-0x18(%rsp)
400512: 4c 89 74 24 f0 mov %r14,-0x10(%rsp)
400517: 48 89 5c 24 d0 mov %rbx,-0x30(%rsp)
40051c: 48 83 ec 38 sub $0x38,%rsp
400520: 4c 29 fd sub %r15,%rbp
400523: 41 89 fe mov %edi,%r14d
400526: 49 89 f5 mov %rsi,%r13
400529: 48 c1 fd 03 sar $0x3,%rbp
40052d: 49 89 d4 mov %rdx,%r12
400530: e8 53 fe ff ff callq 400388 <_init>
400535: 48 85 ed test %rbp,%rbp
400538: 74 1c je 400556 <__libc_csu_init+0x66>
40053a: 31 db xor %ebx,%ebx
40053c: 0f 1f 40 00 nopl 0x0(%rax)
400540: 4c 89 e2 mov %r12,%rdx
400543: 4c 89 ee mov %r13,%rsi
400546: 44 89 f7 mov %r14d,%edi
400549: 41 ff 14 df callq *(%r15,%rbx,8)
40054d: 48 83 c3 01 add $0x1,%rbx
400551: 48 39 eb cmp %rbp,%rbx
400554: 72 ea jb 400540 <__libc_csu_init+0x50>
400556: 48 8b 5c 24 08 mov 0x8(%rsp),%rbx
40055b: 48 8b 6c 24 10 mov 0x10(%rsp),%rbp
400560: 4c 8b 64 24 18 mov 0x18(%rsp),%r12
400565: 4c 8b 6c 24 20 mov 0x20(%rsp),%r13
40056a: 4c 8b 74 24 28 mov 0x28(%rsp),%r14
40056f: 4c 8b 7c 24 30 mov 0x30(%rsp),%r15
400574: 48 83 c4 38 add $0x38,%rsp
400578: c3 retq
400579: 90 nop
40057a: 90 nop
40057b: 90 nop
40057c: 90 nop
40057d: 90 nop
40057e: 90 nop
40057f: 90 nop

0000000000400580 <__do_global_ctors_aux>:
400580: 55 push %rbp
400581: 48 89 e5 mov %rsp,%rbp
400584: 53 push %rbx
400585: 48 83 ec 08 sub $0x8,%rsp
400589: 48 8b 05 88 08 20 00 mov 0x200888(%rip),%rax # 600e18 <__CTOR_LIST__>
400590: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
400594: 74 19 je 4005af <__do_global_ctors_aux+0x2f>
400596: bb 18 0e 60 00 mov $0x600e18,%ebx
40059b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
4005a0: 48 83 eb 08 sub $0x8,%rbx
4005a4: ff d0 callq *%rax
4005a6: 48 8b 03 mov (%rbx),%rax
4005a9: 48 83 f8 ff cmp $0xffffffffffffffff,%rax
4005ad: 75 f1 jne 4005a0 <__do_global_ctors_aux+0x20>
4005af: 48 83 c4 08 add $0x8,%rsp
4005b3: 5b pop %rbx
4005b4: c9 leaveq
4005b5: c3 retq
4005b6: 90 nop
4005b7: 90 nop

Disassembly of section .fini:

00000000004005b8 <_fini>:
4005b8: 48 83 ec 08 sub $0x8,%rsp
4005bc: e8 4f fe ff ff callq 400410 <__do_global_dtors_aux>
4005c1: 48 83 c4 08 add $0x8,%rsp
4005c5: c3 retq
3.7 $

0 件のコメント: