Ç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