Bu belge UNIX ve türevi işletim sistemlerinde kullanılma oranı en yüksek olan İkili Nesne Dosya biçimi ELF hakkında olabildiğince geniş ölçüde bilgi içermektedir. Belgenin yazılmasında kaynaklar bölümünde birinci ve ikinci sırada olan "Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification" dökümanlarından büyük oranda yararlanılmıştır, dolayısıyla bu belge bir anlmanda onların çevirisi niteliğindedir.
ELF diğer UNIX ikili dosya formatlarından olan a.out (UNIX sistemleri tarafından yıllarca kullanılmıştır ve hala destek verilmektedir fakat çoğu sistemde artık varsayılan dosya biçimi değildir) ve COFF'a ( ELF'den önce kullanılan nesne dosya biçimidir, SVR3'de kullanılmıştır) göre daha güçlü ve daha esnektir. ELF biçimi, programcıya çalışma zamanı sırasında programın akışını kontrol altınına almasını sağlayan bir çok araçla birleştirilmiştir. ELF diğerlerine nazaran platformdan daha bağımsızdır. ELF biçimi Solaris(2.x'den beri), SVR4 (SVR3, BSD4.3 , SunOS ve Microsoft XENIX system V'in özelliklerini taşıyan AT&T ve Sun Microsystems tarafından duyurulan UNIX system V relase 4), SCO, UNIXware, Linux, BSD'ler ve bir çok UNIX'in günümüz de kullandığı Nesne İkili Dosya Biçimidir. Bu arada Microsoft NT de UNIX dünyasının kullanmayı bıraktığı COFF dosya biçimi tabanını kullanarak geliştirdiği kendi dosya biçimine sahiptir.
ELF'de bu üç farklı tür, farklı hizmetler sunsada iç yapıları birbirlerine çok benzerdir. Bunlar kolaylık ve verimlilik için ikiye ayrılırlar; birinci gurupdakiler derleyici, assembly yorumlayıcısı ve bağlayıcı programın ürettiği ve Kısım Başlık Tablosunda tanımlanan mantıksal Kısım'ları (Section) içeren dosyalar, diğer gurpdakiler ise sistem yükleyicisi tarafından işlenmiş ve Program Başlık Tablosunda tanımlanan Bölüm'leri (Segment) içerirler.
ELF Başlık her iki türde de dosyanın başında bulunur ve dosya ile iligli yapılacak işlemler için bir yol haritası niteliğindedir. Kısım'lar "Linking View" için talimatlar (instructions), veri, sembol tablosu, yeniden konumlandırma bilgileri, vs. içerirler. Eğer var ise Program Başlık Tablosu sisteme nasıl süreç imajı oluşturacağını belirtir. Süreç imajı oluşturmak için kullanılan dosyalarda bu tablo olmak zorundadır. Yeniden Konumlandırılabilir dosyalarda ise gerekli değildir. Kısım Başlık Tablosu dosyada buluna kısımların tanımlanması için kullanılır. Bütün Kısım'ların bu tabloda bir kaydı vardır ve her giriş Kısım'ın ismi, boyutu vb. bilgiler tutar.
Aşağıdaki grafiklerde; 2. ve 3. maddelerde geçen Yeniden Konumlandırılabilir ve Paylaşımlı Nesne Dosyalar "Linking View" ve "Linkable Sections" olarak, 1. maddede geçen Çalıştırılabilir dosyalar ise "Execution View" ve "Executable Segmens" olarak gösterilmişlerdir.
![]() |
![]() |
ELF biçimi 8 bit'ten oluşan byte yapısındaki 32 yada 64 bit'lik bir çok farklı işlemci ailesine destek vermektedir, tabi bu durum daha büyük yada küçük sistemlere uyarlanabilir. Nesne Dosya'lar platformdan bağımsız halede bazı veriler içerirler, buda Nesne Dosya'lara kendilerini tanımlayabilme ve dolayısı ile içeriklerinin de kolayca yorumlanabilmesi olanağını sağlar. Kalan veriler ise dosyanın yaratıldığı bilgisayara bakılmaksızın, hedef işlemcinin anlayabileceği türden encoding işlemine tabi tutulurlar.
Aşağıdaki tablolarda ELF'nin 32 ve 64 bit'lik işlemciler için tanımlanmış veri
tipleri listelenmektedir. Bu veri tipler platformdan bağımsızdır.
| 32-Bit Veri Tipleri | |||
| İsim | Uzunluk (Byte) | Hizalama (Byte) | Açıklama |
Elf32_Addr |
4 |
4 |
Unsigned program address |
Elf32_Off |
4 |
4 |
Unsigned file offset |
Elf32_Half |
2 |
2 |
Unsigned medium integer |
Elf32_Word |
4 |
4 |
Unsigned integer |
Elf32_Sword |
4 |
4 |
Signed integer |
unsigned char |
1 |
1 |
Unsigned small integer |
| 64-Bit Veri Tipleri | |||
| İsim | Uzunluk (Byte) | Hizalama (Byte) | Açıklama |
Elf64_Addr |
8 |
8 |
Unsigned program address |
Elf64_Off |
8 |
8 |
Unsigned dosya offset |
Elf64_Half |
2 |
2 |
Unsigned medium integer |
Elf64_Word |
4 |
4 |
Unsigned integer |
Elf64_Sword |
4 |
4 |
Signed integer |
Elf64_Xword |
8 |
8 |
Unsigned long integer |
Elf64_Sxword |
8 |
8 |
Signed long integer |
unsigned char |
1 |
1 |
Unsigned small integer |
Nesne dosya biçiminin tanımladığı bütün veri yapılrı, ilgili sınıf için "doğal" boyut ve hizalama değerlerine uyarlar. Gerektiğinde, yapının boyutunun 4'ün katları olabilmesi için veri yapısı 4-byte nesneler için 4-byte hizalama yapar. Veri birde dosyanın başlarından itibaren uygun hizalama yapabilir. Böylece örneğin, Elf32_Addr üyesini içeren bir yapı dosya içersinde 4-byte'lık bir sınır üzerine hizalanacaktır. ELF taşınabilirlik özelliğini koruyabilmek için "bit" birimi kullanmaz.
Birçok dosya biçimi kontrol bilgilerini karakterler ile gösterir. Bu tek byte'lık
karakterler 7-bit ASCII karakter set'ini kullanırlar. Başka bir deyişle, ELF
arabirimi '/' yada '\n' gibi karakter sabitlerinden kullanırsa, karakterlerin
sayısal değerleri 7-bit ASCII düzneninde olmalıdırlar. Az önceki iki karakter
sabiti için tek byte'lık değerler, sırası ile 47 ve 10 olacaktır.
0-127 aralığının dışındaki karakter değerleri, karakter encoding'ine uygun olacak
şekilde, bir yada daha fazla byte işkal edebilirler. Uygulamalar kendi karakter
set'lerini farklı diller için farklı karakter ilavelerini kullanarak kontrol
edebilirler. TIS, karakter set'leri konusunda bir kısıtlama getirmesede, genel
olarak aşağıdaki maddelere uyulmalıdır.
Bu uyarılar özellikle çoklu dil desteği olan uygulamalar ile ilgilidir.
NOT: ELF sabitleri için, İşlemci türlerine göre tanımlanmış bir isimlendirme
biçimi vardır. DT_, PT_ gibi isimler; işlemciye özel uzantıların oluşturulabilmesi
için İşlemcinin ismi ile birleştirilirler: örnğin DT_M32_SPECIAL. Ancak bu kurallara
uymayan daha önceden varolan işlemci uzantılarıda desetklenecektir. Mevcut bir
uzantıya örnek : DT_JMP_REL.
Bazı ikili Nesne Dosya'ların kontrol yapı'ları beklenmedik bir şekilde genişleyebilirlersede ELF Başlık bu yapıların gerçek boyutlarının ne olduğunu tutmaktadır. Eğer bu dosya değiştirilmiş ise program kendi kontrol yapı'larını beklediğinden fazla yada az bulacaktır. Bu durumda program fazla olan kısımları görmezden gelecektir. Eksik olan bilgiler için uygulanacak düzeltme işlemi dosyanın içeriğine bağlıdır ve (bu konu ile ilgili) ilaveler tanımlandığında ve eğer tanımlanırsa belirlenecektir.
| ELF Başlık Yapısı |
#define EI_NIDENT 16 |
e_ident |
İlk byte'lar dosyayı bir Nesne Dosya gibi işaretler ve dosyasının nasıl decode edileceğine ve yorumlanacağına dair makineden bağımsız veriler sunar. Daha geniş bilgiyi bir sonraki bölüm olan 2.2.1. ELF Dosyasının Tanınması'de bulabilirsiniz. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_type |
Nesne dosya tipi. Alabileceği değerler aşağıdadır.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_machine |
Bilgisayarın işlemci mimarisi. Alabileceği değerler aşağıdadır. Diğer değerler yeni mimariler için rezerv edilmiştir.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_version |
ELF versiyonu. Alabileceği değerler aşağıdadır.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_entry |
Sanal adres başlangıcı. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phoff |
Program Başlık tablosunun dosya içersideki ofseti. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shoff |
Kısım Başlık tablosunun dosya içersideki ofseti. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_flags |
İşlemci tanımlı bayraklar. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_ehsize |
ELF Başlığının byte cinsinden uzunluğu. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phentsize |
Program Başlık dizisi elemanının byte cinsinden uzunluğu. Bütün elemanlar aynı uzunlukta olmalıdır. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_phnum |
Program Başlık dizisi boyutu. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shentsize |
Kısım Başlık dizisi elemanının byte cinsinden uzunluğu. Bütün elemanlar aynı uzunlukta olmalıdır. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shnum |
Kısım Başlık dizisi boyutu. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e_shstrndx |
Kısım String Tablosu ile ilişkilendirilmiş olan Kısım Başlık Tablosu indeksi. |
ELF bir Nesne Dosya olarak çok işlemci desteği, çoklu "data encoding" ve çoklu sınıflama desteği sunar. Dosya içersindeki ilk byte'lar ilgili dosyanın nasıl yorumlanacağı bilgisini tutar.
ELF Başlığının ilk byte'ları e_ident üyesini içerir.
e_ident[] tanımlayıcı indeksleri |
||
| İsim | Değer | Açıklama |
EI_MAG0 |
0 | Dosya tanımlaması |
EI_MAG1 |
1 | Dosya tanımlaması |
EI_MAG2 |
2 | Dosya tanımlaması |
EI_MAG3 |
3 | Dosya tanımlaması |
EI_CLASS |
4 | Dosya Sınıfı |
EI_DATA |
5 | Data encoding |
EI_VERSION |
6 | Dosya versiyonu |
EI_OSABI |
7 | İşletim Sistemi/ABI tanımlaması |
EI_ABIVERSION |
8 | ABI versiyonu |
EI_PAD |
9 | Hizalama için boşlukları doldurma işleminin başlayacağı byte'lar. |
EI_NIDENT |
16 | e_ident[] dizisinin boyutu |
Bu indeksler aşağıdaki değerleri tutan byte'lara erişir.
EI_MAG0 dan EI_MAG
a
| İsim | Değer | Açıklama |
ELFMAG0 |
0x7F | e_ident[EI_MAG0] |
ELFMAG1 |
'E' | e_ident[EI_MAG1] |
ELFMAG2 |
'L' | e_ident[EI_MAG2] |
ELFMAG3 |
'F' | e_ident[EI_MAG3] |
EI_CLASSe_ident[EI_CLASS],
dosyanın sınıfını yada kapasitesini tutar.| İsim | Değer | Açıklama |
ELFCLASSNONE |
0 | Geçersiz sınıf |
ELFCLASS32 |
1 | 32-bit Nesne |
ELFCLASS64 |
2 | 64-bit Nesne |
Nesne Dosya biçimi çeştli mimarilerde (32-bit yada 64-bit) taşınabilirliğin olabilmesi yönünde dizayn edilmiştir ve bu mimarilerden hiç birinde dosya biçimi açısından birbirine üstünlük yoktur.
ELFCLASS32 sınıfı 32-bit mimarilere destek verir.
Bu sınıflar 32-Bit Veri Tipleri tablosundaki tipleri kullanır. ELFCLASS64
ise 64-bit mimarilere destek verir ve oda 64-Bit Veri Tipleri tablosundaki tipleri
kullanır. Diğer sınıflar ise gerekli farklılıkar ile birlikte gerektikçe ileride
tanımlanmış olacaklar.
EI_DATAe_ident[EI_DATA] byte'ı Nesne Dosya tarafından kullanılan
veri yapılarını ve dosyanın Bülüm'lerinin içinde bulunan verinin ecode
edilmesi işlemini belirtir. Aşağıda şuan için tanımlı encoding çeşitleri listelenmiştir.
| İsim | Değer | Açıklama |
ELFDATANONE |
0 | Belirsiz data encoding |
ELFDATA2LSB |
1 | Aşağıya, grafiğe bakınız. |
ELFDATA2MSB |
2 | Aşağıya, grafiğe bakınız. |
Diğer değerler gerektikçe encoding işlemleri tanımlanabilmesi için rezerv edilmiştir.
EI_VERSIONe_ident[EI_VERSION] byte'ı ELF başlığının versiyon numarsını
tutar. Şu an için bu değer EV_CURRENT, olmalıdır; e_version
da olduğu gibi.EI_OSABIe_ident[EI_OSABI] byte'ı içinde bulunduğu dosya tarafından
kulanılan İşletim Sistemi veya ABI 'ye özgül ELF eklerini belirler. Diğer
bazı ELF yapılarının bazı alanları da İşletim Sistemi ve/veya ABI'ye özgül
bayraklar yada değerlere sahiptirler; bu alanların açıklamaları da bu byte'lar
tarfından tayin edilir. Eğer Nesne Dosya yukardaki türden eklentiler kullanmaz
ise bu byte'in değerinin 0 olması tavsiye edilir. Eğer bu byte'ın değeri 64
- 256 arasında bir değer ise sonuç, burdaki değer yerine kullanılacak değerin
ELF Başlık yapısı elemanı olan e_machine'den alınacağıdır. ABI
bu aralıkta ki değerleri, İşlemci Mimarileri için kendilerine bu byte'ta kullanmak
üzere gerekli değerler tanımlaması için ayırmıştır. Eğer yinede o aralıkta
bir değer yok ise, aşağıda bulunan tablodaki değerler bu byte için (ilgili
işlemci için) kullanılabilir. | İsim | Değer | Açıklama |
ELFOSABI_NONE |
0 | Eklentisiz yada belirsiz |
ELFOSABI_HPUX |
1 | Hewlett-Packard HP-UX |
ELFOSABI_NETBSD |
2 | NetBSD |
ELFOSABI_LINUX |
3 | Linux |
| 4 | IA32 GNU Mach/Hurd için rezerv edilmiştir. | |
| 5 | 86Open common IA32 ABI için rezerv edilmiştir. | |
ELFOSABI_SOLARIS |
6 | Sun Solaris |
ELFOSABI_AIX |
7 | AIX |
ELFOSABI_IRIX |
8 | IRIX |
ELFOSABI_FREEBSD |
9 | FreeBSD |
ELFOSABI_TRU64 |
10 | Compaq TRU64 UNIX |
ELFOSABI_MODESTO |
11 | Novell Modesto |
ELFOSABI_OPENBSD |
12 | OpenBSD |
| 64-255 | İşlemci Mimarileri için ayrılmış değerler alanı. |
EI_ABIVERSIONe_ident[EI_ABIVERSION] byte'ı, hangi Nesne'nin hedeflendiğine
ilişkin ABI versiyon'unu tutar. Burası uyumsuz bir ABI'den ayırt edilmek için
kullanılır. Bu versiyon numarsının yorumlanması da EI_OSABI 'deki
ABI tespitine bağlıdır. Eğer EI_OSABI'de bir değer tanımlanmamış
ise EI_ABIVERSION içinde 0 değeri kullanımlaıdır. 0 'unspecified'
yani belirsizliğe işaret eder. EI_PADe_ident içinde kullanılmayan byte'ların yerine işaret
eder. Bu byte'lar rezerv edilmiştir ve içleri 0 olarak doldurulmuştur ve program
bu kısımları okudumadan geçer. EI_PAD'ın değeri, ilerde bu boş
byte'lara bir anlam verilmesi hedeflendiği zaman değiştirilecektir.Bir dosyada "data encoding" işlemi, esas Nesne'lerin dosya içersinde
nasıl yorumlanacağını belirler. ELFCLASS32 sınıfı dosyalar 1,2
ve 4 byte'lık alanlar kullanırlar. ELFCLASS64 sınıfı dosyalar ise
1, 2, 4 ve 8 byte'lık alanlar meşkul ederler. Aşağıda tanımlanmış encoding işlemleri
görülmektedir.

ELFDATA2LSB encoding'i 2 nin tamlayanı olan değerleri belirtir ve en küçük
öncelikli byte en düşük adreste tutulur.

ELFDATA2MSB encoding'i 2 nin tamlayanı olan değerleri belirtir
ve en yüksek öncelikli byte en düşük adreste tutulur.
Kısım Başlık Tablosu hem Yeniden Konumlandırılabilir Dosya hemde Paylaşımlı Nesne Dosyalar da bulunur. Kısım'lar derleyici, assembly yorumlayıcısı ve bağlayıcı programlar tarafından uzak süreçleme için tasarlanmıştır. Belirli sayıda Kısım vardır ve bunlar Kısım Başlık Tablosunda tanımlanmışlardır. Kısım'lar; çalıştırılabilir kod, veri, dinamik bağlama için gerekli bilgiler; hata ayıklama bilgisi, sembol tablosu, yeniden konumlandırma bilgisi, yorum, string tablosu ve bazı notları içerirler. Kısım'lar ELF başlık hariç Nesne dosyanın bütün bilgilerini yani Program Başlık Tablosunu ve Kısım Başlık Tablo'sunu tutarlar. Bunların dışında bir kaç görevide yine Kısım'lar üstlenmişlerdir.
Her Kısım dosyada birbirini takip eden byte'larda bulunur. Kısım'lar dosyada üst üste binemezler ve hiç bir byte bir Kısım'dan fazlasında bulunamaz. Bir Nesne Dosya, pasif veri ihtiva eden bir alan da ihtiva edebilir. Ve bu alanın içeriği belirsizdir.
Kısım Başlık Tablo'su Elf32_Shdr yapısı tipinde bir dizidir. Ve
bu dizinin indekslerinden bazıları rezerv edilmiştir.Bu indeksler aşağıda listelenmektedir.
| İsim | Değer | Açıklama |
SHN_UNDEF |
0 | Bu indeks değeri tanımsız, eksik, anlamsız gibi anlamlara gelen bir üyedir. |
SHN_LORESERVE |
0xFF00 | Bu değer indeks olarak rezerv edilmiş olan rakamsal aralığının en alt sınırıdır. |
SHN_LOPROC - SHN_HIPROC |
0xFF00 - 0xFF1F | Bu değerler arası kullanımlar işlemçi'ye özgül işler için rezerv edilmiştir. |
SHN_ABS |
0xFFF1 | Bu indeks karşılıklı referansların tam değerlerini belirtir. |
SHN_COMMON |
0xFFF2 | Bu Kısım ile ilgili olarak tanımlanmış semboller ortak sembollerdir; Fortran'daki Common yada C deki yerleri henüz tahsis edilmemiş harici değişkenler gibi. |
SHN_HIRESERVE |
0xFFFF | Bu değer indeks olarak
rezerv edilmiş olan rakamsal aralığının en üst sınırıdır. SHN_LORESERVE
ve SHN_HIRESERVE
arasındaki değerler Kısım Başlık tablosunda bulunamazlar. |
NOT : Burada indeks 0'ında rezerv edildiği görülüyor, fakat Kısım Başlık
Tablo 0 indeksi için bir dizi elemanı bulundurur. Yani, eğer ELF Başlık yapısında
ki e_shnum'ın değeri 6 ise dosya da Kısım Başlık Tablosunda 6 tane giriş var
demektir ve bu girişler 0 dan 5 'e indekslenmiştir. İlk girişlerin içeriği de
bu Kısım içinde daha sonra belirtilmiştir.
ELF Başlık yapısı üyelerinden e_shoff, Kısım Başlık Tablo'sunun
dosyadaki byte ofsetini verir, e_shnum Kısım Başlık Tablo'sunun
kaç adet girdisi olacağı bilgisini tutar, e_shentsize ise her girdinin
byte cinsinden boyutunun nekadar olacağı bilgisini saklar. Bir Nesne dosyada
her Kısım kendisini tanıtan bir Kısım Başlık'a sahiptir. Fakat Kısım Başlık'ları
bir Kısım'ı olmadan da var olabilirler.
| Kısım Başlık yapısı |
typedef struct { |
sh_name |
Kısımın ismi için string tablosundaki indeks numarsı tutulur. |
sh_type | Kısım tipi. |
sh_flags |
Bayrak bitleri. |
sh_addr | Eğer belleğe yüklenebilir türden ise Kısım'ın temel bellek adresi, aksi durumda 0. |
sh_offset |
Dosyanın içinde Kısım'ların başladığı ilk byte'ın yeridir. |
sh_size |
Kısım'ın byte olarak kapladığı alan. |
sh_link |
Bu üyede Kısım Başlık tablosundaki indeks'e bağ bulunur. |
sh_info |
Kısım'ın tipi hakkında fazladan bilgi tutulur. |
sh_addralign |
Adres hizalamsı için sınır, bu değer ile belirlenir. |
sh_entsize |
Bazı Kısım'lar uzunlukları önceden belirlenmiş elamanları olan tablolar tutarlar, örneğin Sembol Tablosu gibi. İşte bu uzunluk değeri bu eleman ile belirlenir. |
Kısım Başlık Tablo elemanları isim, tip, Kısım'ı belleğe yüklemek için başlangıç
adresi (eğer yüklenebilir tip ise), dosya ofseti, Bülüm'ün byte olarak boyutu,
sıra numarası, ve Kısım'daki bilgilerin nasıl yorumlanacağına dair bilgiler
içerir. İsim olarak ihtiva edilen ve Unsigned Int türünden olan
bilginin string tipinden karşılığı String Tablosu (aslen buda bir Kısım'dır)
içersindedir.
Bugünkü Nesne Dosyalar her tipden sadece bir Kısım içermektedir fakat bu özellik ilerisi için geniş tutulmuştur. Aşağıda Kısım'ların tipleri, değerleri ve anlamları bir tabloda listelenmektedir.
| Kısım Tipleri / sh_type | ||
| Tip | Değer | Açıklama |
SHT_NULL |
0 | Bu tip Kısım başlığını inaktif olarak işaretler. Bu birleşik Kısım'larda kullanılmaz. |
SHT_PROGBITS |
1 | Bu tip Kısım'lar içersinde biçimi ve anlamı program tarafından belirlenen bilgiler tutulur. |
SHT_SYMTAB |
2 | Bu Kısım'lar Sembol Tablosunu tutarlar. |
SHT_STRTAB |
3 | Bu tip Kısım'lar da String Tablosu tutulur. Bir Nesne Dosyada birden çok String Tablosu olabilir. |
SHT_RELA |
4 | Bu Kısım'larda Yeninden Konumlandırma bilgileri tutulur. Bir Nesne Dosyada birden çok Yeniden Konumlandırma Kısım'ı bulunabilir. |
SHT_HASH |
5 | Bu tip Kısım'larda Sembol Hash Tablosu tutulur. Bağlama işlemine katılan tüm Nesne Dosya'lar mulaka Sebmol Hash Tablosu barındırırlar. Bugünkü Nesne Dosya'larda bir tane Sebmol Hash Tablosu olması öngürülmüştür fakat ilersi için bu özellikte gevşek tutulmuştur. |
SHT_DYNAMIC |
6 | Bu Kısım dinamik bağlama işlemi ile ilgili bilgileri içerir. Bunlarında bir adet olması söz konusudur bugünkü durumda, fakat yine ilersi için gevşek tutulmuştur. |
SHT_NOTE |
7 | Bu tip Kısım'lar dosyaların bazı durumlar için duruma özel işaretler barındırması içindir. |
SHT_NOBITS |
8 | Bu tip
bir Kısım dosya içersinde bir yer kaplamaz. Ama aksi bir durum ise SHT_PROGBITS'e
benzerlikleridir. |
SHT_REL |
9 | Bu Kısım'lar da Yeniden Konumlandırma bilgileri tutulur. Bir Nesne Dosya'da birden çok Yeniden Konumlandırma Kısım'ı bulunabilir. |
SHT_SHLIB |
10 | Bu tip rezerv edilmiştir. Bu tip bir Kısım içeren bir nesne dosya ABI'ye uymaz. |
SHT_DYNSYM |
11 | Bu Kısım'lar Sembol Tablosunu tutarlar. |
SHT_INIT_ARRAY |
14 | Bu Kısım başlangıç işlemleri için kullanılacak olan fonksiyonlara işraret eden işaretçilerin bulunduğu bir diziyi tutar. |
SHT_FINI_ARRAY |
15 | Bu Kısım ise bitiş işlemleri için kullanılacak olan fonksiyonlara işraret eden işaretçilerin bulunduğu bir diziyi tutar. |
SHT_PREINIT_ARRAY |
16 | Bu Kısım'da başlangıç işlemleri için kullanılacak olan fonksiyonlar tarafından kullanılacak olan fonksiyonlara işraret eden işaretçilerin tutulduğu bir dizi tutulur. |
SHT_GROUP |
17 | Bu Kısım bir Kısım grubu tanımlar. Kısım grubu birbiri ile ilgili Kısım'ların kümelenmesidir ve bağlayıcı tarafından kullanılır. Sadece Yeniden Konumlandırılabilir Nesne' lerde görülür. |
SHT_SYMTAB_SHNDX |
18 |
Bu kısım |
SHT_LOOS |
0x60000000 | Bu aralıktaki değerler (sınırlarda dahil), işletim sistemi tanımlı semantik'ler için ayrılmışlardır. |
SHT_HIOS |
0x6FFFFFFF | |
SHT_LOPROC |
0x70000000 | Bu değerler arası (sınırlarda dahil) kullanımlar işlemciye özgül işler için rezerv edilmiştir. |
SHT_HIPROC |
0x7FFFFFFF | |
SHT_LOUSER |
0x80000000 | Bu değer, uygulama programları için ayrılmış olan rakamsal aralığının en alt sınırıdır. |
SHT_HIUSER |
0xFFFFFFFF | Bu değer,
uygulama programları için ayrılmış olan rakamsal aralığının en üst sınırıdır.
SHT_LOUSER ve SHT_HIUSER arasındaki değerler sadece
uygulama programları için ayrılmışlardır ve asla şimdi kullanılan yada gelecekte
kullanılacak olan sistem tanımlı Kısım tipleri ile bir çakışma olmaz. |
Diğer Kısım tip değerleri reserv edilmiştir. İndeks 0 tanımlanmamış Kısım'ı
göstermesine rağmen, Kısım Başlığının indeks 0 değeri doldurulmuştur (SHN_UNDEF).
Bu değerler aşağıdaki gibidir.
| İsim | Değer | Açıklama |
| sh_name | 0 | isimsiz (No name) |
| sh_type | SHT_NULL | etkisiz (Inactive) |
| sh_flags | 0 | bayrak yok (No flags) |
| sh_addr | 0 | adres yok (No address) |
| sh_offset | 0 | dosya ofseti yok (No file offset) |
| sh_size | 0 | boyut yok, yer kaplamayan (No size) |
| sh_link | SHN_UNDEF | bağlanma bilgisi yok (No link information) |
| sh_info | 0 | yardımcı bilgi yok (No auxiliary information) |
| sh_addralign | 0 | hizalama yok (No alignment) |
| sh_entsize | 0 | giriş yok (No entries) |
Kısım Başlık'ı yapısı üyesi olan sh_flags 1 bit'lik bir bayrak
değeri taşır bu değer ile Kısım'ın özniteliği belirlenir. Aşağıda bu değerler
listelenmiştir.
| İsim | Değer | Açıklama |
SHF_WRITE |
0x1 | Bu öznitelikdeki Kısım'lar, sürecin çalışma zamanı boyunca değiştirilebilir veri içerirler. |
SHF_ALLOC |
0x2 | Bu öznitelikdeki Kısım sürecin çalışma süresi boyunca bellekte kalır. Bazı kontrol Kısım'larında ise buna gerek yoktur ki işte bu öznitelik bu Kısım'lar için kullanılmamış durumdadır. |
SHF_EXECINSTR |
0x4 | Bu öznitelikli Kısım'lar çalıştırılabilir makina komutları içerirler. |
SHF_MASKPROC |
0xF0000000 | Bu öznitelikteki bütün bit'ler işlemciye özgü işlemler için rezerv edilmiştir. |
| İsim | Tip | Öznitelik | Açıklama |
.bss |
SHT_NOBITS |
SHF_ALLOC + SHF_WRITE |
Bu Kısım'da program başlangıcında ilk değer verilmemiş değişkenler tutulur. Bu Kısım, tipininde işaret ettiği gibi diskte yer kaplamaz. |
.comment |
SHT_PROGBITS |
- |
Versiyon kontrol bilgileri tutulur. |
.data |
SHT_PROGBITS |
SHF_ALLOC + SHF_WRITE |
Program başlangıcında ilk değer verilmiş değişkenler tutulur. |
.data1 |
SHT_PROGBITS |
SHF_ALLOC + SHF_WRITE |
|
.debug |
SHT_PROGBITS |
- |
Sembolik hata ayıklama işlemi bilgileri tutulur. İçeriği belirlenmemiştir. Bütün ".debug" ön isimli Kısım isimleri ilerki kullanımlar için rezerv edilmiştir. |
.dynamic |
SHT_DYNAMIC |
açıklamaya bakınız -> |
Dinamik bağlama bilgileri tutulur. SHF_ALLOC
ve SHF_WRITE gibi özniteliklere sahiptir. SHF_WRITE
bit'i İşletim Sistemi ve İşlemci tarafından tayin edilir. |
.dynstr |
SHT_STRTAB |
SHF_ALLOC |
Dinamik bağlama için gerekli string'ler tutulur (genelde bu stringler Sebmol Tablosu ile ilişkilidirler). |
.dynsym |
SHT_DYNSYM |
SHF_ALLOC |
Dinamik bağlama ile ilgili Semnol Tablosu burada tutulur. |
.fini |
SHT_PROGBITS |
SHF_ALLOC + SHF_EXECINSTR |
Bu kısımda programın sonlandırılmasında çalışacak olan koda yönelik bilgiler bulunur (sadece c++ için). |
.got |
SHT_PROGBITS |
açıklamaya bakınız -> |
Global Ofset Tablosu burda tutulur. |
.hash |
SHT_HASH |
SHF_ALLOC |
Hash Sembol Tablosu burda tutulur. |
.init |
SHT_PROGBITS |
SHF_ALLOC + SHF_EXECINSTR |
Bu kısımda programın başlangıcında çalışacak olan koda yönelik bilgiler bulunur (sadece c++ için, C'de burda sadece main() çağrılır.). |
.interp |
SHT_PROGBITS |
açıklamaya bakınız -> |
Bu kısım program yorumlayıcı yolu bilgisini tutar (örn: *.sh dosyalarında en üstteki #!/bin/sh). Eğer bu kısım dosyada var ise sistem programı direk çalıştırmaktansa elf dosyasını ve bu kısmı interpreter'a argüman olarak gönderir. Bu kısım, pratikte çalışma zamanı sırasında dinamik bağlama ile program çalıştırma ve paylaşımlı kütüphane'den gerekli olanları bağlamak için kullanılıyor. |
.line |
SHT_PROGBITS |
- |
Bu kısımda, sembolik hata ayıklama işlemi için kaynak kodun satır numaraları tutulur. İçeriği belirlenmemiştir. (GNU gdb gibi hata ayıklama programları için) |
.note |
SHT_NOTE |
- |
Bu Kısım'da bazı ekstra bilgiler tutulur. Daha geniş bilgiyi 6.2 Not Kısım'ı başlığı altında bulabilirsiniz. |
.plt |
SHT_PROGBITS |
açıklamaya bakınız -> |
Burda Yöntem bağlantı Tablosu (Procedure Linkage Table) tutulur. |
.relname |
SHT_REL |
açıklamaya bakınız -> |
Bu kısım Yeniden Konumlandırma için ilgili Kısım hakkında çeşitli bilgileri tututar. "name" kısmına hangi Kısım'a Yeniden Konumlandırma işlemi uygulanacaksa onun ismi gelir ve onunla ilgili bilgiler tutulur. Mesela .text kısmı için .rel.text yada .rela.text. veya .rel.data .rel.rodata gibi. |
.relaname |
SHT_RELA |
açıklamaya bakınız -> |
|
.rodata |
SHT_PROGBITS |
SHF_ALLOC |
Burada süreç imajının yazma korumalı Bölüm'leri için yine yazma korumalı bilgiler saklanır. |
.rodata1 |
SHT_PROGBITS |
SHF_ALLOC |
|
.shstrtab |
SHT_STRTAB |
- |
Burada Kısım isimleri tutulur. |
.strtab |
SHT_STRTAB |
açıklamaya bakınız -> |
Burda genellikle
sebmol tablosundaki girişlerle bağdaştırılmış isimler yani string'ler
tutulur. Eğer dosyada String Tablosunu içeren yüklenebilir bir Bölüm var
ise Kısım'ın öznitelikleri |
.symtab |
SHT_STRTAB |
açıklamaya bakınız -> |
Burada sembol tablosu
tutulur. Eğer dosyada Sembol Tablosunu içeren yüklenebilir bir Bölüm var
ise Kısım'ın öznitelikleri |
.text |
SHT_PROGBITS |
SHF_ALLOC + SHF_EXECINSTR |
Bu Kısım'da programa ait çalıştırılabilir talimatlar (instruction) bulunur. |
Kısım isimleri "." öneki almış halde sistem için rezerv edilmişlerdir, ancak mevcut anlamları yeterli ise uygulamalar da bu Kısım'ları kullanabilirler. Uygulama programları sistem Kısım'ları ile bir karışıklığa sebep olmamak için isimlendirmede "." kullanmayabilirler. Nesne Dosya Biçimi yukarıdaki listede olmayan bir tanımlamayada izin verir. Bir Nesne dosyada aynı isimde Kısım'lar olabilir. İşlemci Mimarileri için mimari ismi kısaltması önde olacak şekilde Kısım isimleri rezerv edilmiştir.
Bu Kısım varsayılan String tablosunu tanımlar. String Tablosu Kısım'ları "NULL"
ile sonlanrılmış karakter dizileri tutarlar ve bunlar genellikle String olarak
anılırlar. Nesne Dosya bu String'leri Sembol ve Kısım isimlerini belirtmede
kullanırlar. Nesne Dosya, String Tablosu Kısım'ındaki indeks niteligindeki bir
kelimeye işaret eder. Ilk byte ki bu Indeks 0'dır, "NULL"
karakter barındırır. Aynı şekilde String Tablosunun son byte'ı da "NULL"
karakterdir ki tüm string'lerin sonunun "NULL" ile bitmesinden
emin olunsun. Indeks 0'da bulunan String içeriğe bağlı olarak "no name"
yada "null name" belirtir. Boş String Tablosu Kısım'larına
izin verilmiştir, bu durumda o Kısım Başlık sh_size değeri sıfır
olacaktır. Sıfırdan farklı indeks boş String tablosu için geçersizdir.
Bir Kısım Başlık sh_name üyesi, Kısım Başlık String Tablosu içine
işaret eden ve ELF Başlık üyesi e_shstrndx tarafından gösterilen
bir indeks tutar. Aşağıda tabloda 25 byte olan ve çeşitli indeks değerleri ile
ilişkilendirilmiş bir String Tablosu örneği görülmektedir.
| İndeks | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \0 |
n |
a |
m |
e |
. |
\0 |
V |
a |
r |
| 10 | i |
a |
b |
l |
e |
\0 |
a |
b |
l |
e |
| 20 | \0 |
\0 |
x |
x |
\0 |
  |
||||
| İndeks | String |
|---|---|
| 0 | none |
| 1 | name. |
| 7 | Variable |
| 11 | able |
| 16 | able |
| 24 | null string |
Örnekte görüldüğü gibi, bir String Tablosu İndeks'i Kısım'da herhangi bir byte ile ilişkilendirilmiş olabilir. Bir Sitring birden fazla görünebilir, substring'lere referans edilebilir ve bir String birden cok kere referans edilebilir. Bir tabloda referans edilmemiş String'lerde bulunabilir.
Bir Nesne Dosya Sembol Tablosu, Program sembolik tanım ve referanslarının yerleştirilebilmeleri veya Yeniden Konumlandırılabilmeleri için ihtiyaç duyulan bilgileri tutarlar. Bir Kısım Başlık Tablosunun indeksi bu diziyi tanımlayan bir numaradır. İndeks 0 hem tablodaki ilk girişe işaret eder hemde tanımsız sebmol indeks'i gibi davranır. İçeriğe dair başlangıç girişleri bu Kısım'dan önce belirlenmiştir.
| İsim | Değer |
|---|---|
STN_UNDEF |
0 |
Bir Sembol tablosu girişleri aşağıdaki yapıdadır..
| Sembol Tablosu girişi |
typedef struct {typedef struct { |
| Tip | Açıklama |
st_name |
Bu üye, Nesne Dosya Sembol String tablosunda bulunan ve Sembol isminin karakter betimleyicilerini barındıran bir indeks tutar. Eğer sıfırdan farklı ise, Sembol ismini veren bir String Tablosu indeks'ini belirtir. Aksi durumda, Sembol tablosu kaydı isimsizdir. |
st_value |
Bu üye, ilişkilendirilmiş sembol değerini verir. İçeriğe bağlı olarak bu bir mutlak değer, bir adres yada benzeri olabilir. |
st_size |
Çoğu sembol'ler ilişkili boyutlara sahipdirler. Örneğin, Veri Nesne boyutu Nesne içinde barındırılan baytlardır. Eğer sembol yer kaplamayan, boyutsuz ise bu üye sıfır yada bilinmeyen size olacaktır. |
st_info |
Bu üye Sembol'ün tipini ve binding özelliklerini tanımlar. Alabileceği değerler ve anlamları aşağıda görülmektedir. Aşağıda bulunan örnek kodlarda da değerlerin nasıl işleneceği görülmektedir.
|
st_other |
Bu üye şimdilik sıfırdır, ve bir tanım yapılmamıştır. |
st_shndx |
Her Sembol Tablosu girişi bir Kısım ile ilişkili olarak tanımlanmışlardır. Bu üye, ilgili Kısım Başlık Tablosu indeks değerini tutar. "Kısım Tipleri" ile ilgili tabloda bazı İndeks'lerin ne anlama geldikleri belirtilmeketdir. |
Bir sembol'ün binding özelliği bağlama durumunu belirler.
| Sembol Binding, ELF32_ST_BIND | ||
| İsim | Değer | Açıklama |
STB_LOCAL |
0 |
Yerel semboller tanımlamalarını barındıran diğer Nesne Dosya'lar için gürülebilir değildirler. Birden çok dosyada aynı isimdeki yerel semboller birbirine karışmadan var olabilirler. |
STB_GLOBAL |
1 |
GLOBAL semboller birleştirildikleri diğer dosyalar için görülebilirdirler. Bir dosyanın global sembol tanımlaması başka bir dosyada da kullanıma izin verir. |
STB_WEAK |
2 |
WEAK semboller GLOBAL sembollere benzerler, ancak onların tanımlamaları düşük öceliklidir. |
STB_LOPROC |
13 |
Bu aralıkta bulunan değerler İşlemcilere özgü anlamlar için rezerv edilmişdir. |
STB_HIPROC |
15 |
|
Herbir sembol tablosunda STB_LOCAL binding içeren semboller WEAK ve GLOBAL sembollerinden önce gelir. Bir Sembol'ün tipi diğerleri ile birlikte varolabilmesi için bir genel sınıflandırma sağlar. ELF Nesne dosyasında bulunan semboller, Bağlayıcı ve Yükleyici için taşımaya has bilgilerdir.
| Sembol Tipleri, ELF32_ST_TYPE | ||
| İsim | Değer | Açıklama |
STT_NOTYPE |
0 | Sembol'ün tipi tanımlanmamıştır. |
STT_OBJECT |
1 | Bu sembol veri nesnesi ile ilgilidir. değişken, dizi, vs. |
STT_FUNC |
2 | Bu sembol bir fonksiyon yada başka bir çalıştırılabilir kod ile ilgilidir. |
STT_SECTION |
3 | Bu sembol bir Kısım ile ilgilidir. Bu tip sembol tablosu girişleri öncelikle yeniden konumlandırma için var olmaktadır ve STB_LOCAL binding'ine sahiptirler. |
STT_FILE |
4 |
Bir dosya sembolu STB_LOCAL binding'ine sahiptir, Kısım
İndeks'ide |
STT_LOPROC |
13 | Bu aralıkta bulunan değerler İşlemcilere Özgü anlamlar için
rezerv edilmiştir. Eğer bir Sembol'ün değeri, bir Kısım içinde belirli bir
yer ile ilgili ise, onun Kısım İndeks üyesi st_shndx, Kısım
Başlık Tablosundaki bir indeksi tutar. Yeniden konumlandıra sırasında Kısım
taşınırken, sembol değeride olduğu gibi değişir ve sembole olan referans
aynı noktayı göstermeye devam eder. Bazı özel Kısım indeks değişkenleri
başka anlamdadırlar. |
STT_HIPROC |
25 | |
SHN_ABS |
- | Sembol yeniden konumlandırma yüzünden değişmeyen bir mutlak değere sahiptir. |
SHN_COMMON |
- |
Sembol etiketleri henüz tahsis edilmemiş genel bloklardır. Sembol değeri
Kısım'e ait |
SHN_UNDEF |
- | Bu Kısım Tablosu İndeks'i, Sembol tanımsızdır anlamı taşır. Ne zamanki Bağlama Programı bu Nesne dosyayı bir başkası ile birleştirirse o zaman gösterilmiş sembolleri tanımlar yani bu dosyada kullanılan sembol referansları gerçek tanımlamaları ile bağlanacaktır. |
Yukarıda da bahsedildiği gibi, Sembol Tablosu değeri olan Indeks 0 (STN_UNDEF)
rezerv edilmiştir ve aşağıdaki değerleri alır.
| Sembol Tablosu Girişi: Indeks 0 | ||
| İsim | Değer | Açıklama |
st_name |
0 | İsmi olmayan (No Name) |
st_value |
0 | Sıfır değeri (Zero value) |
st_size |
0 | Yer Kaplamayan (No size) |
st_info |
0 | Tipi olmayan, yerel binding olmayan (No type, local binding) |
st_other |
0 | |
st_shndx |
SHN_UNDEF | Kısım'ı olmayan (No section) |
Sembol tablosu girişleri, st_value'den dolayı farklı Nesne Dosya
tipleri için biraz farklı yorumlara sahiptirler.
st_value Yeninden Konumlandırılabilir bir dosya içinde Kısım'ı
SHN_COMMON olan bir sembol için hizalama kısıtlamaları tutar.
st_value Yeninden Konumlandırılabilir bir dosya içinde tanımlanmış
bir sembol için bir Kısım ofset'i tutar. Yani st_value değişkeni
st_shndx tanımlayıcı Kısım'ı başlangıcından bir ofset'tir. st_value sanal
bir adres tutar. Kısım ofset (dosya yorumu), Dinamik Bağlayıcı bu dosyanın
sembollerini daha kullanışlı yapmak için Kısım numarası önemsiz olan sanal
adresler'e (bellek yorumu) izin verir. Sembol tablosu değerleri farklı Nesne dosyalar için benzer anlamlara sahip olsada, veriye etkin erişim uygun program tarafından sağlanabilmektedir.
Yeniden konumlandırma sembolik referans ile sembolik tanımlama arasında bir bağlantı kurma işidir. Örneğin, program bir fonksiyon çağırdığında, ilişkilendirilmiş çağırma talimatı (call instruction) kontrolü çalışma esnasında doğru adrese transfer etmelidir. Başka bir deyişle, yeninden konumlandırılabilir dosyalar kendi Kısım içeriklerinde nasıl değişiklik yapılabileceğine dair bilgi içermelidirler. Böylece çalıştırılabilir ve paylaşımlı nesne dosyalar, süreç program imajı için doğru bilgiyi tutmabilirler. Yeniden konumlandırma girişleri bu verilerdir.
| Yeniden Konumlandırma girişleri |
typedef struct {typedef struct { |
| İsim | Değer |
r_offset |
Bu üye hangi alana yeniden konumlandırma işlemi yapılacağı bilgisini verir. Yeniden Konumlandırılabilir dosya için bu değer, Kısım başlangıcından yeniden konumlandırma işlemi tarafından etkilenmiş bellek birimine kadar olan byte ofset'idir. Çalıştırılabilir ve paylaşımlı nesne dosyalar için bu değer yeniden konumlandırma işlemi tarafından etkilenmiş bellek alanının bir sanal adresidir. |
r_info |
Bu üye hem yeniden konumlandırma yapılması gereken konumu işaret eden
Sembol Tablosu indeks değerini hemde ne tür bir yeniden konumlandırma
yapılması gerektiği bilgisini verir. Örneğin, bir çağırma talimatının
(call instruction) yeniden konumlandırma girişi fonksiyonun çağırılışına
dair bir Sembol Tablosu indeks'ini tutar. Eğer indeks
|
r_addend |
Bu üye yeniden konumlandırılabilir alanda saklanacak değeri hesaplamak için kullanılacak bir değişmez soneki belirtir. |
Yukarıda da görüldüğü gibi, sadece Elf32_Rela girişleri belirgin
bir sonek içermektedir. Elf32_Rel tipinin girişleri, ilgili alanda
farklı olmak için bir tam sonek barındırırlar. İşlemci mimarisine bağlı olarak
bir isimlendirme formu yada başkası daha gerekli yada uygun olabilir. Sonuç
olarak, belirli bir makina için kullanılan uygulama işlemi (implementation)
yalnız bir form'u yada içeriğe bağlı olan herhangi bir form'u kullanabilir.
Bir yeniden konumlandırma Kısım'ı iki başka Kısım'a referanstır: bir sembol
tablosu ve değiştirmek için bir Kısım. Yukarıda anlatıldığı gibi Kısım Başlığı
üyeleri sh_info ve sh_link bu ilişkiyi belirler. Farklı
dosyalar için yenieden konumlandırma girişleri r_offset üyesinden
dolayı biraz farklı yorumlara sahiptirler.
• Yeninden konumlandırılabilir dosyalarda r_offset bir Kısım ofseti
tutar. Yani, yeniden konumlandırma Kısım'ının kendisi dosya içersinde başka
bir Kısım'ın nasıl değiştirileceğini tarif eder, yeniden konumlandırma ofset'leri
ikinci Kısım'da bir bellek birimi tarif ederler.
• Çalıştırılabilir ve paylaşımlı nesne dosyalarda r_offset bir
sanal adres tutar. Kısım ofset (dosya yorumu), Dinamik Bağlayıcı'da bu dosyanın
yeniden konumlandırma girişlerini daha kullanışlı yapmak için sanal adresler'e
(bellek yorumu) izin verir.
Farklı Nesne dosyalarda r_offset yorumu, ilgili program tarafından
daha etkin bir erişim için değişiyorsa da, yeniden konumlandırma tipleri anlamları
hep aynı kalır.
Çalıştırılabilir ve Paylaşımlı Nesne dosyalar statik olarak programları gösterirler. Sistem dinamik program gösterimleri (representations) yada süreç imajı oluşturmak için dosyaları kullanır, bunu bir programı çalıştırmak için yapar. Bir süreç imajı kendi text, data, stack vb. şeyleri barındıran Bölüm'lere sahiptir. Birinci veri yapısı, bir Program Başlık Tablosu, Bölüm imajlarını dosyanın içinde bulundurur ve program için bellek imajı oluşturulmakta kullanılmak üzere diğer gerekli bilgileri içerir.
Verilen bir Nesne Dosyasını çalıştırabilmek için sistem onu belleğe yükler. Yükledikten sonra sistem, Nesne Dosyalar arasındaki sembolik referansları çözümleyerek süreç imajını tamamlamalıdır ki süreci oluşturabilsin.
Program Başlık Tablosu elemanları Nesne Dosya içersinde bir Bölüm'ün bilgilerini
içeren yada programın çalışması için gerekli bilgileri içeren bir yapı dizisidir.
Burdaki elemanların uzunlukları ve kaç adet olacakları bilgisi ELF Başlık kısımında
tutulmaktadır (ELF Başlık yapısının e_phentsize ve e_phnum
elemanları). Her eleman; tür, dosya ofseti, fiziksel adres, sanal adres, dosya
boyutu, belleğe yüklenecek program boyutu ve Bölüm'ün program içersindeki sırası
bilgisini içerir. Program başlık yapısı aşağıda görülmektedir.
| Program Başlık yapısı |
typedef struct {typedef struct { |
p_type |
Bölüm'ün tip bilgisi tutulur. Değerleri ve anlamları aşağıda sunulacaktır. |
p_offset |
Dosyada Bölüm'ün ilk byteının bulunduğu yeri belirtir. |
p_vaddr |
Bellekte sanal adresdeki Bölüm'ün ilk byte'ının bulunduğu yeri belirtir. |
p_paddr |
Bölüm'ün bellekte bulunduğu fiziksel adresdir. Fakat çoğu sistemde kullanıcı süreçleri (user process) için fiziksel adrese erişim engeli olduğu için pasifdir. |
p_filesz |
Bölüm'ün dosyadaki byte cinsinden boyutudur. Sıfır olabilir. |
p_memsz |
Bölüm'ün bellekteki daki byte cinsinden boyutudur. Sıfır olabilir. |
p_flags |
Bölüm'ler için tanımlı bazı bayraklar. |
p_align |
Bölüm'ün bellek ve dosyada olan hizalama gereksinimidir. |
Bölüm'ler belleğe direk yerleşebilecek ve çalışabilecek şekilde tasarlanmışlardır
ve sistem yükleyicisi tarafından işlenmiş ve Program Başlık Tablosunda tanımlanmışlardır.
Her Bölüm bir veya daha fazla Kısım'dan oluşabilirler, yani benzer Kısım'ların
bir araya getirilmesi ile oluşturulabilirler. Yanlızca okunabilir veri içerebilir,
ve dinamik bağlayıcı için sembol içerebilir. Örneğin text Bölüm'ü çalıştırılabilir
kodlar, veri Bölüm'ü programa ilişkin veriler, dinamik Bölüm ise dinamik yükleme
için çeşitli bilgilerin gruplandığı Kısım'lar topluluğudur. İşletim Sistemi,
eğer o anki Bölüm yüklenmeye uygun ise (yapıdaki p_type değişkeni
PT_LOAD'a eşitse) belleğe yükleneceği yer ve bellekte kaplayacağı
büyüklük bilgisine göre belleğe yükler, başka bir deyişle dosya Bölüm'ünün mantıksal
kopyasını Program Başlık Tablosundaki bilgilere göre bir sanal bellek Bölüm'üne
yükler. İşletim sistemi paylaşımlı bellek kaynakları olşururken de Bölüm'leri
kullanabilir.
Segmen çeşitleri yapının p_type elemanı ile belirlenir. Bu elemana
verilen değerlere göre tipler aşağıda listelenmiştir diğer değerler ilerisi
için rezerv edilmiştir.
| Segment Tipleri / p_type | ||
|---|---|---|
| İsim | Değer | Açıklama |
PT_NULL |
0 | Bu dizi elemanı, kullanım dışıdır. Yapının diğer üyelerinin değerleri tanımsızdır. Bu tip, program başlık tablosuna, ihmal edilmiş (ignore) girişleri bulundurabilme imkanı, hakkı verir. |
PT_LOAD |
1 | Bu dizi elemanı, p_filesz ve p_memsz tarafından
tanımlanmış bir yüklenebilir Bölüm belirtir. Dosyadan byte'lar bellek Bölüm'ünün
başlangıcına haritalanmıştır. Eğet Bölüm'ün bellek boyutu (p_memsz)
Bölüm'ün dosya boyutundan (p_memsz) büyük ise 0 değerini tututma
için ekstra byte'lar tanımlanır ve bunun için Bölüm için hazırlanmış alan
takip edilir. Dosya boyutu bellek boyutundan büyük olmayabilir. Program
başlık tablosunda yüklenebilir Bölüm girişleri p_vaddr üyesine
göre küçükten büyüğe doğru sıralanmış haldedir. |
PT_DYNAMIC |
2 | Bu dizi elemanı, dinamik bağlama işlemleri için kullanılmaktadır. |
PT_INTERP |
3 | Bu dizi elemanı, yorumlayıcı olarak çalışacak olan dosyanın yolunu (NULL
ile sonlandırılmış string olarak) ve boyutunu belirler. (örn:
*.sh dosyalarında en üstteki #!/bin/sh satırının..) |
PT_NOTE |
4 | Bu dizi elemanı, konum ve yardımcı bilgilerin boyutunu tanımlar. |
PT_SHLIB |
5 | Bu Bölüm tipi rezerv edilmiştir ancak tanımsız bir anlama (semantic) sahiptir. |
PT_PHDR |
6 | Bu dizi elemanı eğer var ise, hem dosyada hemde programın bellek imajında Program Başlık Tablosunun konumunu ve boyutunu kendisi belirler. Bu Bölüm dosyada birden fazla olmayabilir. Ayrıca bu Bölüm sadece Program Başlık Tablosu program bellek imajının bir parçası ise var olabilir. Eğer var olmuş ise de, bütün yüklenebilir Bölüm girişlerinden önde olacaktır. |
PT_TLS |
7 | - |
PT_LOOS |
0x60000000 | - |
PT_HIOS |
0x6FFFFFFF | - |
PT_LOPROC |
0x70000000 | Bu aralıktaki değerler İşlemcilere Özgü semantik'ler için rezerv edilmiştir. |
PT_HIPROC |
0x7FFFFFFF | |
NOT: Özellikle başka bir yerde gerekmedikçe büttün Program Başlık Bölüm tipleri opsiyoneldir. Yani, bir dosyanın Program Başlık Tablosu sadece içerik ile ilgili elementleri barındırabilir.
Bazen program veya sistem üreticileri tarafından, bir Nesne Dosyaya başka programların;
uyumluluk, uygunluk vb. konular için kontrol edebilecekleri bazı özel bilgiler
içeren işaretler koyma ihtiyaçları doğabilir. Kısım tipi SHT_NOTE
ve Program Başlık elemanı tipi PT_NOTE bu amaç için kullanılabilir.
Kısım'lar ve Program Başlık elemanlarındaki Not Bilgisi herhangi bir
sayıda girdi tutar. Bu girdilerin her biri çalışılan işlemciye göre 4-byte boyutundaki
word'lerden oluşan bir dizidir. Aşağıda Not Bilgisi
organizasyonu konusunda açıklamalar bulunmaktadır, ancak onlar tanımlamanın
bölümlerinden değildirler.
Not Bilgisi
|
namesz
|
|
descsz
|
|
type
|
|
name
. . . |
|
desc
. . . |
| İsim | Açıklama |
|---|---|
| namesz ve name | İsim Kısım'ındaki ilk namesz byte'ları
girişin sahibinin yada başlatıcının (originator) "NULL"
ile sonlandırılmış karakter gösterimlerini içerir. İsim çatışmalarından
kaçınılması için herhangi bir biçimsel mekanizma yoktur. Genellikle üreticiler
tanımlayıcı açıklama olarak kendi isimlerini kullanma eğilimindedirler;
"ABC Yazilim A.S" gibi. Eğer hiç bir isim yok ise, namesz
0 içerecektir. Eğer tanımlayıcı için 4-byte'lık hizalamadan emin olunması
gerekli ise, boşlukları doldurma işlemi uygulabilir. İlgili doldurma işlemine
namesz dahil değildir. |
| descsz ve desc | Desc'de ilk descsz byte'ları Not tanımlayıcısını (descriptor) tutar. ELF tanımlayıcı içeriği üzerinde herhangi bir kısıtlma uygulamaz. Eğer herhangi bir tanımlayıcı yok ise, descsz 0 olacaktır. Yine eğer Not girişi için 4-byte'lık hizalamadan emin olunması gerekli ise, boşlukları doldurma işlemi uygulabilir ve ilgili doldurma işlemine descsz dahil değildir. |
| type |
Bu kelime tanımlayıcı ile ilgili yorumu veriri. Her başlatıcı (originator) kendi tipini kontrol eder, tek bir tip değişkenin birden çok yorumuda olabilir. Bu şekilde, bir program, anlaşılması için bir tanımlayıcının hem ismini hemde tipini tanımlamalıdır. Şimdilik tipler pozitif olmak zorundadır. ELF tanımlayıcının (descriptor) ne anlama geldiğini belirtmez. |
Aşağıda örnek Not Bölüm girişleri görülmektedir.

NOT: Sistem Not bilgisini no name (namesz==0) ve sıfır uzunluklu name (name[0]=='\0')
ile birlikte ayırır ancak şu an itibari ile herhangi bir tip tanımlamaz. Bütün
diğer isimler en az bir 'NULL' olmayan karakter barındırmak zorundadırlar.
NOT: Not bilgisi opsiyoneldir. Not bilgisinin olması programın TIS uyumluluğunda
bir etki yaratmaz, aynı şekilde verilen bilgiler programın çalımasında da bir
etki yaratmaz. Ki etkilese beklenmedik hatalar çıkabilir.
Prgoram yükleme İşletim Sistemi tarafından yapılan bir süreç imajı oluşturma yada büyütme işlemidir. Uygulamada, programın başarılı sonuç alması ve hangi sayfa yönetim (page management) fonksiyonlarının program için yürütüleceği (handling) işlemi İşletim Sistemi ve İşlemci tarafından kararlaştırılır ve yapılır.
Dinamik bağlama, süreci başlangıca hazırlama (process initialization) ve/veya çalıştırma zamanında referansları çözme işemidir. Bazı basit mekanizmalar çalışmak için belirli bağlama modellerine ihtiyaç duyarlar ve bu amaç için ELF Kısım'ları ve Başlık elemanları rezerv edilmişdir. Gerçek Bağlama Modeli tanımlaması, İşletim Sistemi ve ugulama işlemi (implementation) tarafından belirlenir. Bu yüzden bu Kısım'ların içerikleri hem İşletim Sistemi hemde İşlemciye özgüdür.
Bu bölümde İşletim Sistmi ve İşlemciye özgün rezerv edilmiş isimler listelenmektedir.
Çeşitli Kısım'lar Program ve Kontrol bilgisi tutarlar. Bunlar aşağıda listelenmiştir.
| İsim |
|---|
.bss
|
_DYNAMIC, Aşağıda dinamik dizi etiketleri listelenmektedir. (d_tag)
| İsim |
|---|
DT_NULL
|
Tanımlanmış İşlemcilere dair ELF sabitleri için belirlenmiş bir isimlendirme
biçimi vardır. DT_, PT_ gibi isimler; işlemciye özel
uzantıların oluşturulabilmesi için İşlemcinin ismi ile birleşirler: örnğin DT_M32_SPECIAL.
Ancak bu yapıyı kullanmayan mevcut işlemci uzantılarıda desteklenmektedir.
| Mevcut Uzantılar |
|---|
DT_JMP_REL
|
İşlemci Mimairleri için rezerv edilmiş Kısım isimleri için kullanılan kalıpta
Kısım ismi kısaltması yerine mimair ismi kısaltması kullanılır. Bu isim e_machine
için kullanılmış olan mimair isimlerinden alınmalıdır. Örneğin .FOO.psect
FOO mimarisine ait bir psect Kısım'dır. Var olan son ekler kendi
tarihsel isimleri ile anılırlar.
| Mevcut Uzantılar |
|---|
.sdata .tdesc
|
Belgenin faydalı olmasını umut ediyorum. Eğer zaman bulabilirsem belgenin devamı
niteliğinde belgeler hazırlamak istiyorum. Gözden kaçmış hatalar için özür dilerim
ve düzeltmem için bildirirseniz çok sevinirim. Ayrıca desteklerinden dolayı,
dahil olduğum EnderUNIX Takımındaki değerli arkadaşlarıma teşekkür ediyorum.
Ekim 2002 (Uzun bir aradan sonra tamamlama : Kasım 2005)
ATILIM BOY
http://www.enderunix.org/aboy | http://www.trunix.org/aboy
aboy at enderunix dot org | aboy at trunix dot org
Bağlama : Linking
Başlangıca Hazırlama : Initialization
Başlatıcı : Originator
Başlık : Header
Bayrak : Flag
Biçim : Format
Boşlukları Doldurma : Padding
Boyut : Size
Bölüm : Segment
Çalışma Zamanı : Runtime
Derleyici : Compiler
Giriş : Entry
Harici : External
Hizalama : Alignment
İkili : Binary
Kısım : Section
Kütüphane : Library
Nesne : Object
Ofset : Offset
Öznitelik : Attribute
Paylaşımlı : Shared
Sanal : Virtual
Süreç, Süreçleme : Process, Processing
Talimat : Instruction
Tanımlayıcı : Descriptor
Uygulama : Application
Uygulama İşlemi : Implementation
Veri : Data
Yanlızca okunabilir : read only
Yapı : Structure
Yeniden Konumlandırma, Konumlandırılabilir : Relocation, Relocatable
Yorumlayıcı : Assembler
Yükleyici : Loader
Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification
Version 1.2
http://www.trunix.org/programlama/os/elf-1.2.pdf
| http://www.cs.princeton.edu/courses/archive/fall05/cos217/reading/elf.pdf
System V Application Binary Interface
http://www.trunix.org/programlama/os/sysv-elf/contents.html
| http://www.caldera.com/developers/gabi/2000-07-17/contents.html
UNIX ELF File format
http://www.trunix.org/programlama/os/sp13.ppt
| http://www.csie.nctu.edu.tw/~shieyuan/course/spb/lectures/sp13.ppt
Extending Sim286 to the Intel386 Architecture with 32-bit processing and ELF
Binary input
http://www.trunix.org/programlama/os/cpu-elf/index.html | http://www.cs.ucdavis.edu/~haungs/paper/paper.html
ELF: From The Programmer's Perspective
http://www.trunix.org/programlama/os/elf-hl/Documentation/elf/elf.html | http://www.skyfree.org/linux/references/ELF_Programmer.pdf
The ELF Object File Format: Introduction
http://www.trunix.org/programlama/os/lj_elf_introduction.html
| http://www.linuxjournal.com/article/1059
The ELF Object File Format by Dissection
http://www.trunix.org/programlama/os/lj_elf_dissection.html
| http://www.linuxjournal.com/article/1060
A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux
http://www.trunix.org/programlama/os/teensy_elf_linux.html
| http://www.cs.sunyit.edu/~gloor/reading_room/unix_linux/FoodForThought/teensy.html
Write Your Own Operating System [FAQ]
http://www.trunix.org/programlama/os/os-faq/os-faq.html
| http://www.powerdb.org/study/OS/os-faq.html