2016-11-27 107 views
1

我生成一個ELF可執行文件,該文件加載到LOAD段。它拆卸很好,但試圖gdb下運行它給During startup program terminated with signal SIGSEGV, Segmentation fault.啓動期間生成的ELF可執行文件段錯誤

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段映射的東西,但我沒有看到問題。這裏發生了什麼?

回答

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而不是0x40。也就是說,你的LOAD段應涵蓋Elf64_Ehdr程序.text在一起(您LOAD段的大小已經包括)。

+0

非常感謝! –