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_CLASS
e_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_DATA
e_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_VERSION
e_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_OSABI
e_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_ABIVERSION
e_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_PAD
e_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