2016-11-27 23 views
1

ロードセグメントに.textセクションをロードしてELF実行ファイルを生成しています。それは細かい分解しますが、gdbの下でそれを実行しようとするDuring startup program terminated with signal SIGSEGV, Segmentation fault.起動時に生成されたELF実行可能ファイルsegfault

readelfが与える与える:

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:    0x400056 
    Start of program headers:   759 (bytes into file) 
    Start of section headers:   503 (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:   4 
    Section header string table index: 2 

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   0000000000400040 00000040 
     000000000000005b 0000000000000000 AX  0  0  16 
    [ 2] .strtab   STRTAB   0000000000000000 0000009b 
     000000000000009c 0000000000000000   0  0  4 
    [ 3] .symtab   SYMTAB   0000000000000000 00000137 
     00000000000000c0 0000000000000018   2  1  4 
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   0x0000000000000040 0x0000000000400000 0x0000000000400000 
       0x000000000000009b 0x000000000000009b R E 200000 

Section to Segment mapping: 
    Segment Sections... 
    00  .text 

There is no dynamic section in this file. 

There are no relocations in this file. 

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported. 

Symbol table '.symtab' contains 8 entries: 
    Num: Value   Size Type Bind Vis  Ndx Name 
    0: 0000000000000000  0 NOTYPE LOCAL DEFAULT UND 
    1: 0000000000000000  0 FUNC GLOBAL DEFAULT 1 
    2: 0000000000400040 16 FUNC GLOBAL DEFAULT 1 _R_Potato 
    3: 0000000000400050  6 FUNC GLOBAL DEFAULT 1 _R_Main 
    4: 0000000000000000  0 SECTION LOCAL DEFAULT 1 
    5: 0000000000400056 18 FUNC GLOBAL DEFAULT 1 _start 
    6: 0000000000400068 25 FUNC GLOBAL DEFAULT 1 GetStringLength 
    7: 0000000000400081 26 FUNC GLOBAL DEFAULT 1 _R_Print 

hexdumpに対して、必要に応じて、hereを見つけることができます。 私はLOADセグメントからのものをmmapしようとしているカーネルに問題があると仮定していますが、問題が見付かりません。何が起きてる?

答えて

3
Program Headers: 
    Type   Offset    VirtAddr   PhysAddr 
       FileSiz   MemSiz    Flags Align 
    LOAD   0x0000000000000040 0x0000000000400000 0x0000000000400000 
       0x000000000000009b 0x000000000000009b R E 200000 

これはすぐそこにあなたの問題です:あなたはmmap(0x400000, 0x9b, PROT_READ|PROT_EXEC, MAP_FIXED, $fd, 0x40)と同等のものを実行するためにカーネルを求めているが、アドレスおよびオフセットは、同等のモジュロ整列ではないため、このようなmmapコールは常にEINVALで失敗します。

ではなく、ファイルのオフセットを0にします。それはあなたのLOADセグメント(あなたLOADセグメントのサイズは既にの両方を含む)を一緒両方Elf64_Ehdrプログラム.textをカバーすべきです。

+0

ありがとうございます! –

関連する問題