2016-11-27 246 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

非常感谢! –