Çalýþtýrýlabilir ve Baðlanabilir Biçim (ELF / Executable and Linking Format)


Ýçindekiler :

Giriþ
1. Ýkili Dosya ne demektir
1.1. Genel olarak Ýkili Dosya Biçimi yapýlarý
2. ELF Ýkili Nesne Dosya
2.1. ELF Dosya Çeþitleri
2.1.1. Dosya Biçimi
2.1.2. Veri Gösterimi
2.1.3. Karakter Gösterimi
2.2. ELF Baþlýk
2.2.1. ELF Dosyasýnýn Tanýnmasý
2.3. Kýsým'lar ve Kýsým Baþlýk Tablosu
2.3.1. Özel tanýmlanmýþ Kýsým'lar
2.4. String Tablosu
2.5. Sembol Tablosu
2.5.1. Sembol Deðerleri
2.6. Yeniden Konumlandýrma
3. Program Yükleme ve Dinamik Baðlama
3.1. Program Baþlýk Tablosu ve Bölüm'ler
3.1.1. Not Kýsým'ý
3.2. Program Yükleme Ýþlemi
3.3. Dinamik Baðlama
3.4. Rezerv edilmiþ Ýsimler
3.4.1. Özel Kýsým Ýsimleri
3.4.2. Dinamik Kýsým Ýsimleri
3.4.3. Mevcut Uzantýlar
Son Söz
Sözlük
Kaynaklar

Giriþ

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.

1. Ýkili Dosya ne demektir

Bilgisayar dünyasýnda kullanýlan baþlýca iki tür dosya biçimi vardýr, ikili biçim ve text biçimdir (ASCII, EBCDIC,WISCII vs.). Text biçimi insanlarýn anlayabileceði türden veriler içeren dosyalardýr. Ýkili biçim ise bilgisyarýn anlayabileceði türden dolsyalardýr. Bu biçim genelde çalýþtýrýlabilir dosyalar ve sayýsal veri içeren dosyalarda kullanýlýr. Bazen ikili dosyalarda text biçimde verilerde içerebilir. Ýkili çalýþtýrýlabilir dosyalar bilgisayarlarýn mikroiþlemcilerinin anlayabileceði türdendirler. Ýþlemciler bu türden dosyalarý içlerindeki Kýsým'lar ve bilgilere göre çalýþtýrýrlar. Bazý çalýþtýrýlabilir ikili dosya biçimleri þunlardýr : a.out, COFF, XCOFF (IBM AIX), ELF , PEF, Mach-O, CFM, LE (OS/2 *.exe), COM, MZ (Dos *.exe), NE (Win 3.xx *.exe), PE (Win 9x/NT *.exe).

1.1. Genel olarak Ýkili Dosya Biçimi yapýlarý

Bir çok ikili dosya biçimi genelde þu yapýdadýr: ilk kýsýmda dosyanýn içieriðinin bir haritasý olan baþlýk, çalýþtýrýlabilir kodun bulunduðu .text, programcý tarafýndan tanýmlanmýþ ve ilk deðer verilmiþ statik ömürlü deðiþkenlerin bulunduðu .data ve ilk deðer verilmemiþ deðiþkenlerin saklandýðý .bss kýsmý. Bu yapý aþaðýdaki grafikte daha anlaþýlýr bir þekilde görülebilir.

2. ELF Ýkili Nesne Dosya

ELF ikili dosya aslen USL (UNIX System Laboratories)'de ABI (Aplication Binary Interface)'in bir bölümü gibi geliþtirilmiþ ve sunulmuþtur. TIS (The Tool Interface Standards) komitesi geliþmiþ ELF'yi standart olarak 32 bit Intel iþlemciler ailesinde ve çeþitli iþletim sistemlerinde taþýnabilir nesne dosya biçimi olarak seçmiþtir. Amaç programcýlarýn ELF'nin gücünden yararlanarak ikili arayüz de daha çok düzenleme yapabilmeleri, dolayýsý ile daha ayrodinamik programlar geliþtirebilmeleridir.

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.

2.1. ELF Dosya Çeþitleri

ELF dosyalarý kendi ararýnda üçe ayrýlýrlar. Bunlar :
  1. Çalýþtýrýlabilir dosya; tek baþýna çalýþýbilmeye uygun bir programýn kodlarýný içerirler.
  2. Yeniden Konumlandýrýlabilir Nesne Dosya; bunlar yeni bir Çalýþtýrýlabilir yada Paylaþýmlý Nesne Dosya oluþturabilmek için baþka bir Yeniden Konumlandýrýlabilir Nesne Dosya yada Paylaþýmlý Nesne Dosya ile baðlanabilecek türden kod ve veri taþýrlar. (yani *.o lar)
  3. Paylaþýmlý Nesne Dosya; iki ayrý baðlanma türüne uygun kod ve veri içerirler. Birincisi baðlama programý (örn; GNU ld programý) bu tür bir dosyayý Yeniden Konumlandýrýlabilir bir dosya ile iþleme tabi tutarak yeni bir Nesne Dosya oluþturur. Ýkincisi dinamik baðlayýcý bu tür bir dosyayý çalýþma zamaný esnasonda çalýþtýrýlabilir dosya ve baþka Paylaþýmlý Nesneler ile birleþtirerek bir süreç imajý oluþturur. (yani *.so ve *.so.* dosyalarý, örn; dinamik kütüphaneler: FreeBSD'de ld-elf.so.1, Linux'da ld.so.1, libc.so.1 yada ld-linux.so.1)
Ayrýca Core dosyalarýda ayrý bir tür olabilirler; bu tür dosyalar süreç'ler çalýþtýrlarken oluþan her hangi bir hata durumunda belleðin bir imajýnýn oluþturulmasýdýrlar. Bu gurup dosyalar hata ayýklama iþlemlerinde kullanýlmak üzere hazýrlanan rapor dosyalarý olduklarý için, genelde aþaðýda söz edilicek konularla ilgileri yoktur.

2.1.1. Dosya Biçimi

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.


NOT: Þekillerde Program Baþlýk Tablosu ve ardýndan Kýsým veya Bölümler ve ardýndan da Kýsým Baþlýk Tablosu düzenli bir þekilde görünmekte ise de ELF Baþlýðýnýn dýþýndaki hiç bir þeyin yeri kesinleþtirilmemiþdir.

2.1.2. Veri Gösterimi

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.

2.1.3. Karakter Gösterimi

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.

2.2. ELF Baþlýk

Daha önceden de belirtilmiþti, ELF Baþlýk kýsmý her iki amaçta da dosyanýn ilk kýsmýndadýr ve yeri sabitlenmiþ tek kýsýmdýr, diðer kýsýmlarýn yerleri garantilenmiþ deðildir. Baþlýk her zaman ilk sýrada bulunur. Bu kýsýmýn içerdiði bilgilerden biri dosyanýn hangi türden (Yeniden Konumlandýrýlabilir, çalýþtýrýlabilir, paylaþýmlý, core) olduðudur. ELF Baþlýk kýsmý Ýkili dosyanýn bir haritasý gibidir, ve diðer kýsýmlarýn dosya içersindeki konum bilgileri bu kýsýmda tutulmaktadýr. Pogramda çalýþtýrýlacak ilk bilgiyede buradan iþaret edilmektedir. Bu kýsýmda "Linking View" tür dosyalar için talimat, veri, Sembol Tablolarý ve Yeniden Konumlandýrýlabilirlik bilgileri de tutulmaktadýr.

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

typedef struct {   
  unsigned char e_ident[EI_NIDENT];
  Elf32_Half e_type;
  Elf32_Half e_machine;
  Elf32_Word e_version;
  Elf32_Addr e_entry;
  Elf32_Off e_phoff;
  Elf32_Off e_shoff;
  Elf32_Word e_flags;
  Elf32_Half e_ehsize;
  Elf32_Half e_phentsize;
  Elf32_Half e_phnum;
  Elf32_Half e_shentsize;
  Elf32_Half e_shnum;
  Elf32_Half e_shtrndx;
} Elf32_Ehdr;


typedef struct {
  unsigned char e_ident[EI_NIDENT];
  Elf64_Half e_type;
  Elf64_Half e_machine;
  Elf64_Word e_version;
  Elf64_Addr e_entry;
  Elf64_Off e_phoff;
  Elf64_Off e_shoff;
  Elf64_Word e_flags;
  Elf64_Half e_ehsize;
  Elf64_Half e_phentsize;
  Elf64_Half e_phnum;
  Elf64_Half e_shentsize;
  Elf64_Half e_shnum;
  Elf64_Half e_shtrndx;
} Elf64_Ehdr;

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.

Ýsim Deðer Açýklama
ET_NONE 0 Tanýmsýz Dosya tipi.
ET_REL 1 Yeniden Konumlandýrýlabilir Dosya
ET_EXEC 2 Çalýþtýrýlabilir Dosya
ET_DYN 3 Paylaþýmlý Nesne Dosya
ET_CORE 4 Core Tipi Dosya
ET_LOOS 0xFE00 Ýþletim Sistemi tanýmlý iþlemler için rezerv edilmiþ dosya tipleri aralýðý.
ET_HIOS 0xFEFF
ET_LOPROC 0xFF00 Ýþlemci tanýmlý iþlemler için rezerv edilmiþ dosya tipleri aralýðý.
ET_HIPROC 0xFFFF

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.

Ýsim Deðer Açýklama
EM_NONE 0 Belirsiz Mimari
EM_M32 1 AT&T WE 32100
EM_SPARC 2 SPARC
EM_386 3 Intel 80386
EM_68K 4 Motorola 68000
EM_88K 5 Motorola 88000
rezerv edilmiþ 6 Ýlerisi için rezerv edilmiþtir (EM_486)
EM_860 7 Intel 80860
EM_MIPS 8 MIPS I Architecture
EM_S370 9 IBM System/370 Processor
EM_MIPS_RS3_LE 10 MIPS RS3000 Little-endian
rezerv edilmiþ 11-14 Ýlerisi için rezerv edilmiþtir
EM_PARISC 15 Hewlett-Packard PA-RISC
rezerv edilmiþ 16 Ýlerisi için rezerv edilmiþtir
EM_VPP500 17 Fujitsu VPP500
EM_SPARC32PLUS 18 Enhanced instruction set SPARC
EM_960 19 Intel 80960
EM_PPC 20 PowerPC
EM_PPC64 21 64-bit PowerPC
EM_S390 22 IBM System/390 Processor
rezerv edilmiþ 23-35 Ýlerisi için rezerv edilmiþtir
EM_V800 36 NEC V800
EM_FR20 37 Fujitsu FR20
EM_RH32 38 TRW RH-32
EM_RCE 39 Motorola RCE
EM_ARM 40 Advanced RISC Machines ARM
EM_ALPHA 41 Digital Alpha
EM_SH 42 Hitachi SH
EM_SPARCV9 43 SPARC Version 9
EM_TRICORE 44 Siemens TriCore embedded processor
EM_ARC 45 Argonaut RISC Core, Argonaut Technologies Inc.
EM_H8_300 46 Hitachi H8/300
EM_H8_300H 47 Hitachi H8/300H
EM_H8S 48 Hitachi H8S
EM_H8_500 49 Hitachi H8/500
EM_IA_64 50 Intel IA-64 processor architecture
EM_MIPS_X 51 Stanford MIPS-X
EM_COLDFIRE 52 Motorola ColdFire
EM_68HC12 53 Motorola M68HC12
EM_MMA 54 Fujitsu MMA Multimedia Accelerator
EM_PCP 55 Siemens PCP
EM_NCPU 56 Sony nCPU embedded RISC processor
EM_NDR1 57 Denso NDR1 microprocessor
EM_STARCORE 58 Motorola Star*Core processor
EM_ME16 59 Toyota ME16 processor
EM_ST100 60 STMicroelectronics ST100 processor
EM_TINYJ 61 Advanced Logic Corp. TinyJ embedded processor family
EM_X86_64 62 AMD x86-64 architecture
EM_PDSP 63 Sony DSP Processor
rezerv edilmiþ 64-65 Ýlerisi için rezerv edilmiþtir
EM_FX66 66 Siemens FX66 microcontroller
EM_ST9PLUS 67 STMicroelectronics ST9+ 8/16 bit microcontroller
EM_ST7 68 STMicroelectronics ST7 8-bit microcontroller
EM_68HC16 69 Motorola MC68HC16 Microcontroller
EM_68HC11 70 Motorola MC68HC11 Microcontroller
EM_68HC08 71 Motorola MC68HC08 Microcontroller
EM_68HC05 72 Motorola MC68HC05 Microcontroller
EM_SVX 73 Silicon Graphics SVx
EM_ST19 74 STMicroelectronics ST19 8-bit microcontroller
EM_VAX 75 Digital VAX
EM_CRIS 76 Axis Communications 32-bit embedded processor
EM_JAVELIN 77 Infineon Technologies 32-bit embedded processor
EM_FIREPATH 78 Element 14 64-bit DSP Processor
EM_ZSP 79 LSI Logic 16-bit DSP Processor
EM_MMIX 80 Donald Knuth's educational 64-bit processor
EM_HUANY 81 Harvard University machine-independent object files
EM_PRISM 82 SiTera Prism
EM_AVR 83 Atmel AVR 8-bit microcontroller
EM_FR30 84 Fujitsu FR30
EM_D10V 85 Mitsubishi D10V
EM_D30V 86 Mitsubishi D30V
EM_V850 87 NEC v850
EM_M32R 88 Mitsubishi M32R
EM_MN10300 89 Matsushita MN10300
EM_MN10200 90 Matsushita MN10200
EM_PJ 91 picoJava
EM_OPENRISC 92 OpenRISC 32-bit embedded processor

e_version

ELF versiyonu. Alabileceði deðerler aþaðýdadýr.

Ýsim Deðer Açýklama
EV_NONE 0 Geçersiz Versiyon
EV_CURRENT 1 Güncel Versiyon

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.

2.2.1. ELF Dosyasýnýn Tanýnmasý

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
Ýlk 4 byte; bunlar ELF dosyasýnýn tanýnmasý için belirli deðerler tutarlar.

Ý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
sonraki byte (5. byte), 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
Bu deðer 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 Data Encoding


ELFDATA2LSB
encoding'i 2 nin tamlayaný olan deðerleri belirtir ve en küçük öncelikli byte en düþük adreste tutulur.

ELFDATA2MSB Data Encoding


ELFDATA2MSB encoding'i 2 nin tamlayaný olan deðerleri belirtir ve en yüksek öncelikli byte en düþük adreste tutulur.

2.3. Kýsým'lar ve Kýsým Baþlýk Tablosu

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 {
  Elf32_Word sh_name;
  Elf32_Word sh_type;
  Elf32_Word sh_flags;
  Elf32_Addr sh_addr;
  Elf32_Off sh_offset;
  Elf32_Word sh_size;
  Elf32_Word sh_link;
  Elf32_Word sh_info;
  Elf32_Word sh_addralign;
  Elf32_Word sh_entsize;
} Elf32_Shdr;


typedef struct {
  Elf64_Word sh_name;
  Elf64_Word sh_type;
  Elf64_Xword sh_flags;
  Elf64_Addr sh_addr;
  Elf64_Off sh_offset;
  Elf64_Xword sh_size;
  Elf64_Word sh_link;
  Elf64_Word sh_info;
  Elf64_Xword sh_addralign;
  Elf64_Xword sh_entsize;
} Elf64_Shdr;

sh_name Kýsýmýn ismi için string tablosundaki indeks numarsý tutulur.
sh_typeKýsým tipi.
sh_flags Bayrak bitleri.
sh_addrEð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_SYMTAB türü bir kýsým ile iliþkilidir ve eðer herhangi bir kýsmýn baþlýk indeksi SHN_XINDEX escape deðeri içeren bir Sembol Tablosu tarafindan referans ediliyorsa gereklidir. Kýsým Elf32_word deðerlerinden oluþan bir dizidir. Her bir deðer Sembol Tablosu verisi ile birebir uyuþur ve bu girdilerle ayný sýrada görünür. Bahsedilen deðerler, tanýmlý Sembol Tablosu giriþlerine karþýlýk Kýsým Baþlýk indekslerini temsil eder. Yalnýzca eðer eþdeðer Sembol Tablosu verisinin st_shndx alaný SHN_XINDEX escape deðeri içeriyorsa, eþleþen Elf32_word gerçek Kýsým Baþlýk indeksini tutuyor olacaktýr. Aksi takdirde Sembol Tablosu girdisi SHN_UNDEF sýfýr olmalýdýr.

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.

2.3.1 Özel Tanýmlanmýþ Kýsým'lar

Ý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 SHF_ALLOC bit'ini içerecektir, aksi durumda ilgili bit kullanýlmamýþ olacaktýr.

.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 SHF_ALLOC bit'ini içerecektir, aksi durumda ilgili bit kullanýlmamýþ olacaktýr.

.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.

2.4. String Tablosu

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  

String Tablosu Ýndeksleri

Ý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.

2.5. Sembol Tablosu

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 {
  Elf32_Word st_name;
  Elf32_Addr st_value;
  Elf32_Word st_size;
  unsigned char st_info;
  unsigned char st_other;
  Elf32_Half st_shndx;
} Elf32_Sym;

typedef struct {
  Elf64_Word st_name;
  unsigned char st_info;
  unsigned char st_other;
  Elf64_Half st_shndx;
  Elf64_Addr st_value;
  Elf64_Xword st_size;
} Elf64_Sym;

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.

#define ELF32_ST_BIND(i) ((i)>>4)
#define ELF32_ST_TYPE(i) ((i)&0xf)
#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))

#define ELF64_ST_BIND(i) ((i)>>4)
#define ELF64_ST_TYPE(i) ((i)&0xf)
#define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))

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 SHN_ABS'dir ve eðer mevcut ise o dosyanýn diðer STB_LOCAL sembollerinden önce gelir.

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 sh_addralign üyesine benzer þekilde hizalama kýsýtlamasýný verir. Sembol için baðlama Baðlama Programý st_value deðerinin katlarýnda bellek ayýracaktýr. Bu sembol'ün boyutu kaç byte gerekdiðini bildirir.

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)

2.5.1. Sembol Deðerleri

Sembol tablosu giriþleri, st_value'den dolayý farklý Nesne Dosya tipleri için biraz farklý yorumlara sahiptirler.

Sembol tablosu deðerleri farklý Nesne dosyalar için benzer anlamlara sahip olsada, veriye etkin eriþim uygun program tarafýndan saðlanabilmektedir.

2.6. Yeniden Konumlandýrma

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 {
  Elf32_Addr r_offset;
  Elf32_Word r_info;
} Elf32_Rel;

typedef struct {
  Elf32_Addr r_offset;
  Elf32_Word r_info;
  Elf32_Sword r_addend;
} Elf32_Rela;


typedef struct {
  Elf64_Addr r_offset;
  Elf64_Xword r_info;
} Elf64_Rel;

typedef struct {
  Elf64_Addr r_offset;
  Elf64_Xword r_info;
  Elf64_Sxword r_addend;
} Elf64_Rela;

Ý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 STN_UNDEF ise, tanýmsýz sembol indeksi, yeniden konumlandýrma "sembol deðeri" olarak 0 kullanýr. Yeniden konumlandýrma tipleri iþlemciye özgüdür. Ne zaman iþlemci ilavesindeki text bir yeninden konumlandýrma giriþinin tipi yada sembol tablosu indeksine baþvurursa, bunun anlamý ELF32_R_TYPE (veya ELF64_R_TYPE) yada ELF32_R_SYM (veya ELF64_R_SYM) uygulamanýn (aþaðýdaki makrolarý çalýþtýrmanýn) sonucu sýrasýyla giriþin r_info üyesidir.

#define ELF32_R_SYM(i) ((i)>>8)
#define ELF32_R_TYPE(i) ((unsigned char)(i))
#define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t))

#define ELF64_R_SYM(i) ((i)>>32)
#define ELF64_R_TYPE(i) ((i)&0xffffffffL)
#define ELF64_R_INFO(s,t) (((s)<<32)+((t)&0xffffffffL))

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.

3. Program Yükleme ve Dinamik Baðlama

Ç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.

3.1. Program Baþlýk Tablosu ve Bölüm'ler

Program Baþlýk Tablosu, Çalýþtýrýlabilir ve Paylaþýmlý Nesne Dosyalar'da bulunur. Bu tablonun (yazýnýn baþlarýnda bulunan grafikteki "Linking View" için) opsiyonel olmasý; direk olarak çalýþtýrýlmak için gereken bilgilerin dosya içinde saklanma ihtiyacý duyulmamasýndandýr, yani Yeniden Konumlandýrýlabilir dosyalar için gereksizdir. Program Baþlýðý; Nesne Dosya için bellekte bir süreç imajý yaratýlabilmesi için çok önemlidir.

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 {
  Elf32_Word p_type;
  Elf32_Off p_offset;
  Elf32_Addr p_vaddr;
  Elf32_Addr p_paddr;
  Elf32_Word p_filesz;
  Elf32_Word p_memsz;
  Elf32_Word p_flags;
  Elf32_Word p_align;
} Elf32_Phdr;

typedef struct {
  Elf64_Word p_type;
  Elf64_Word p_flags;
  Elf64_Off p_offset;
  Elf64_Addr p_vaddr;
  Elf64_Addr p_paddr;
  Elf64_Xword p_filesz;
  Elf64_Xword p_memsz;
  Elf64_Xword p_align;
} Elf64_Phdr;

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.

3.1.1. Not Kýsým'ý

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.

3.2. Program Yükleme Ýþlemi

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.

3.3. Dinamik Baðlama

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.

3.4. Rezerv edilmiþ Ýsimler

Bu bölümde Ýþletim Sistmi ve Ýþlemciye özgün rezerv edilmiþ isimler listelenmektedir.

3.4.1. Özel Kýsým Ýsimleri

Çeþitli Kýsým'lar Program ve Kontrol bilgisi tutarlar. Bunlar aþaðýda listelenmiþtir.

Ýsim
.bss
.comment
.data
.data1
.debug
.dynamic
.dynstr
.dynsym
.fini
.got
.hash
.init
.interp
.line
.note
.plt
.rel name
.rela name
.rodata
.rodata1
.shstrtab
.strtab
.symtab
.text

3.4.2. Dinamik Kýsým Ýsimleri

_DYNAMIC, Aþaðýda dinamik dizi etiketleri listelenmektedir. (d_tag)

Ýsim
DT_NULL
DT_NEEDED
DT_PLTRELSZ
DT_PLTGOT
DT_HASH
DT_STRTAB
DT_SYMTAB
DT_RELA
DT_RELASZ
DT_RELAENT
DT_STRSZ
DT_SYMENT
DT_INIT
DT_FINI
DT_SONAME
DT_RPATH
DT_SYMBOLIC
DT_REL
DT_RELSZ
DT_RELENT
DT_PLTREL
DT_DEBUG
DT_TEXTREL
DT_JMPREL
DT_BIND_NOW
DT_LOPROC
DT_HIPROC

3.4.3. Mecut Uzantýlar

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
.sbss     .lit4
.lit8     .reginfo
.gptab    .liblist
.conflict

Son Söz

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



Sözlük

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

Kaynaklar

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

Tool Interface Standard (TIS) Executable and Linking Format (ELF) Specification Version 1.1
http://www.trunix.org/programlama/os/elf.txt | http://www.nondot.org/sabre/os/files/Executables/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