Çekirdek dökümü, programlarınızın bellek ayak izinin dökümüdür, eğer her şeyin nerede olduğunu biliyorsanız, bunu kullanabilirsiniz.
Yürütülebilir dosyayı kullanırsınız, çünkü (mantıksal adresler açısından) şeylerin bellekte nerede olduğunu, yani çekirdek dosyayı açıklar.
Bir komut kullanırsanız objdump
, araştırdığınız yürütülebilir nesne hakkındaki meta verileri atar. Örnek olarak a.out adında yürütülebilir bir nesne kullanma.
objdump -h a.out
yalnızca başlık bilgisini döker, ör. .data veya .bss veya .text (daha fazlası var). Bunlar, çekirdek yükleyiciye nesnede çeşitli bölümlerin nerede bulunabileceği ve işlem adres alanında bölümün nereye yükleneceği ve bazı bölümler için (örn. Veri .text) nelerin yüklenmesi gerektiği konusunda bilgi verir. (.bss bölümü dosyada herhangi bir veri içermez, ancak başlatılmamış veriler için ayrılacak bellek miktarını ifade eder, sıfırlarla doldurulur).
Yürütülebilir nesne dosyasının düzeni standart bir ELF'ye uygundur.
objdump -x a.out
- her şeyi döker
Yürütülebilir nesne hala sembol tablolarını içeriyorsa (soyulmamışsa - man strip
ve
ac kaynak derlemesini varsaymak -g
için hata ayıklama üretimi oluşturduysanız gcc
), temel içeriği sembol adlarıyla inceleyebilirsiniz, örneğin bir değişkeniniz / tamponunuz varsa adlı inputLine kaynak kodunda, sen o ismi kullanabilirsiniz gdb
içeriği bakmak için. ie gdb
, inputLine'ın başlatıldığı ve başlatılan değişkenin uzunluğunun programlarınızın başlangıcından sapmasını bilir .
Daha fazla okuma Madde 1 ,
Madde 2 ve nitrit cesur Yürütülebilir ve Bağlayıcı Biçim (ELF) spesifikasyonu için .
Aşağıdaki mirabilos yorumundan sonra güncelleyin.
Ancak, sembol tablosunu
$ gdb --batch -s a.out -c core -q -ex "x buf1"
üretir
0x601060 <buf1>: 0x72617453
ve sonra sembol tablosunu kullanmıyor ve adresi doğrudan
$ gdb --batch -c core -q -ex "x 0x601060"
üretir
0x601060: 0x72617453
2. komutta sembol tablosunu kullanmadan doğrudan belleği inceledim.
Ayrıca görüyorum ki, @ user580082'nin yanıtı açıklamalara daha fazla katkıda bulunuyor ve oy verecek.