C言語を挫折した人間なので、バイナリとかアセンブラとかは全く分からない。
スクリプト言語サイコーなのだが、どうしたってサーバを動かしていれば
C言語で書かれた、デーモンやら何やらでトラブルは起きる。
先日もデーモンプログラムで、どうも変な挙動をしていたのだが
古いプログラムで、しかもソースから入れていることもあって
なんとか自力で原因究明しなくてはならなくなった。
元々、デバッグ情報付きでコンパイルされてなく
オプションを付けてコンパイルしなくてはならなかったのだが
付けたはずのオプションが、どっかで無効になったのか
gdbで実行すると、デバッグ情報が無いよ! と怒られまくった。
デバッグ情報が付かなかったのは、Makefile内の修正箇所ミスだったのだが
都度gdbを実行してから怒られており、もっと簡単に知る方法はないのかと調査した。
- 結果
1 |
$ readelf -S 実行ファイル |
だそうです。
- 試しにやってみた
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
$ readelf -S httpd There are 36 section headers, starting at offset 0x4f96dc: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048114 000114 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048128 000128 000020 00 A 0 0 4 [ 3] .hash HASH 08048148 000148 009430 04 A 4 0 4 [ 4] .dynsym DYNSYM 08051578 009578 015070 10 A 5 1 4 [ 5] .dynstr STRTAB 080665e8 01e5e8 015ea1 00 A 0 0 1 [ 6] .gnu.version VERSYM 0807c48a 03448a 002a0e 02 A 4 0 2 [ 7] .gnu.version_r VERNEED 0807ee98 036e98 0000a0 00 A 5 3 4 [ 8] .rel.dyn REL 0807ef38 036f38 000060 08 A 4 0 4 [ 9] .rel.plt REL 0807ef98 036f98 0015c8 08 A 4 b 4 [10] .init PROGBITS 08080560 038560 0000e7 00 AX 0 0 16 [11] .plt PROGBITS 08080648 038648 002ba0 04 AX 0 0 4 [12] .text PROGBITS 08083200 03b200 0f73a4 00 AX 0 0 64 [13] .fini PROGBITS 0817a5a4 1325a4 00001b 00 AX 0 0 4 [14] .rodata PROGBITS 0817a5c0 1325c0 043ddc 00 A 0 0 32 [15] .eh_frame_hdr PROGBITS 081be39c 17639c 00004c 00 A 0 0 4 [16] .eh_frame PROGBITS 081be3e8 1763e8 00021c 00 A 0 0 4 [17] .data PROGBITS 081bf620 176620 011640 00 WA 0 0 32 [18] .dynamic DYNAMIC 081d0c60 187c60 000118 08 WA 5 0 4 [19] .ctors PROGBITS 081d0d78 187d78 000008 00 WA 0 0 4 [20] .dtors PROGBITS 081d0d80 187d80 000008 00 WA 0 0 4 [21] .jcr PROGBITS 081d0d88 187d88 000004 00 WA 0 0 4 [22] .got PROGBITS 081d0d8c 187d8c 000af4 04 WA 0 0 4 [23] .bss NOBITS 081d1880 188880 00822c 00 WA 0 0 32 [24] .comment PROGBITS 00000000 188880 0059cd 00 0 0 1 [25] .debug_aranges PROGBITS 00000000 18e250 000b18 00 0 0 8 [26] .debug_pubnames PROGBITS 00000000 18ed68 00c7a5 00 0 0 1 [27] .debug_info PROGBITS 00000000 19b50d 2ee565 00 0 0 1 [28] .debug_abbrev PROGBITS 00000000 489a72 0125c5 00 0 0 1 [29] .debug_line PROGBITS 00000000 49c037 02d6a8 00 0 0 1 [30] .debug_frame PROGBITS 00000000 4c96e0 0101f0 00 0 0 4 [31] .debug_str PROGBITS 00000000 4d98d0 01cc33 01 MS 0 0 1 [32] .debug_ranges PROGBITS 00000000 4f6503 003090 00 0 0 1 [33] .shstrtab STRTAB 00000000 4f9593 000147 00 0 0 1 [34] .symtab SYMTAB 00000000 4f9c7c 0208b0 10 35 b85 4 [35] .strtab STRTAB 00000000 51a52c 025b11 00 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) |
.debug_infoというセクションが有ると、デバッグ情報付きです。
とあるapacheはデバッグ情報付きでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
$ readelf -S /usr/lib/firefox/firefox There are 29 section headers, starting at offset 0x12180: 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 0000000000000270 00000270 000000000000001c 0000000000000000 A 0 0 1 [ 2] .note.ABI-tag NOTE 000000000000028c 0000028c 0000000000000020 0000000000000000 A 0 0 4 [ 3] .note.gnu.build-i NOTE 00000000000002ac 000002ac 0000000000000024 0000000000000000 A 0 0 4 [ 4] .gnu.hash GNU_HASH 00000000000002d0 000002d0 0000000000000174 0000000000000000 A 5 0 8 [ 5] .dynsym DYNSYM 0000000000000448 00000448 0000000000000a20 0000000000000018 A 6 3 8 [ 6] .dynstr STRTAB 0000000000000e68 00000e68 000000000000082e 0000000000000000 A 0 0 1 [ 7] .gnu.version VERSYM 0000000000001696 00001696 00000000000000d8 0000000000000002 A 5 0 2 [ 8] .gnu.version_r VERNEED 0000000000001770 00001770 0000000000000110 0000000000000000 A 6 6 8 [ 9] .rela.dyn RELA 0000000000001880 00001880 00000000000003a8 0000000000000018 A 5 0 8 [10] .rela.plt RELA 0000000000001c28 00001c28 0000000000000570 0000000000000018 A 5 12 8 [11] .init PROGBITS 0000000000002198 00002198 0000000000000018 0000000000000000 AX 0 0 4 [12] .plt PROGBITS 00000000000021b0 000021b0 00000000000003b0 0000000000000010 AX 0 0 16 [13] .text PROGBITS 0000000000002560 00002560 000000000000ad68 0000000000000000 AX 0 0 16 [14] .fini PROGBITS 000000000000d2c8 0000d2c8 000000000000000e 0000000000000000 AX 0 0 4 [15] .rodata PROGBITS 000000000000d2e0 0000d2e0 0000000000000ef4 0000000000000000 A 0 0 16 [16] .eh_frame_hdr PROGBITS 000000000000e1d4 0000e1d4 0000000000000784 0000000000000000 A 0 0 4 [17] .eh_frame PROGBITS 000000000000e958 0000e958 0000000000002504 0000000000000000 A 0 0 8 [18] .tbss NOBITS 0000000000211a20 00011a20 0000000000000009 0000000000000000 WAT 0 0 8 [19] .ctors PROGBITS 0000000000211a20 00011a20 0000000000000010 0000000000000000 WA 0 0 8 [20] .dtors PROGBITS 0000000000211a30 00011a30 0000000000000010 0000000000000000 WA 0 0 8 [21] .jcr PROGBITS 0000000000211a40 00011a40 0000000000000008 0000000000000000 WA 0 0 8 [22] .data.rel.ro PROGBITS 0000000000211a50 00011a50 0000000000000178 0000000000000000 WA 0 0 16 [23] .dynamic DYNAMIC 0000000000211bc8 00011bc8 0000000000000200 0000000000000010 WA 6 0 8 [24] .got PROGBITS 0000000000211dc8 00011dc8 0000000000000238 0000000000000008 WA 0 0 8 [25] .data PROGBITS 0000000000212000 00012000 0000000000000070 0000000000000000 WA 0 0 16 [26] .bss NOBITS 0000000000212070 00012070 00000000000003b8 0000000000000000 WA 0 0 16 [27] .gnu_debuglink PROGBITS 0000000000000000 00012070 000000000000000c 0000000000000000 0 0 1 [28] .shstrtab STRTAB 0000000000000000 0001207c 00000000000000fe 0000000000000000 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), l (large) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) |
ubuntu 12.04 amd64にパッケージで入れたfirefoxは.debug_infoというセクションはありません。
.gnu_debuglink があやしい気がしますが詳細は調べてません。