2016-02-07 76 views
1

我正在嘗試編寫基於它的ELF頭文件來計算Linux核心轉儲文件大小的C代碼。這是需要的,因爲我將它傳遞給STDIN並需要傳遞它,首先指定它的大小,而不實際將它寫入文件。將整個文件讀入內存也不是一種選擇。從頭文件計算linux核心文件大小

首先,我尋找到核心轉儲頭:

ELF Header: 
    Magic: 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00 
    Class:        ELF64 
    Data:        2's complement, big endian 
    Version:       1 (current) 
    OS/ABI:       UNIX - System V 
    ABI Version:      0 
    Type:        CORE (Core file) 
    Machine:       MIPS R3000 
    Version:       0x1 
    Entry point address:    0x0 
    Start of program headers:   64 (bytes into file) 
    Start of section headers:   0 (bytes into file) 
    Flags:        0x0 
    Size of this header:    64 (bytes) 
    Size of program headers:   56 (bytes) 
    Number of program headers:   257 
    Size of section headers:   0 (bytes) 
    Number of section headers:   0 
    Section header string table index: 0 

There are no sections in this file. 

There are no sections to group in this file. 

接下來,我讀的程序頭在一個循環,並採取一切FileSiz領域的總和。 我的假設是(ELF頭大小)+(程序頭大小)*(程序頭數)+(所有大小的總和)將給我整個文件大小。然而,這種情況並非如此。在我的情況下,我得到的大小爲729088000字節的實際文件,而上面的數學給我729054616字節。我錯過了什麼?

回答

1

管理解決問題。整個文件的大小可以通過採用具有最大偏移量的程序頭並向其添加文件大小來計算,因爲核心文件僅由頭和段組成。

E.g.如果你讀通過readelf程序頭,和你走在最後的條目來看看:

LOAD   0x00000000287d0000 0x000000557d5c0000 0x0000000000000000 
       0x0000000002730000 0x0000000002730000 RW  10000 
    LOAD   0x000000002af00000 0x000000557fcf0000 0x0000000000000000 
       0x0000000000010000 0x0000000000010000   10000 
    LOAD   0x000000002af10000 0x000000557fd00000 0x0000000000000000 
       0x00000000007f0000 0x00000000007f0000 RWE 10000 
    LOAD   0x000000002b710000 0x000000ffffe70000 0x0000000000000000 
       0x0000000000040000 0x0000000000040000 RW  10000 

然後將文件大小或核心轉儲實際上是0x2b710000 + 0x40000

+0

此答案*完全*錯誤,並且該問題的前提是錯誤的。 –

0

我想編寫基於它的ELF頭部計算Linux核心轉儲文件大小的C代碼。

這是不可能做到的,因爲

  • 與動態鏈接,你有許多不同ELF頭,並且每個共享庫將有助於最終core文件大小和
  • 動態分配的內存(通常是最重要的核心轉儲的一部分)沒有被描述爲ELF在所有,並且可以是10,1比可執行文件中的任何.data大00或1000倍。

然而,可以確定核心尺寸如果您已成功地阻止可執行訪問其/proc/$pid/maps:在google userspace coredumper正是這麼做的。