İkili yürütülebilir dosyalar nasıl yapılandırılır? Hadi inceleyelim!
- Yürütülebilir dosyalar anlaşılmaz şeyler değildir; standart bir dosya biçimidir.
- Linux'ta ELF ikilileri ele alınıyor ve C dili kullanılıyor, ancak başka derlenen diller de mümkündür.
- Sembol (symbol), bölüm (section) ve segment (segment) kavramları öğreniliyor.
- Semboller işlev adları gibidir, bölümler içinde düzenlenir ve bölümler segmentlerden oluşur.
- Bunları incelemek için
readelfaracı kullanılır.
1. adım: Metin düzenleyicide açın!
- İkili dosyaya bakmanın en basit yolu budur; "Penguin!" ve "ELF" metinlerini görebilirsiniz.
2. adım: readelf ile sembol tablosunu görüntüleme
- Semboller
readelf --symbolsile görülebilir. main,puts,_startgibi semboller görülebilir.- Program
main'den değil_start'tan başlar.
Semboller
- Program yazarken işlevler için semboller oluşturulur.
- Bir kütüphanedeki işlev çağrılırken, o işlevin kodunu bulmak için sembollere ihtiyaç vardır.
- Bağlama işlemi statik bağlama (static linking) ve dinamik bağlama (dynamic linking) yoluyla yapılır.
3. adım: objdump ile ikiliyi görüntüleme ve bölümleri öğrenme
objdump, ikiliyi daha iyi görmenin bir yolunu sağlar..text,.rodata,.interpgibi bölümler görülebilir.- Bölümler linkleme zamanında, segmentler ise çalışma zamanında kullanılır.
4. adım: Assembly'ye bakın!
.textbölümü assembly kodunu içerir.- Assembly kodu
objdump -dile görülebilir.
5. adım: Segmentleri görüntüleme!
- Program segmentlerden ya da program header'larından oluşur.
- Segmentler
readelf --segmentsile görülebilir. - Segmentler, programın farklı kısımlarının bellekte nasıl ayrılacağını belirler.
Sihir değil!
- Yürütülebilir dosyalar sihir değildir; ELF de diğer dosya biçimleri gibidir.
- Linux ikililerini incelemek için
readelf,nm,objdumpkullanılabilir.
GN⁺ görüşü
- Bu yazı, başlangıç seviyesindeki yazılım mühendislerinin ikili yürütülebilir dosyaların yapısını anlaması için oldukça faydalıdır.
- Sembol, bölüm ve segment kavramları ile bunları incelemeye yarayan araçlar (
readelf,objdump) hakkında pratik bilgiler sunar. - Programların gerçekte belleğe nasıl yüklendiği ve çalıştırıldığına dair temel bir anlayış kazandırarak sistem programlamaya ilgi uyandırabilir.
1 yorum
Hacker News yorumları
Bir kullanıcı, ELF'yi (Executable and Linkable Format) doğrudan yazmayı tavsiye ediyor; bunun, çalıştırılabilir dosyaların temel bileşenlerini anlamaya çok yardımcı olduğunu söylüyor. Ayrıca bu yazının, mevcut aşağıdan yukarı yaklaşım yerine yukarıdan aşağı yaklaşım isteyenler için faydalı olduğunu belirtiyor.
Başka bir kullanıcı, bir programın çalıştığında
main'de başladığını düşünebileceğimizi, ancak gerçekte_start'ta başladığını açıklıyor._start,main'i çağırmak gibi birçok önemli iş yapıyor; bu da C diline özgü değil, dilden bağımsız olarak ikili dosyanın giriş noktası.Bir kullanıcı, Julia'nın yazılarının her zaman harika olduğunu söylüyor ve derlenmiş kodun sır saklamadığını insanlara öğretirken
stringskomutunu göstererek iyi sonuçlar aldığını belirtiyor.Bir kullanıcı, akademik kariyerini matematikten bilgisayar bilimine çevirdiğinde bu konuyu ilk kez çalıştığını, bu kadar derine inmiş olmaktan hiç pişman olmadığını söylüyor. Julia'nın da matematik geçmişi olduğunu ve yukarıdan aşağı akıl yürütme isteğinin matematikçileri bu tür deneylere yöneltmiş olabileceğini düşünüyor.
Bir kullanıcı, çalıştırılabilir dosyaların platforma özgü olduğunu hatırlatarak, “gerçekten taşınabilir çalıştırılabilir dosya”nın farklı platformlarda çalışabildiğini kanıtladığında yaşadığı deneyimi paylaşıyor. Bunun, Java, çapraz platform kütüphaneleri ve benzeri yollarla çözmeye çalıştığımız çapraz platform sorununun çözümünün uzun zamandır gözümüzün önünde olduğu anlamına geldiğini söylüyor.
Bir kullanıcı, 90'ların başında çalıştırılabilir dosya biçimlerine hayran kaldığını ve DOS ile Windows çalıştırılabilir dosya görüntüleyicisini Modula 2 ile yazdığını anlatıyor. Bu program, VEXE adıyla paylaşımlı yazılım olarak 1991'de yayımlandı, cracker'lar arasında belli bir takipçi kitlesi edindi ve +ORC eğitimlerinde de anıldı.
Bir kullanıcı, ikili dosyayı terminale basmanın keder sebebi olduğunu söylüyor ve bunun yerine
hexdump -Ckullanmayı tercih ediyor.Birden fazla kullanıcı bunun konu hakkında harika bir tartışma dizisi olduğunu söylüyor.
Bir kullanıcı, bu konuyla ilgilenenlere Cosmopolitan ve RedBean'i, ayrıca "αcτµαlly pδrταblε εxεcµταblε (2020)" yazısını okumalarını tavsiye ediyor.