Taşınabilir Yürütülebilir Dosya - Portable Executable

Taşınabilir Yürütülebilir Dosya
Dosya adı uzantısı
.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys,.tsp
İnternet medya türü
application/vnd.microsoft.portable-executable
Tarafından geliştirilmiş Şu anda: Microsoft
Biçim türü İkili , yürütülebilir , nesne , paylaşılan kitaplıklar
Genişletilmiş DOS MZ yürütülebilir
COFF

Taşınabilir çalıştırılabilir (PE) biçiminde bir olan dosya formatı için yürütülebilir , nesne kodu , dll 32 bit ve 64-bit sürümlerinde kullanılan ve diğerleri , Windows işletim sistemleri . PE biçimi, Windows işletim sistemi yükleyicisinin sarılmış yürütülebilir kodu yönetmesi için gerekli bilgileri içine alan bir veri yapısıdır . Bu, bağlama , API dışa aktarma ve içe aktarma tabloları, kaynak yönetimi verileri ve iş parçacığı yerel depolama (TLS) verileri için dinamik kitaplık referanslarını içerir . On NT işletim sistemlerinin, PE formatındaki için kullanılan EXE , DLL , SYS ( aygıt sürücüsü ), MUI ve diğer dosya türleri. Birleştirilmiş Genişletilebilir Ürün Arabirimi (UEFI) Tarifname PE EFI ortamlarda standart çalıştırılabilir biçimde olduğunu.

Windows NT işletim sistemlerinde PE şu anda x86-32 , x86-64 (AMD64/Intel 64), IA-64 , ARM ve ARM64 komut seti mimarilerini ( ISA'lar ) desteklemektedir. Windows 2000'den önce , Windows NT (ve dolayısıyla PE) MIPS , Alpha ve PowerPC ISA'larını desteklerdi. PE, Windows CE'de kullanıldığından , MIPS, ARM ( Thumb dahil ) ve SuperH ISA'ların çeşitli türevlerini desteklemeye devam eder .

PE'ye benzer biçimler, ELF ( Linux'ta ve Unix'in diğer birçok sürümünde kullanılır ) ve Mach-O'dur ( macOS ve iOS'ta kullanılır ).

Tarih

Microsoft , Windows NT 3.1 işletim sisteminin tanıtımıyla birlikte 16 bit NE biçimlerinden PE biçimine geçti . Windows 95/98/ME ve Windows 3.1x'e eklenen Win32 dahil olmak üzere Windows'un tüm sonraki sürümleri dosya yapısını destekler. Biçim, DOS tabanlı ve NT sistemleri arasındaki boşluğu kapatmak için sınırlı eski desteği korumuştur . Örneğin, PE/COFF üstbilgileri , varsayılan olarak "Bu program DOS modunda çalıştırılamaz" (veya benzeri) gibi bir mesaj görüntüleyen bir DOS saplaması olan bir DOS yürütülebilir programı içerir , ancak tam teşekküllü bir DOS olabilir programın sürümü (daha sonraki dikkate değer bir durum Windows 98 SE yükleyicisidir). Bu, bir yağ ikili biçimini oluşturur . PE, değişen Windows platformuna da hizmet etmeye devam ediyor. Bazı uzantılar .NET PE biçimini (aşağıya bakın), PE32+ (bazen PE+) olarak adlandırılan 64 bitlik bir sürümü ve Windows CE için bir belirtimi içerir.

Teknik detaylar

Düzen

Bir Taşınabilir Yürütülebilir Dosyanın Yapısı 32 bit

Bir PE dosyası, dinamik bağlayıcıya dosyayı belleğe nasıl eşleyeceğini söyleyen bir dizi başlık ve bölümden oluşur . Yürütülebilir bir görüntü, her biri farklı bellek koruması gerektiren birkaç farklı bölgeden oluşur; bu nedenle her bölümün başlangıcı bir sayfa sınırına göre hizalanmalıdır. Örneğin, tipik olarak .text bölümü (program kodunu tutan) yürütme/salt okunur olarak eşlenir ve .data bölümü (global değişkenleri tutan) yürütme/okuma yok olarak eşlenir. Ancak, yer israfını önlemek için, farklı bölümler diskte sayfa hizalı değildir. Dinamik bağlayıcının işinin bir kısmı, her bölümü ayrı ayrı belleğe eşlemek ve başlıklarda bulunan talimatlara göre ortaya çıkan bölgelere doğru izinleri atamaktır.

Tabloyu içe aktar

Notun bir bölümü , uygulama farklı bir modülde bir işlev çağırırken arama tablosu olarak kullanılan alma adres tablosudur (IAT). Hem sıralı ithalat hem de isme göre ithalat şeklinde olabilir . Derlenmiş bir program, bağlı olduğu kitaplıkların bellek konumunu bilemediği için, bir API çağrısı yapıldığında dolaylı bir atlama gerekir. Dinamik bağlayıcı modülleri yükler ve onları birleştirirken, gerçek adresleri IAT yuvalarına yazar, böylece ilgili kitaplık işlevlerinin bellek konumlarını gösterirler. Bu, modül içi çağrının maliyeti üzerinde ekstra bir sıçrama yaparak performans cezasına neden olsa da önemli bir fayda sağlar: Yazma sırasında kopyalanması gereken bellek sayfalarının sayısı yükleyici tarafından değiştirilerek en aza indirilir ve bellek tasarrufu sağlanır ve disk G/Ç zamanı. Derleyici, bir çağrının modüller arası olacağını önceden biliyorsa (bir dllimport özniteliği aracılığıyla), yalnızca dolaylı çağrı opcode ile sonuçlanan daha optimize kod üretebilir .

yer değiştirme

PE dosyaları normalde konumdan bağımsız kod içermez . Bunun yerine tercih edilen bir temel adrese derlenirler ve derleyici/bağlayıcı tarafından yayılan tüm adresler önceden sabitlenir. (Zaten başka bir şey tarafından alınan çünkü) bir PE dosyası onun tercih adreste yüklü edilemiyorsa, işletim sistemi olacak rebase onu. Bu, her mutlak adresin yeniden hesaplanmasını ve yeni değerleri kullanmak için kodun değiştirilmesini içerir. Yükleyici bunu, tercih edilen ve gerçek yük adreslerini karşılaştırarak ve bir delta değeri hesaplayarak yapar . Bu daha sonra hafıza konumunun yeni adresini bulmak için tercih edilen adrese eklenir. Baz yer değiştirmeleri bir listede saklanır ve gerektiğinde mevcut bir hafıza konumuna eklenir. Ortaya çıkan kod artık sürece özeldir ve artık paylaşılamaz , bu senaryoda DLL'lerin bellek tasarrufu avantajlarının çoğu kaybolur. Ayrıca modülün yüklenmesini önemli ölçüde yavaşlatır. Bu nedenle, mümkün olan her yerde yeniden temellendirmeden kaçınılmalıdır ve Microsoft tarafından gönderilen DLL'ler, çakışmamaları için önceden hesaplanmış temel adreslere sahiptir. Yeniden temelsiz durumda PE bu nedenle çok verimli kod avantajına sahiptir, ancak yeniden temellendirmenin varlığında bellek kullanımı isabeti pahalı olabilir. Bu , tamamen konumdan bağımsız kod ve yürütme süresini daha düşük bellek kullanımı lehine değiştiren global bir ofset tablosu kullanan ELF ile çelişir .

.NET, meta veriler ve PE biçimi

Bir .NET yürütülebilir dosyasında, PE kodu bölümü, Visual Basic yürütülebilir dosyalarında olduğu gibi , CLR sanal makine başlangıç ​​girdisini _CorExeMainveya _CorDllMainiçinde çağıran bir saplama içerir . Ardından sanal makine, kökü ("CLR başlığı" olarak da adlandırılır) PE başlığının veri dizinindeki girişle gösterilen mevcut .NET meta verilerini kullanır . PE'nin isteğe bağlı başlığına çok benzer ve esasen CLR yükleyici için rolünü oynar. mscoree.dllIMAGE_COR20_HEADERIMAGE_DIRECTORY_ENTRY_COMHEADERIMAGE_COR20_HEADER

Kök yapının kendisi de dahil olmak üzere CLR ile ilgili veriler tipik olarak ortak kod bölümünde bulunur, .text. Birkaç dizinden oluşur: meta veriler, gömülü kaynaklar, güçlü adlar ve yerel kod birlikte çalışabilirliği için birkaç dizi. Meta veri dizini, türler, yöntemler, alanlar, sabitler, olaylar ve bunlar arasındaki ve diğer derlemelere yapılan başvurular dahil olmak üzere derlemedeki tüm farklı .NET varlıklarını listeleyen bir tablo kümesidir.

Diğer işletim sistemlerinde kullanın

PE formatı, ReactOS tarafından Windows ile ikili uyumlu olması amaçlandığından, ReactOS tarafından da kullanılır . Ayrıca tarihsel olarak SkyOS ve BeOS R3 dahil olmak üzere bir dizi başka işletim sistemi tarafından kullanılmıştır . Ancak, her iki skyos ve BeOS sonunda taşındı ELF .

As Mono geliştirme platformu Microsoft ile uyumlu ikili olmayı amaçlamaktadır .NET Framework , Microsoft uygulaması ile aynı PE biçimini kullanır. Aynısı, Microsoft'un kendi platformlar arası .NET Core için de geçerlidir .

Açık x86 (-64) Unix benzeri işletim sistemleri, (PE formatındaki) Windows ikilileri ile çalıştırılabilir Şarap . HX DOS Extender ayrıca yerli DOS 32 bitlik ikililer için PE biçimini kullanır, ayrıca, bir dereceye kadar, bu şekilde bir eşdeğer gibi davranan, DOS içinde varolan Windows ikilileri yürütebilirsiniz Şarap DOS için.

On IA-32 ve x86-64 Linux biri de çalıştırabilir Windows'un ' dll LoadLibrary altında.

Mac OS X 10.5 , PE dosyalarını yükleme ve ayrıştırma yeteneğine sahiptir, ancak Windows ile ikili uyumlu değildir.

UEFI ve EFI sabit yazılımı , uygulamalar için Windows ABI x64 çağrı kuralının yanı sıra Taşınabilir Yürütülebilir dosyaları kullanır .

Ayrıca bakınız

Referanslar

Dış bağlantılar