Yürütülebilir ve Bağlanabilir Biçim - Executable and Linkable Format

ELF
Dosya adı uzantısı
yok, .axf , .bin , .elf , .o , .prx , .puff , .ko , .mod ve .so
sihirli sayı 0x7F 'E' 'L' 'F'
Tarafından geliştirilmiş Unix Sistem Laboratuvarları
Biçim türü İkili , yürütülebilir , nesne , paylaşılan kitaplık , çekirdek dökümü
için konteyner Birçok yürütülebilir ikili biçim
Bir ELF dosyasının iki görünümü vardır: program başlığı çalışma zamanında kullanılan segmentleri gösterirken , bölüm başlığı ikili dosyanın bölümlerini listeler .

Gelen bilgi işlem , yürütülebilir ve Bağlantılanabilir Biçimi ( ELF , eski adı Genişletilebilir Bağlama Biçimi ), ortak bir standarttır dosya formatı için çalıştırılabilir dosyaları, nesne kodu , paylaşılan kütüphaneler ve çekirdek dökümlerini . İlk olarak System V Sürüm 4 (SVR4) adlı Unix işletim sistemi sürümünün uygulama ikili arabirimi (ABI) belirtiminde yayınlandı ve daha sonra Araç Arabirimi Standardında, Unix sistemlerinin farklı satıcıları arasında hızla kabul edildi . 1999 yılında 86open projesi ile x86 işlemcilerde Unix ve Unix benzeri sistemler için standart ikili dosya formatı olarak seçilmiştir .

Tasarım gereği, ELF formatı esnek, genişletilebilir ve platformlar arasıdır . Örneğin , belirli bir merkezi işlem birimini (CPU) veya komut kümesi mimarisini hariç tutmaması için farklı endianness'leri ve adres boyutlarını destekler . Bu, birçok farklı donanım platformunda birçok farklı işletim sistemi tarafından benimsenmesine izin verdi .

Dosya düzeni

Her ELF dosyası, bir ELF başlığından ve ardından dosya verisinden oluşur. Veriler şunları içerebilir:

  • Sıfır veya daha fazla bellek segmentini açıklayan program başlık tablosu
  • Sıfır veya daha fazla bölümü açıklayan bölüm başlık tablosu
  • Program başlık tablosundaki veya bölüm başlık tablosundaki girişler tarafından atıfta bulunulan veriler
Önemli girişlerin vurgulandığı bir ELF dosyasının yapısı

Segmentler , dosyanın çalışma zamanında yürütülmesi için gerekli bilgileri içerirken, bölümler bağlama ve yer değiştirme için önemli verileri içerir. Dosyanın tamamındaki herhangi bir bayt en fazla bir bölüme ait olabilir ve herhangi bir bölüme ait olmayan yetim baytlar oluşabilir.

00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|

00000010 02 00 3e 00 01 00 00 00 c5 48 40 00 00 00 00 00 |..>......H@.....|

ELF dosya başlığının örnek hexdump'u

Dosya başlığı

ELF başlığı, 32 veya 64 bit adreslerin kullanılıp kullanılmayacağını tanımlar . Başlık, bu ayardan etkilenen ve onları takip eden diğer alanları dengeleyen üç alan içerir. ELF başlığı, 32 bit ve 64 bit ikili dosyalar için sırasıyla 52 veya 64 bayt uzunluğundadır.

ELF başlığı
Telafi etmek Boyut (bayt) Alan Amaç
32 bit 64 bit 32 bit 64 bit
0x00 4 e_ident[EI_MAG0] ile e_ident[EI_MAG3] arası 0x7Fardından ASCII'deELF ( 45 4c 46) gelir ; bu dört bayt sihirli sayıyı oluşturur .
0x04 1 e_ident[EI_CLASS] Bu bayt , sırasıyla 32 veya 64 bit biçimini belirtmek için 1veya 2olarak ayarlanır .
0x05 1 e_ident[EI_DATA] Bu bayt , sırasıyla küçük veya büyük endianlık anlamına gelecek şekilde 1veya 2olarak ayarlanır . Bu, offset ile başlayan çok baytlı alanların yorumlanmasını etkiler . 0x10
0x06 1 e_ident[EI_VERSION] ELF'nin 1orijinal ve güncel sürümü için ayarlayın .
0x07 1 e_ident[EI_OSABI] Hedef işletim sistemi ABI'sini tanımlar .
Değer ABI
0x00 Sistem V
0x01 HP-UX
0x02 NetBSD
0x03 Linux
0x04 GNU Hurd
0x06 Solaris
0x07 AIX
0x08 IRIX
0x09 ÜcretsizBSD
0x0A Tru64
0x0B Novell Modesto
0x0C OpenBSD
0x0D OpenVMS
0x0E Kesintisiz Çekirdek
0x0F AROS
0x10 Fenix ​​işletim sistemi
0x11 CloudABI
0x12 Stratus Technologies OpenVOS

Genellikle 0hedef platformdan bağımsız olarak ayarlanır .

0x08 1 e_ident[EI_ABIVERSION] Ayrıca ABI sürümünü belirtir. Yorumlanması, hedef ABI'ye bağlıdır. Linux çekirdeğinin (en az 2.6'dan sonra) tanımı yoktur, bu nedenle statik olarak bağlantılı yürütülebilir dosyalar için yoksayılır. Bu durumda, EI_PAD'in ofset ve boyutu 8.

glibc 2.12+ e_ident[EI_OSABI] == 3 bu alanı dinamik bağlayıcının ABI sürümü olarak ele alır : dinamik bağlayıcının özelliklerinin bir listesini tanımlar, e_ident[EI_ABIVERSION] öğesini paylaşılan nesne (yürütülebilir veya dinamik) tarafından istenen bir özellik düzeyi olarak değerlendirir kütüphane) ve bilinmeyen bir özellik istendiğinde, yani e_ident[EI_ABIVERSION] bilinen en büyük özellikten büyükse onu yüklemeyi reddeder .

0x09 7 e_ident[EI_PAD] şu anda kullanılmayan, sıfırlarla doldurulmalıdır.
0x10 2 e_type Nesne dosya türünü tanımlar.
Değer Tip
0x00 ET_NONE
0x01 ET_REL
0x02 ET_EXEC
0x03 ET_DYN
0x04 ET_CORE
0xFE00 ET_LOOS
0xFEFF ET_HIOS
0xFF00 ET_LOPROC
0xFFFF ET_HIPROC
0x12 2 e_makine Hedef komut seti mimarisini belirtir . Bazı örnekler:
Değer ISA
0x00 Belirli bir talimat seti yok
0x01 AT&T WE 32100
0x02 SPARC
0x03 x86
0x04 Motorola 68000 (M68k)
0x05 Motorola 88000 (M88k)
0x06 Intel MCU'su
0x07 Intel 80860
0x08 MIPS
0x09 IBM Sistemi/370
0x0A MIPS RS3000 Küçük endian
0x0B - 0x0D gelecekte kullanılmak üzere rezerve edilmiştir
0x0E Hewlett-Packard PA-RISC
0x0F gelecekte kullanılmak üzere rezerve edilmiştir
0x13 Intel 80960
0x14 PowerPC
0x15 PowerPC (64 bit)
0x16 S390 , S390x dahil
0x17 IBM SPU/SPC
0x18 - 0x23 gelecekte kullanılmak üzere rezerve edilmiştir
0x24 NEC V800
0x25 Fujitsu FR20
0x26 TRW SAĞ-32
0x27 Motorola RCE
0x28 ARM (ARMv7/Aarch32'ye kadar)
0x29 Dijital Alfa
0x2A SüperH
0x2B SPARC Sürüm 9
0x2C Siemens TriCore gömülü işlemci
0x2D Argonot RISC Çekirdeği
0x2E Hitachi H8/300
0x2F Hitachi H8/300H
0x30 Hitachi H8S
0x31 Hitachi H8/500
0x32 IA-64
0x33 Stanford MIPS-X
0x34 Motorola ColdFire
0x35 Motorola M68HC12
0x36 Fujitsu MMA Multimedya Hızlandırıcı
0x37 Siemens PCP
0x38 Sony nCPU yerleşik RISC işlemci
0x39 Denso NDR1 mikroişlemci
0x3A Motorola Yıldız*Çekirdek işlemci
0x3B Toyota ME16 işlemci
0x3C STMicroelectronics ST100 işlemci
0x3D Advanced Logic Corp. TinyJ gömülü işlemci ailesi
0x3E AMD x86-64
0x8C TMS320C6000 Ailesi
0xAF MCST Elbrus e2k
0xB7 ARM 64 bit (ARMv8/Aarch64)
0xF3 RISC-V
0xF7 Berkeley Paket Filtre
0x101 65C816
0x14 4 e_sürüm 1ELF'nin orijinal sürümü için ayarlayın .
0x18 4 8 e_giriş Bu, işlemin yürütülmeye başladığı giriş noktasının bellek adresidir . Bu alan, daha önce tanımlanan biçime bağlı olarak 32 veya 64 bit uzunluğundadır.
0x1C 0x20 4 8 e_phoff Program başlık tablosunun başlangıcına işaret eder. Genellikle dosya başlığını hemen takip ederek ofset 0x34veya 0x40sırasıyla 32 ve 64 bit ELF yürütülebilir dosyaları oluşturur.
0x20 0x28 4 8 e_shoff Bölüm başlık tablosunun başlangıcına işaret eder.
0x24 0x30 4 e_flags Bu alanın yorumlanması hedef mimariye bağlıdır.
0x28 0x34 2 e_ehsize Bu başlığın boyutunu içerir, normalde 64-bit için 64 Bayt ve 32-bit biçimi için 52 Bayt.
0x2A 0x36 2 e_fentsize Bir program başlık tablosu girişinin boyutunu içerir.
0x2C 0x38 2 e_phnum Program başlık tablosundaki girişlerin sayısını içerir.
0x2E 0x3A 2 e_shentsize Bir bölüm başlığı tablosu girişinin boyutunu içerir.
0x30 0x3C 2 e_shnum Bölüm başlık tablosundaki girişlerin sayısını içerir.
0x32 0x3E 2 e_shstrndx Bölüm adlarını içeren bölüm başlığı tablosu girişinin dizinini içerir.
0x34 0x40 ELF Başlığının Sonu (boyut)

Program başlığı

Program başlık tablosu, sisteme bir süreç görüntüsünün nasıl oluşturulacağını söyler. e_phoff dosya uzaklığında bulunur ve her biri e_phentsize boyutunda olan e_phnum girişlerinden oluşur . 32-bit ELF ile 64-bit ELF'de düzen biraz farklıdır , çünkü p_flags hizalama nedenleriyle farklı bir yapı konumundadır. Her giriş şu şekilde yapılandırılmıştır:

Program başlığı
Telafi etmek Boyut (bayt) Alan Amaç
32 bit 64 bit 32 bit 64 bit
0x00 4 p_type Segmentin türünü tanımlar.
Değer İsim Anlam
0x00000000 PT_NULL Kullanılmayan program başlık tablosu girişi.
0x00000001 PT_LOAD Yüklenebilir segment.
0x00000002 PT_DİNAMİK Dinamik bağlantı bilgileri.
0x00000003 PT_INTERP Tercüman bilgisi.
0x00000004 PT_NOTE Yardımcı bilgiler.
0x00000005 PT_SHLIB Rezerve.
0x00000006 PT_PHDR Program başlık tablosunun kendisini içeren segment.
0x00000007 PT_TLS Konu-Yerel Depolama şablonu.
0x60000000 PT_LOOS Ayrılmış kapsayıcı aralık. İşletim sistemine özgü.
0x6FFFFFF PT_HIOS
0x70000000 PT_LOPROC Ayrılmış kapsayıcı aralık. İşlemciye özel.
0x7FFFFFF PT_HIPROC
0x04 4 p_flags Segmente bağlı bayraklar (64 bit yapı için konum).
0x04 0x08 4 8 p_offset Dosya görüntüsündeki segmentin ofseti.
0x08 0x10 4 8 p_vaddr Segmentin bellekteki sanal adresi.
0x0C 0x18 4 8 p_paddr Fiziksel adresin ilgili olduğu sistemlerde, segmentin fiziksel adresi için ayrılmıştır.
0x10 0x20 4 8 p_filesz Dosya görüntüsündeki segmentin bayt cinsinden boyutu. 0 olabilir.
0x14 0x28 4 8 p_memsz Bellekteki segmentin bayt cinsinden boyutu. 0 olabilir.
0x18 4 p_flags Segmente bağlı bayraklar (32 bit yapı için konum).
0x1C 0x30 4 8 p_align 0ve 1hizalama olmadığını belirtin. Aksi ile olumlu, 2 ayrılmaz gücü olmalıdır p_vaddr eşitlenmesi p_offset modülü p_align .
0x20 0x38 Program Sonu Başlığı (boyut).

Bölüm başlığı

Telafi etmek Boyut (bayt) Alan Amaç
32 bit 64 bit 32 bit 64 bit
0x00 4 sh_name Bu bölümün adını temsil eden .shstrtab bölümündeki bir dizgenin uzaklığı .
0x04 4 sh_type Bu başlığın türünü tanımlar.
Değer İsim Anlam
0x0 SHT_NULL Bölüm başlığı tablosu girişi kullanılmayan
0x1 SHT_PROGBITS Program verisi
0x2 SHT_SYMTAB Sembol tablosu
0x3 SHT_STRTAB dize tablosu
0x4 SHT_RELA Eklerle yer değiştirme girişleri
0x5 SHT_HASH Sembol karma tablosu
0x6 SHT_DYNAMIC Dinamik bağlantı bilgileri
0x7 SHT_NOTE Notlar
0x8 SHT_NOBITS Veri içermeyen program alanı (bss)
0x9 SHT_REL Yer değiştirme girişleri, ek yok
0x0A SHT_SHLIB Rezerve
0x0B SHT_DYNSYM Dinamik bağlayıcı sembol tablosu
0x0E SHT_INIT_ARRAY Yapıcı dizisi
0x0F SHT_FINI_ARRAY Yıkıcı dizisi
0x10 SHT_PREINIT_ARRAY Ön yapıcılar dizisi
0x11 SHT_GROUP Bölüm grubu
0x12 SHT_SYMTAB_SHNDX Genişletilmiş bölüm endeksleri
0x13 SHT_NUM Tanımlanmış türlerin sayısı.
0x60000000 SHT_LOOS İşletim sistemine özel başlatın.
... ... ...
0x08 4 8 sh_flags Bölümün özelliklerini tanımlar.
Değer İsim Anlam
0x1 SHF_WRITE yazılabilir
0x2 SHF_ALLOC Yürütme sırasında bellekte yer kaplar
0x4 SHF_EXECINSTR yürütülebilir
0x10 SHF_MERGE Birleştirilmiş olabilir
0x20 SHF_STRINGS Boş sonlandırılmış dizeler içerir
0x40 SHF_INFO_LINK 'sh_info' SHT dizini içeriyor
0x80 SHF_LINK_ORDER Birleştirdikten sonra siparişi koru
0x100 SHF_OS_NONFORMING Standart olmayan işletim sistemine özel kullanım gerekli
0x200 SHF_GROUP Bölüm bir grubun üyesidir
0x400 SHF_TLS Bölüm tutma iş parçacığı yerel verileri
0x0ff00000 SHF_MASKOS işletim sistemine özgü
0xf0000000 SHF_MASKPROC işlemciye özel
0x4000000 SHF_ORDERED Özel sipariş gereksinimi (Solaris)
0x8000000 SHF_EXCLUDE Bölüm, atıfta bulunulmadığı veya tahsis edilmediği sürece hariç tutulur (Solaris)
0x0C 0x10 4 8 sh_addr Yüklenen bölümler için bellekteki bölümün sanal adresi.
0x10 0x18 4 8 sh_offset Dosya görüntüsündeki bölümün ofseti.
0x14 0x20 4 8 sh_size Dosya görüntüsündeki bölümün bayt cinsinden boyutu. 0 olabilir.
0x18 0x28 4 sh_link İlişkili bir bölümün bölüm dizinini içerir. Bu alan, bölümün türüne bağlı olarak çeşitli amaçlar için kullanılır.
0x1C 0x2C 4 sh_info Bölüm hakkında ek bilgiler içerir. Bu alan, bölümün türüne bağlı olarak çeşitli amaçlar için kullanılır.
0x20 0x30 4 8 sh_addralign Bölümün gerekli hizalamasını içerir. Bu alan iki katı olmalıdır.
0x24 0x38 4 8 sh_entsize Sabit boyutlu girdiler içeren bölümler için her girdinin bayt cinsinden boyutunu içerir. Aksi takdirde, bu alan sıfır içerir.
0x28 0x40 Bölüm Sonu Başlığı (boyut)

Aletler

  • readelfbir veya daha fazla ELF dosyası hakkında bilgi görüntüleyen bir Unix ikili yardımcı programıdır. Bir özgür yazılım uygulaması tarafından sağlanmaktadır GNU binutils .
  • elfutilsGNU Binutils'e yalnızca Linux için alternatif araçlar sağlar .
  • elfdumpSolaris ve FreeBSD altında bulunan bir ELF dosyasında ELF bilgilerini görüntülemek için kullanılan bir komuttur .
  • objdumpELF dosyaları ve diğer nesne biçimleri hakkında geniş bir bilgi yelpazesi sağlar. ELF verilerini yapılandırmak objdumpiçin İkili Dosya Tanımlayıcı kitaplığını arka uç olarak kullanır .
  • Unix fileyardımcı programı, yeniden yerleştirilebilir , yürütülebilir veya paylaşılan nesne dosyasındaki kodun amaçlandığı veya bir ELF çekirdek dökümünün üretildiği komut kümesi mimarisi dahil olmak üzere ELF dosyaları hakkında bazı bilgileri görüntüleyebilir .

Uygulamalar

Unix benzeri sistemler

ELF formatı, çeşitli ortamlarda eski yürütülebilir formatların yerini almıştır. Unix benzeri işletim sistemlerinde a.out ve COFF biçimlerinin yerini almıştır :

Unix dışı benimseme

ELF, Unix dışı işletim sistemlerinde de bazı uyarlamalar gördü, örneğin:

Oyun konsolları

Bazı oyun konsolları da ELF kullanır:

PowerPC

ELF kullanan PowerPC'de çalışan diğer (işletim) sistemleri :

Cep telefonları

Cep telefonları ve mobil cihazlar için bazı işletim sistemleri ELF kullanır:

Bazı telefonlar kullanımı yoluyla ELF dosyalarını çalıştırabilirsiniz yama ekler montaj kodu ana kadar firmware olarak bilinen bir özelliktir, ELFPack yeraltı içinde Modding kültürü. ELF dosya formatı ayrıca Atmel AVR (8-bit), AVR32 ve Texas Instruments MSP430 mikrodenetleyici mimarileriyle birlikte kullanılır. Open Firmware'in bazı uygulamaları, özellikle Apple'ın şirketin ürettiği hemen hemen tüm PowerPC makinelerinde kullanılan uygulaması olmak üzere ELF dosyalarını da yükleyebilir .

Özellikler

Linux Standard Base (LSB) belirtildiği hangi mimarileri için yukarıdaki bazı özellikleri tamamlar. Örneğin, System V ABI, AMD64 Eki için durum böyledir.

86açık

86open , ortak PC uyumlu x86 mimarisinde Unix ve Unix benzeri işletim sistemleri için ortak bir ikili dosya formatı üzerinde fikir birliği oluşturmak ve yazılım geliştiricilerini mimariye bağlantı yapmaya teşvik etmek için bir projeydi . İlk fikir, Tek UNIX Spesifikasyonunun öncülü olan Spec 1170'in küçük bir alt kümesinde ve değiştirilmemiş ikili dosyaların x86 Unix benzeri işletim sistemlerinde çalışmasını sağlamak için GNU C Kitaplığı'nda (glibc) standartlaştırmaktı. Proje başlangıçta "Spec 150" olarak adlandırıldı.

Sonunda seçilen format ELF, özellikle de ilgili tüm satıcılar ve işletim sistemleri tarafından desteklenen fiili bir standart olduğu ortaya çıktıktan sonra ELF'nin Linux uygulamasıydı .

Grup, 1997'de e-posta tartışmalarına başladı ve ilk olarak 22 Ağustos 1997'de Santa Cruz Operasyon ofislerinde bir araya geldi .

Yönlendirme komitesi Marc Ewing , Dion Johnson, Evan Leibovitch, Bruce Perens , Andrew Roach, Bryan Wayne Sparks ve Linus Torvalds'dı . Projedeki diğer kişiler ise Keith Bostic , Chuck Cranor, Michael Davidson, Chris G. Demetriou, Ulrich Drepper, Don Dugger, Steve Ginzburg, Jon "maddog" Hall , Ron Holt, Jordan Hubbard , Dave Jensen, Kean Johnston, Andrew Josey, Robert Lipe, Bela Lubkin, Tim Marsland, Greg Page, Ronald Joe Record, Tim Ruckle, Joel Silverstein, Chia-pi Tien ve Erik Troan. Temsil edilen işletim sistemleri ve şirketler BeOS , BSDI , FreeBSD , Intel , Linux , NetBSD , SCO ve SunSoft idi .

Proje ilerledi ve 1998 yılının ortalarında SCO , OpenServer , UnixWare ve Solaris üzerinde Linux ikili dosyalarını çalıştırabilen açık kaynaklı bir uyumluluk katmanı olan lxrun'u geliştirmeye başladı . SCO , Mart 1999'da LinuxWorld'de lxrun'un resmi desteğini duyurdu . Sun Microsystems , 1999'un başlarında Solaris için lxrun'u resmi olarak desteklemeye başladı ve daha sonra Solaris Containers for Linux Applications aracılığıyla Linux ikili biçiminin entegre desteğine geçti .

Uzun süredir desteklenen Linux ikili dosyalarına (bir uyumluluk katmanı aracılığıyla ) sahip BSD'ler ve biçim için destek ekleyen ana x86 Unix satıcılarıyla birlikte proje, Linux ELF'nin endüstri tarafından seçilen biçim olduğuna karar verdi ve 25 Temmuz 1999.

FatELF: Linux için evrensel ikili dosyalar

FatELF, yağ ikili yetenekleri ekleyen bir ELF ikili biçim uzantısıdır . Linux ve diğer Unix benzeri işletim sistemlerine yöneliktir . CPU mimarisi soyutlamasına ( bayt sırası , kelime boyutu , CPU komut seti vb.) ek olarak, yazılım-platform soyutlamasının potansiyel avantajı vardır, örneğin çoklu çekirdek ABI versiyonlarını destekleyen ikili dosyalar . 2 Mart 2021 itibariyle FatELF, ana hat Linux çekirdeğine entegre edilmemiştir.

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar