pmap輸出的意義
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 ,這也可能會提供一些小的見解。在執行檔上執行的其他內容:
nm
和objdump -x
. 前者可以讓您了解記憶體映射中各種內容的位置,因此您可以查看 0x4000000 部分與其他部分的內容。objdump -x
向您顯示 ELF 文件頭以及許多其他內容,因此您可以查看所有部分,包括部分名稱以及它們是否在執行時映射。至於找到“什麼在哪裡”的書面解釋,您必須為“ELF FILE memory layout”做一些事情,比如穀歌。請注意,ELF 文件格式可以支持比通常使用的更奇特的記憶體佈局。GCC 和 Gnu ld 和 glibc 都對執行檔如何佈局然後在執行時映射到記憶體進行了簡化假設。存在許多聲稱記錄這一點的網頁,但僅適用於舊版本的 Linux、舊版本的 GCC 或 glibc,或者僅適用於 x86 執行檔。如果沒有,請獲取
readelf
命令。如果您可以編寫 C 程序,請創建自己的版本objdump -x
或readelf
熟悉執行檔的工作方式以及其中的內容。