Pmap çıktısının anlamı


12

main.cLinux'ta yazdım :

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

Derlediğimde ve başlattığımda, yapabilirim 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

toplam (3876) bölü K VIRTile çıktıdaki sütuna eşittir top. Şimdi metin segmenti nerede? 400000, 600000 ve 601000'de, değil mi? Nerede bir açıklama okuyabilirim nerede? man pmapYardım etmedi.


metin bölümleri aslında salt okunurdur, bu yüzden 0000000000600000 konumundadır.
Danila Ladner

Teşekkürler! Metin segmenti de yürütülebilir mi?
Thorsten Staerk

1
Evet haklısın. r ve rx. 0000000000400000 de.
Danila Ladner

Yanıtlar:


15

Metin bölümü 0x400000 adresindeki eşlemedir - okunabilir ve yürütülebilir için 'rx' olarak işaretlenmiştir. 0x600000'deki eşleme salt okunur olduğundan, yürütülebilir dosyanın neredeyse ".rodata" bölümü budur. GCC, C string değişmezlerini salt okunur bir bölüme yerleştirir. 0x601000'deki eşleme 'rw-', bu nedenle muhtemelen ünlü yığın. Yürütülebilir malloc()1024 baytınız olabilir ve emin olmak için adresi yazdırabilirsiniz.

İşleminizin PID'sini bularak ve aşağıdakileri yaparak biraz daha fazla bilgi alabilirsiniz: cat /proc/$PID/maps- Arch dizüstü bilgisayarımda, bazı ekstra bilgiler verir. Bir 3.12 çekirdeği çalıştırıyor, bu yüzden de var /proc/$PID/numa_mapsve küçük bir içgörü de sağlayabilecek catting var.

Yürütülebilir dosyada çalıştırılacak diğer şeyler: nmve objdump -x. Birincisi, bellek haritasında çeşitli şeylerin nerede olduğu hakkında bir fikir verebilir, böylece 0x4000000 bölümünde diğer bölümlere kıyasla neler olduğunu görebilirsiniz. objdump -xELF dosya başlıklarını diğer birçok şey arasında gösterir, böylece tüm bölümleri, bölüm adlarıyla ve çalışma zamanında eşlenip eşlenmediklerini görebilirsiniz.

"Nerede" yazılı bir açıklama bulmak kadarıyla, "ELF DOSYA bellek düzeni" için google gibi şeyler yapmak zorunda kalacak. ELF dosya biçiminin yaygın olarak kullanılandan daha egzotik bellek düzenlerini destekleyebileceğini unutmayın. GCC ve Gnu ld ve glibc, yürütülebilir bir dosyanın nasıl düzenlendiği ve çalışma zamanında belleğe nasıl eşleştirildiği hakkında basitleştirici varsayımlar yaparlar. Bunu belgelemek için kullanılan birçok web sayfası vardır, ancak yalnızca eski Linux sürümleri, GCC veya glibc'nin eski sürümleri için geçerlidir veya yalnızca x86 yürütülebilir dosyaları için geçerlidir. Eğer sahip değilseniz, readelfkomutu alın. C programları yazabiliyorsanız, kendi sürümünüzü oluşturun objdump -xveya readelfyürütülebilir dosyaların nasıl çalıştığını ve içinde ne olduğunu öğrenin.


2
Mükemmel cevap. Şimdi, programın yığını nerede? Ve bu [anon] ne anlama geliyor? Bunu bulmak için Google'a ne yapmam gerekiyor?
Thorsten Staerk

1
Biliyor musun? 0x601000 adres eşlemesinde yanılmışım - bu muhtemelen yığın. Kullanmanız readelfveya objdumpçalıştırılabilir programınız ne olursa olsun, kullanmanız veya anlamanız gerekir. Arch linux kutum /usr/lib/libc-2.18.so kullanıyor, bu yüzden kutunuzdan oldukça farklı.
Bruce Ediger

2
0x601000veri segmentidir. İçerdiği .data, .bssve üzerinden uzatılabilir brk(). [anon]simgesi, üzerinden elde edilen dosya olmayan yedek belleği (takas ile desteklenir) belirtir mmap(). dlmalloc brk()~ 64Kb IIRC'den küçük ayırmalar ve mmap()daha büyük ayırmalar için kullanır. Yığın, hem veri segmentinin genişletilmiş kısmı hem de mmap()temelli tahsisler olan malloc tarafından ayrılan her şeydir .
ninjalj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.