ELF dosyaları ile bin dosyaları arasındaki fark nedir?


100

Derleyiciler tarafından üretilen son görüntüler hem bin dosyası hem de genişletilmiş yükleyici biçimi ELf dosyası içerir, ikisi arasındaki fark, özellikle ELF dosyasının faydası nedir.


NASM'nin söylemesi gereken bu . ARM'e özgü değil, ancak aynı konsept olması muhtemel. Sadece içeren bir dosyayı derlemek eğer Örneğin, NOPolmadan -f(ya -fbin), tek bayt derler 0x90yerine bir 400 bayt ELF kabın, -felf32. Yani sadece ham kod, kapsayıcı meta verileri yok. NASM, çoğunlukla MS-DOS .COM ve .SYS dosyaları için kullanıldığını söylüyor . sectionyönergeler çoğunlukla göz ardı edilir ve yalnızca hizalama oluşturur.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Bu, bin dosyalarının yararlı olabileceği bir yoldur: işletim sistemlerini dağıtmak için bir önyükleme sektörü oluşturmak için: stackoverflow.com/a/32483545/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Yanıtlar:


96

Bin dosyası, bellek düzeltmeleri veya yer değiştirmeleri içermeyen saf bir ikili dosyadır ve büyük olasılıkla belirli bir bellek adresine yüklenecek açık talimatlara sahiptir. Buna karşılık....

ELF dosyaları, bir sembol aramaları ve yeniden konumlandırılabilir tablodan oluşan Yürütülebilir Bağlanabilir Biçimdir, yani çekirdek tarafından herhangi bir bellek adresine yüklenebilir ve otomatik olarak, kullanılan tüm semboller, bulunduğu bellek adresinden uzaklığa ayarlanır. içine yüklendi. Genellikle ELF dosyalarında 'veri', 'metin', 'bss' gibi bir dizi bölüm vardır, ancak birkaçı ... bu, çalışma zamanının sembolün bellek referanslarını nerede ayarlayacağını hesaplayabileceği bölümlerdedir çalışma zamanında dinamik olarak.


"büyük olasılıkla belirli bir bellek adresine yüklenecek açık talimatlara sahiptir": bu, bin dosyası oluşturma işleminin verileri belirli bir adrese yüklemek için ek kod eklediği anlamına mı geliyor?
Penghe Geng

1
Öğrendiğim kadarıyla bin dosyası, programı ofset 0'dan çalıştırmak gibidir ve veri segmenti içine gömülüdür. Bu yanlışsa lütfen beni düzeltin.
Martin Kersten

@MartinKersten doğru, bin dosyaları ofset 0'dan başlıyor.
t0mm13b

1
@ t0mm13b .elf dosyaları, normal bir .hex dosyası gibi bir mikro denetleyiciye yazılabilir, ancak daha fazla flash bellek gerektirir ve mikro her sıfırlandığında, bölüm adresleri değişir mi?
Aelgawad

@BlackyDucky, bunun mümkün olduğuna inanmıyorum. Bir mikro denetleyici ELF verilerini doğrudan yürütmeye çalışırsa, başlıkları ve diğer verileri talimat olarak yanlış yorumlayabilir, değil mi?
jacobq

40

Bin dosyası, rom'a giren bitler ve baytlar veya programı çalıştıracağınız belirli bir adrestir. Bu verileri alıp doğrudan olduğu gibi yükleyebilirsiniz, normalde orada olmadığı için temel adresin ne olduğunu bilmeniz gerekir.

Bir elf dosyası, bin bilgisini içerir, ancak birçok başka bilgi, olası hata ayıklama bilgileri, sembollerle çevrilidir, kodu ikili dosyadaki verilerden ayırt edebilir. Birden fazla ikili veri yığınına izin verir (bunlardan birini bir bölmeye döktüğünüzde, onu bir sonraki bloğa doldurmak için doldurma verileri içeren büyük bir bölme dosyası elde edersiniz). Ne kadar ikiliye sahip olduğunuzu ve sıfırlara ilklendirilmek isteyen ne kadar bss verisi olduğunu söyler (gnu araçlarının bin dosyalarını doğru şekilde oluşturmada sorunları vardır).

Elf dosya formatı bir standarttır, arm, geliştirmelerini / varyasyonlarını standart üzerinde yayınlar. Herkesin içinde ne olduğunu anlamak için bir elf ayrıştırma programı yazmasını tavsiye ederim, bir kitaplıkla uğraşmayın, sadece spesifikasyondaki bilgileri ve yapıları kullanmak oldukça basittir. Genel olarak .bin dosyaları oluştururken, bağlayıcı betikleri ve bin veya elf çıktınızı bozmaya yardımcı olabilecek diğer şeylerde hata ayıklama gibi gnu sorunlarının üstesinden gelmeye yardımcı olur.


1
0x7C00, mutlaka elf kullanmayan bir bootloader gibi ses çıkarır. bu genel bir sorudur. bir işletim sistemi (sanal) adres alanları için kurallara sahip olacaktı, araç zincirinin bu işletim sistemi kurallarına hedeflenmesi gerekecekti, daha sonra dosya formatı, adresleri olan yüklenebilir öğeleri ve yüklendikten sonra bir giriş noktasını ve diğer şeyleri gösterecekti. elf bir kutu gibi sadece bir kaptır, onu hedeflenen kullanım durumu için doğru şekilde paketlemelisiniz.
old_timer

1
vga'ya bir miktar ascii yazdırmak istiyorsanız , bazı verilere sahip olanları yapmak için bir program yazarsınız veya verileri anında veya bazı kombinasyonlarda matematiksel olarak üretirsiniz, ardından bu programı işletim sistemi tanımlı kod alanına yüklersiniz ve ardından çalıştırırsınız. o. Genelde verileri fiziksel bir çevre birimine ve onun zaten bunu yapmanıza izin veren veya yükleyicisinin bunu yapmasına izin veren nadir işletim sistemine itmezsiniz.
old_timer

1
çıplak metal için, özellikle bu elf dosyası önyükleyici ise ve / veya çalıştırılan ilk program ise, o zaman giriş noktası ve _start, elf dosyasını flaşı programlayan bir araca (openocd over jtag) veya her ne olursa olsun-objcopy -O ikili dosya.elf dosyası.bin aracılığıyla ve sonra bu dosya bir şekilde flash'a yüklenir. Gitmedi ve x86'da bir önyükleyici denedi, ancak bios'un elf dosyalarını ayrıştıramadığını ve bu yüzden bir bellek görüntüsü olması gerektiğini varsayın. Öyleyse -O ikili tür ikili dosya
old_timer

1
ayrı varlık, donanım / mantık veya diğer tasarımdır. işletim sistemleri için işletim sistemi kuralları koyar, bir mikro denetleyici için çip / işlemci tasarımı kuralları belirler. örneğin bir vektör tablosu varsa ve sonra vektörler işleyicilere işaret ederse, bunların hepsini bağlayıcı komut dosyanıza, vb. yuvarlamanız gerekir, böylece yüklenebilir veriler, nesnenin önyüklediği flash için hedeflenir.
old_timer

1
Hedefinizin kurallara sahip olduğunu genişletmek için bir işletim sistemi veya bir işlemci veya bir çok aşamalı önyükleyici vb. Ve bu kurallara göre "ikili" nizi oluşturmanız gerekir, önyükleme ve linkerscript en önemlisidir. Daha sonra, her bir hedefe ve bu ikiliyi nasıl uyguladığınız ve hangi dosya formatlarının desteklendiği konusunda çok geniştir. Bir dizi ana bilgisayar geliştirme platformunda gnu varsayarsak, elf dosya biçimi varsayılan çıktıdır ve daha sonra elf'ten başka bir şeye ayıklamak veya dönüştürmek için gerektiğinde araçları (hedefe özgü yardımcı programlar / yükleyiciler ise) kullanırsınız.
old_timer

30

bazı kaynaklar:

  1. ARM mimarisi için ELF
    http://infocenter.arm.com/help/topic/com.arm.doc.ihi0044d/IHI0044D_aaelf.pdf
  2. Wiki http://en.wikipedia.org/wiki/Executable_and_Linkable_Format'tan ELF

ELF formatı genellikle derlemenin varsayılan çıktısıdır. GNU araç zincirlerini kullanıyorsanız, objcopy kullanarak bunu ikili biçime çevirebilirsiniz, örneğin:

  arm-elf-objcopy -O binary [elf-input-file] [binary-output-file]

veya ELF yardımcı programını kullanarak (ancak ADS gibi çoğu IDE'de yerleşiktir):

 fromelf -bin -o [binary-output-file] [elf-input-file]

6
Bu bin dosya detay cevap sonra eklenmiş ve yok eklenti bir pratik açıdan yararlı bir teknik. Bunun için +1.
erbdex

-1

Sadece bir noktayı düzeltmek istiyorum. ELF dosyası, derleyici tarafından değil, Bağlayıcı tarafından üretilir.

Derleyici görevi, kaynak kod dosyalarından nesne dosyalarını (* .o) ürettikten sonra sona erer. Bağlayıcı, tüm .o dosyalarını birbirine bağlar ve ELF'yi oluşturur.


Olumsuz oy verildi çünkü bu soruya cevap vermiyor ya da mutlaka doğru. Geniş tanımıyla, derleme bağlamayı içerir. ldBelgelerden alıntılanmıştır : Genellikle bir programı derlemenin son adımı ld'yi çalıştırmaktır.
bzeaman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.