2016-10-09 17 views
7

私はコンパイラを作成しており、ELF実行ファイルを最初から生成し始めています。 .textセクションを作成しています(ただし、まだ文字列テーブルを作成していないため名前はありません)。PT_LOADセグメント内に配置しようとしています。しかし、readelfは、セクションがセグメントにマップされていると報告しておらず、objdump.textセクションのコードを逆アセンブルすることを拒否します。これは、簡潔にするため省略し、いくつかのビットで、readelfの読み出しである:ELFセクションがセグメントに期待どおりにマッピングされていない

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:    0x0 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   122 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   1 
    Size of section headers:   64 (bytes) 
    Number of section headers:   2 
    Section header string table index: 0 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
    [ 0] <no-name>   NULL    0000000000000000 00000000 
     0000000000000000 0000000000000000   0  0  0 
    [ 1] <no-name>   PROGBITS   0000000008048000 00000078 
     0000000000000002 0000000000000000 AX  0  0  16 
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) 

There are no section groups in this file. 

Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    LOAD   0x0000000000000078 0x0000000008048000 0x0000000008048000 
       0x0000000000000002 0x0000000000000002 R E 1000 

では0x78オフセット、私はテストのために2つのpush ebx S(オペコード0x53)を放出しています。ここ進ダンプは次のとおりです。

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 3e 00 01 00 00 00 00 00 00 00 00 00 00 00 |..>.............| 
00000020 40 00 00 00 00 00 00 00 7a 00 00 00 00 00 00 00 |@.......z.......| 
00000030 00 00 00 00 40 00 38 00 01 00 40 00 02 00 00 00 |[email protected]@.....| 
00000040 01 00 00 00 05 00 00 00 78 00 00 00 00 00 00 00 |........x.......| 
00000050 00 80 04 08 00 00 00 00 00 80 04 08 00 00 00 00 |................| 
00000060 02 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 |................| 
00000070 00 10 00 00 00 00 00 00 53 53 00 00 00 00 00 00 |........SS......| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 |................| 
000000c0 00 00 06 00 00 00 00 00 00 00 00 80 04 08 00 00 |................| 
000000d0 00 00 78 00 00 00 00 00 00 00 02 00 00 00 00 00 |..x.............| 
000000e0 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 |................| 
* 
000000fa 

編集:質問 - 両者の間に示されたセグメントへのマッピングセクションではなく、なぜ何の解体がobjdumpで示されていないのはなぜ?

+0

質問がありましたか?あなたは事実の束を述べ、そして...?あなたの質問が "なぜセクションをマッピングするためにセクションを表示しないのですか?その答えは、名前なしのセクションを作成しないでください"ということです。 –

+0

@EmployedRussian - 質問が追加されました。 'objdump'で逆アセンブルしてマッピングを表示するために必要なセクション名を持つ文字列テーブルですか?私は家に帰るときに文字列テーブルを追加してみて、違いがあるかどうかを確認します。ありがとう! –

+0

@EmployedRussian yup - 何らかの理由でマッピングを報告するために文字列テーブルが必要なようです。それを回答として投稿したいなら、私はそれを受け入れます。 –

答えて

1

(限りreadelfを伝えることができるように)何有効セクションが存在しないので、なぜ2

間示すセグメントへのマッピングセクションではありません。

なぜ、逆アセンブリはobjdumpによって表示されませんか?

objdumpセクションを使用しています。

実行可能ファイルの一部が存在する必要はありませんが、多くのツールは存在するセクションに依存します。たとえば、実行可能ファイルにある唯一のセグメントには、コードとELFヘッダーとプログラムヘッダーの両方が含まれています。一般的にを入力しないでくださいヘッダーを逆アセンブルします。セクションがなければ、objdumpはどこから逆アセンブリを開始するのかわかりません。

+2

詳しくは、有効なセクションについては、 'name'フィールドが有効な文字列テーブル内の非ゼロのエントリを指していなければなりません。 –

関連する問題