Linux

pmap輸出的意義

  • June 14, 2014

main.c我在 Linux 中寫道:

int main()
{
 while (1){}
}

當我編譯並啟動它時,我可以pmap

# pmap 28578
28578:   ./a.out
0000000000400000      4K r-x--  /root/a.out
0000000000600000      4K r----  /root/a.out
0000000000601000      4K rw---  /root/a.out
00007f87c16c2000   1524K r-x--  /lib/libc-2.11.1.so
00007f87c183f000   2044K -----  /lib/libc-2.11.1.so
00007f87c1a3e000     16K r----  /lib/libc-2.11.1.so
00007f87c1a42000      4K rw---  /lib/libc-2.11.1.so
00007f87c1a43000     20K rw---    [ anon ]
00007f87c1a48000    128K r-x--  /lib/ld-2.11.1.so
00007f87c1c55000     12K rw---    [ anon ]
00007f87c1c65000      8K rw---    [ anon ]
00007f87c1c67000      4K r----  /lib/ld-2.11.1.so
00007f87c1c68000      4K rw---  /lib/ld-2.11.1.so
00007f87c1c69000      4K rw---    [ anon ]
00007fff19b82000     84K rw---    [ stack ]
00007fff19bfe000      8K r-x--    [ anon ]
ffffffffff600000      4K r-x--    [ anon ]
total             3876K

總計 (3876) 除以 K 等於VIRT輸出中的列top。現在文本段在哪裡?在 400000、600000 和 601000,對嗎?我在哪裡可以閱讀解釋什麼是在哪裡?man pmap沒有幫助。

文本段是 0x400000 處的映射 - 它被標記為“rx”以表示可讀和可執行。0x600000 處的映射是只讀的,因此幾乎可以肯定是執行檔的“.rodata”部分。GCC 將 C 字元串文字放入只讀部分。0x601000 處的映射是 ‘rw-’,所以這可能是著名的堆。您可以擁有malloc()1024 字節的執行檔並列印出地址以確保查看。

通過查找程序的 PID 並執行以下操作,您可能會獲得更多資訊:cat /proc/$PID/maps- 在我的 Arch 筆記型電腦上,這會提供一些額外的資訊。它執行的是 3.12 核心,因此它也有/proc/$PID/numa_maps, 和 catting ,這也可能會提供一些小的見解。

在執行檔上執行的其他內容:nmobjdump -x. 前者可以讓您了解記憶體映射中各種內容的位置,因此您可以查看 0x4000000 部分與其他部分的內容。objdump -x向您顯示 ELF 文件頭以及許多其他內容,因此您可以查看所有部分,包括部分名稱以及它們是否在執行時映射。

至於找到“什麼在哪裡”的書面解釋,您必須為“ELF FILE memory layout”做一些事情,比如穀歌。請注意,ELF 文件格式可以支持比通常使用的更奇特的記憶體佈局。GCC 和 Gnu ld 和 glibc 都對執行檔如何佈局然後在執行時映射到記憶體進行了簡化假設。存在許多聲稱記錄這一點的網頁,但僅適用於舊版本的 Linux、舊版本的 GCC 或 glibc,或者僅適用於 x86 執行檔。如果沒有,請獲取readelf命令。如果您可以編寫 C 程序,請創建自己的版本objdump -xreadelf熟悉執行檔的工作方式以及其中的內容。

引用自:https://unix.stackexchange.com/questions/105604