Taşınabilir Yürütülebilir Dosya - Portable Executable
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 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 _CorExeMain
veya _CorDllMain
iç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.dll
IMAGE_COR20_HEADER
IMAGE_DIRECTORY_ENTRY_COMHEADER
IMAGE_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
- exe
- Yürütülebilir ve Bağlanabilir Biçim
- Maço
- a.out
- Yürütülebilir dosya biçimlerinin karşılaştırılması
- Yürütülebilir sıkıştırma
- ar (Unix) çünkü tüm COFF kitaplıkları aynı formatı kullanıyor
- Uygulama sanallaştırma
Referanslar
Dış bağlantılar
- PE Formatı (en son çevrimiçi belge)
- Microsoft Taşınabilir Yürütülebilir Dosya ve Ortak Nesne Dosya Biçimi Belirtimi (revizyon 8.1, OOXML biçimi)
- Microsoft Taşınabilir Yürütülebilir Dosya ve Ortak Nesne Dosya Biçimi Belirtimi (revizyon 6.0, .doc biçimi)
- Orijinal taşınabilir yürütülebilir makale ile Matt Pietrek ( MSDN Dergisi, Mart 1994)
- Bölüm I. Win32 Taşınabilir Yürütülebilir Dosya Formatına Derinlemesine Bakış , Matt Pietrek ( MSDN Magazine, Şubat 2002)
- Bölüm II. Matt Pietrek tarafından yazılan Win32 Taşınabilir Yürütülebilir Dosya Formatına Derinlemesine Bir Bakış ( MSDN Magazine, Mart 2002)
- Daniel Pistelli'nin .NET Dosya Biçimi
- Ero Carrera'nın PE başlığını ve nasıl geçileceğini açıklayan blogu
- PE Internals, Taşınabilir Yürütülebilir Dosya Formatını öğrenmenin kolay bir yolunu sunar