Konuyu Açan
#1
ELF (Executable and Linkable Format), Linux ve diğer Unix benzeri işletim sistemlerinde kullanılan temel ikili dosya biçimidir. Bu format, programların çalıştırılmadan önce nasıl yüklenip ilişkilendirileceğine dair bilgileri içerir ve bu nedenle özellikle sistem programcıları ve gömülü sistem geliştirenler için kritik öneme sahiptir. ELF yapısının temelini anlamak, derleme ve hata ayıklama süreçlerini daha etkin hale getirir.
ELF formatı, iki ana bölümden oluşur: ELF Header ve Section Header Table. Bu yapıların detaylarını anlamak, dosyanın nasıl yapılandığını ve içeriğin nasıl düzenlendiğini kavramanıza yardımcı olur.
İlk olarak, ELF Header, dosyanın başlangıcında bulunur ve dosyanın genel yapısı hakkında temel bilgiler içerir. Bu başlık, mimari mimarisi, dosya tipi (yürütülebilir, nesne dosyası, paylaşılan nesne vb.) ve section ile program header tablolarının konumlarını belirtir. ELF Header, genellikle 52 bayt (32-bit) veya 64 bayt (64-bit) uzunluğundadır ve aşağıdaki önemli alanları içerir:
- e_ident: Dosya tanıtıcı ve mimari bilgileri (ör. ELF versiyonu, mimari tipi gibi)
- e_type: Dosyanın tipi (yürütülebilir, nesne dosyası, paylaşılan nesne)
- e_machine: Mimari mimari kodu (x86, ARM, MIPS vb.)
- e_version: ELF versiyonu
- e_entry: Programın başlangıç adresi
- e_phoff: Program header tablosunun dosya içindeki konumu
- e_shoff: Section header tablosunun dosya içindeki konumu
- e_flags: Mimari bayraklar
- e_ehsize: ELF header boyutu
- e_phentsize: Her program header girişinin boyutu
- e_phnum: Program header sayısı
- e_shentsize: Her section header girişinin boyutu
- e_shnum: Section header sayısı
- e_shstrndx: String tablosunun section indexi
İkinci olarak, Section Header Table ise, dosyanın farklı bölümlerinin (section) detaylarını içerir. Her section, kod, veri, semboller veya diğer meta bilgiler gibi farklı içeriklere sahip olabilir. Section Header, aşağıdaki temel bilgileri barındırır:
- sh_name: Section adını tutan string tablosundaki offset
- sh_type: Section'un tipini belirtir (ör. SHT_PROGBITS, SHT_SYMTAB, SHT_STRTAB vb.)
- sh_flags: Section’un özellikleri (ör. yazılabilir, okunabilir, çalıştırılabilir)
- sh_addr: Yükleme sırasında bellek adresi (gerekirse)
- sh_offset: Dosya içindeki başlangıç konumu
- sh_size: Section'un boyutu
- sh_link: Bağlantılı section indexi (ör. sembol tablosu için)
- sh_info: Ek bilgi
- sh_addralign: Adres hizalama değeri
- sh_entsize: Section içeriği elemanlarının boyutu (ör. sembol tablosu girişleri)
Bu yapılar, ELF dosyasını yükleyen ve çalıştıran sistemin, dosya içeriğini doğru şekilde yorumlamasını sağlar. Ayrıca, sembol tablosu, string tablosu ve diğer meta bölümler, programın dinamik bağlantı ve hata ayıklama işlemlerinde önemli rol oynar.
ELF yapısının detaylarını anlamak, özellikle sistem seviyesinde geliştirme yapanlar ve derleyici bağımlı kod yazanlar için vazgeçilmezdir. ELF Header ve Section yapısını derinlemesine inceleyerek, bir dosyanın iç işleyişini ve yapısal düzenini kavramak mümkündür.
Bu konunun daha teknik ve detaylı örnekleri, ELF dosya analiz araçlarıyla (örn. readelf, objdump) incelenerek pratik olarak pekiştirilebilir. ELF yapısının temel prensipleri, işletim sistemi mimarilerine göre farklılık gösterebilir; ancak genel prensipler büyük oranda aynıdır.
