ELF yürütülebilir dosyasının hangi bölümleri belleğe yüklenir ve nerede?


10

Zaten bildiğim:

Bir ELF yürütülebilir dosyasının birkaç bölümü vardır, açıkçası .text ve .data bölümleri programın ana bölümleri olduğu için belleğe yüklenir. Ancak bir programın çalışması için, özellikle dinamik olarak bağlandığında daha fazla bilgiye ihtiyaç duyar.

İlgilendiğim şey .plt, .got, .dynamic, .dynsym, .dynstr etcetera gibi bölümlerdir. ELF'nin işlevlerin adreslere bağlanmasından sorumlu bölümleri.

Şimdiye kadar anlayabildiğim kadarıyla, .symtab ve .strtab gibi şeyler belleğe yüklenmiyor (veya kalmıyor). Ancak .dynsym ve ve .dynstr bağlayıcı tarafından kullanılıyor mu? Hafızada mı kalıyorlar? Onlara program kodundan erişebilir miyim?

Ve yürütülebilir bir dosyanın çekirdek belleğinde bulunan parçaları var mı?

Buna olan ilgim çoğunlukla adli tıptır, ancak bu konuyla ilgili herhangi bir bilgi yardımcı olacaktır. Bu tablolar ve dinamik bağlantı hakkında okuduğum kaynaklar daha üst düzeydir, sadece çalışmaları açıklar, hafızadaki içerik hakkında pratik bir şey değil.

Sorum hakkında net olmayan bir şey varsa bana bildirin.

Yanıtlar:


12

Aşağıdakiler gerçekten iyi bir referanstır: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Farklı seviyelerde farklı referansların sonunda bir bibliyografya içerir. Her kanlı ayrıntıyı bilmek istiyorsanız, doğrudan kaynağa gidebilirsiniz: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper Linux dinamik bağlayıcısını yazdı.)

"Objdump -h myexe" veya "readelf -S myexe" gibi bir komut çalıştırarak yürütülebilir dosyadaki tüm bölümlere gerçekten iyi bir genel bakış elde edebilirsiniz.

.İnterp bölümü, bu nesnedeki sembolleri dinamik olarak bağlamak için kullanılacak dinamik yükleyicinin adını içerir. .Dynamic bölümü, program yükleyicisinin dinamik yükleyicinin okuması kolay olacak şekilde biçimlendirilmiş bir damıtmasıdır. (Yani tüm diğer bölümlere işaret eder.)

.Got (Global Ofset Tablosu) ve .plt (Prosedür Bağlantı Tablosu), dinamik bağlayıcı tarafından manipüle edilen iki ana yapıdır. .Got değişkenler için bir dolaylı tablodur ve .plt işlevler için bir dolaylı tablodur. Her bir yürütülebilir dosya veya kitaplığın ("paylaşılan nesneler" olarak adlandırılır) kendi .got ve .plt değerleri vardır ve bunlar, paylaşılan başka bir nesnede gerçekte bulunan paylaşılan nesne tarafından başvurulan sembollerin tablolarıdır.

.Dynsyn, paylaşılan nesnenizdeki simgelerle ilgili tüm bilgileri içerir (hem tanımladığınız hem de başvurmanız gereken dış simgeler.) .Dynsyn, gerçek sembol adlarını içermez. Bunlar .dynstr içinde bulunur ve .dynsyn'in .dynstr'e işaretçileri vardır. .gnu.hash, sembollerin ada göre hızlı aranması için kullanılan bir karma tablodur. Ayrıca yalnızca işaretçiler (.dynstr'e işaretçiler ve kepçe zincirleri yapmak için kullanılan işaretçiler) içerir.

Paylaşılan nesneniz "foo" sembolünü kaldırdığında, dinamik bağlayıcı, aradığınız "foo" yu hangisinin aradığını (ve sonra da "foo" adresi bu paylaşılan nesnenin içindedir.) Dinamik bağlayıcı bunu bağlı tüm paylaşılan nesnelerin .gnu.hash bölümünde (veya .gnu içermeyen eski paylaşılan nesnelerin .hash bölümünde) arayarak yapar. karma bölümü.) Bağlantılı paylaşılan nesnede doğru adresi bulduktan sonra, onu paylaşılan nesnenizin .got veya .plt dosyasına koyar.


Teşekkürler, bağlantılarınız bana ihtiyacım olan bölümlerin sanal eşlemelerini bulma konusunda bir adım daha ileri gidiyor. Bu konudaki ilgim adli tıp olduğu için, "DRAM'a yüklenen" benim için hala geçerli. Bir bölüm eşlenmiş ancak hiç yüklenmemişse, bunu bir bellek dökümünde
bulamam

Haklısın. Bellek dökümü yaptığınızda, eşlenen her sayfanın bir kopyasını alırsınız, böylece "vm'ye eşlendi" ve "DRAM'a yüklendi" arasındaki ayrımım önemsizdi. Bu cümleyi kaldırdım ve cevap geliştirildi. Teşekkür ederim!
Gezici Mantık

Cevabınızı cevap olarak işaretlediniz, çünkü alacağım kadar bilgi var :) gerisini kendim yapmak zorunda kalacak, sonuçta benim araştırmam.
Dutchy

Bu nedenle, evet .dynsym ve ve .dynstr (ve diğerleri) dinamik bağlayıcı tarafından kullanılır ve program belleğine (metin segmentinde) yüklenir ve programınız tarafından çalışma zamanında kullanılabilir.
ysdx
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.