Kannettava suoritettava - Portable Executable
| Tiedostopääte |
.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys,.tsp
|
|---|---|
| Internet -mediatyyppi |
application/vnd.microsoft.portable-suoritettava |
| Kehittäjä | Tällä hetkellä: Microsoft |
| Muoto | Binaarinen , suoritettava , objekti , jaetut kirjastot |
| Laajennettu alkaen |
Suoritettava DOS MZ COFF |
Def (PE) -muodossa on tiedostomuoto varten ajettavat , kohdekoodimuodossa , DLL ja toiset käytetään 32-bittisiä ja 64-bittiset versiot Windows käyttöjärjestelmissä . PE -muoto on tietorakenne, joka sisältää tiedot, jotka Windows -latauslaite tarvitsee käärityn suoritettavan koodin hallintaan . Tämä sisältää dynaamisia kirjastoviittauksia linkittämistä , sovellusliittymän vienti- ja tuontitaulukoita, resurssienhallintatietoja ja säikeiden paikallista tallennusta (TLS) koskevia tietoja. Käytössä NT käyttöjärjestelmissä, PE-formaattia käytetään EXE , DLL , SYS ( laiteohjaimen ), MUI ja muut tiedostot. UEFI (UEFI) erittely todetaan, että PE on tavallinen suoritustiedosto muodossa EFI ympäristöissä.
Windows NT -käyttöjärjestelmissä PE tukee tällä hetkellä x86-32 , x86-64 (AMD64/Intel 64), IA-64 , ARM ja ARM64 käskyjoukkojen arkkitehtuureja (ISA). Ennen Windows 2000 : ta Windows NT (ja siten PE) tuki MIPS- , Alpha- ja PowerPC -ISA -standardeja. Koska PE: tä käytetään Windows CE: ssä , se tukee edelleen useita MIPS-, ARM (mukaan lukien peukalo ) - ja SuperH ISA -versioita .
PE: n vastaavat muodot ovat ELF (käytetään Linuxissa ja useimmissa muissa Unix- versioissa ) ja Mach-O (käytetään macOS: ssa ja iOS: ssä ).
Historia
Microsoft siirtyi PE-muotoon 16-bittisistä NE- muodoista, kun otettiin käyttöön Windows NT 3.1 -käyttöjärjestelmä. Kaikki myöhemmät Windows -versiot, mukaan lukien Windows 95/98/ME ja Win32s -lisäys Windows 3.1x: ään, tukevat tiedostorakennetta. Muoto on säilyttänyt rajoitetun vanhan tuen DOS -pohjaisten ja NT -järjestelmien välisen kuilun kuromiseksi . Esimerkiksi PE/COFF-otsikot sisältävät edelleen suoritettavan DOS-ohjelman , joka on oletusarvoisesti DOS-tynkä, joka näyttää viestin, kuten "Tätä ohjelmaa ei voi ajaa DOS-tilassa" (tai vastaava), vaikka se voi olla täysimittainen DOS ohjelman versio (myöhempi merkittävä tapaus on Windows 98 SE -asennusohjelma). Tämä muodostaa rasvan binaarimuodon . PE palvelee edelleen muuttuvaa Windows -alustaa. Jotkin laajennukset sisältävät .NET PE -muodon (katso alla), 64-bittisen version nimeltä PE32+ (joskus PE+) ja Windows CE -vaatimukset.
Tekniset yksityiskohdat
Layout
PE -tiedosto koostuu useista otsikoista ja osioista, jotka kertovat dynaamiselle linkittimelle, kuinka tiedosto kartoitetaan muistiin. Suoritettava kuva koostuu useista eri alueista, joista jokainen vaatii eri muistisuojauksen; joten jokaisen osion alku on kohdistettava sivurajaan. Esimerkiksi, tyypillisesti .text osa (jossa on ohjelmakoodi) on kartoitettu suorittaa / vain luku, ja .data osa (tilalla globaalien muuttujien) on kartoitettu kuin ei-suorita / readwrite. Tilan tuhlaamisen välttämiseksi eri osiot eivät kuitenkaan ole sivun tasalla levyllä. Osa dynaamisen linkittimen työtä on kartoittaa jokainen osa muistiin erikseen ja määrittää oikeat käyttöoikeudet tuloksena oleville alueille otsikoissa olevien ohjeiden mukaisesti.
Tuo taulukko
Yksi osa seteli on tuonti osoite taulukko (IAT), jota käytetään hakutaulukon, kun sovellus on kutsuvan funktiona eri moduulissa. Se voi olla sekä tuonti järjestyksellä että tuonti nimellä . Koska käännetty ohjelma ei voi tietää niiden kirjastojen muistipaikkoja, joista se riippuu, epäsuora hyppy vaaditaan aina, kun API -kutsu soitetaan. Kun dynaaminen linkki lataa moduuleja ja yhdistää ne yhteen, se kirjoittaa todelliset osoitteet IAT -paikkoihin niin, että ne osoittavat vastaavien kirjastotoimintojen muistipaikkoihin. Vaikka tämä lisää ylimääräistä hyppäämistä moduulin sisäisen puhelun kustannuksista, mikä johtaa suorituskykyrangaistukseen, se tarjoaa keskeisen edun: Kuormaimen on muutettava kopioitavia ja kirjoitettavia muistisivuja mahdollisimman vähän, mikä säästää muistia ja levyn I/O -aika. Jos kääntäjä tietää etukäteen, että puhelu on moduulien välinen (dllimport-määritteen kautta), se voi tuottaa enemmän optimoitua koodia, joka yksinkertaisesti johtaa epäsuoraan puhelun opcode- koodiin .
Muutot
PE-tiedostot eivät yleensä sisällä sijainnista riippumatonta koodia . Sen sijaan ne kootaan haluttuun perusosoitteeseen , ja kaikki kääntäjän/linkittimen lähettämät osoitteet korjataan etukäteen. Jos PE -tiedostoa ei voi ladata haluttuun osoitteeseen (koska jokin muu on jo ottanut sen), käyttöjärjestelmä perustaa sen uudelleen. Tämä sisältää jokaisen absoluuttisen osoitteen uudelleenlaskennan ja koodin muokkaamisen uusien arvojen käyttämiseksi. Kuormaaja tekee tämän vertaamalla ensisijaisia ja todellisia kuormitusosoitteita ja laskemalla delta -arvon. Tämä lisätään sitten ensisijaiseen osoitteeseen, jotta keksitään muistipaikan uusi osoite. Emäs siirroista tallennetaan luettelo ja lisättiin, tarvittaessa, olemassa olevaan muistipaikkaan. Tuloksena oleva koodi on nyt prosessin yksityinen eikä sitä voi enää jakaa , joten monet DLL -tiedostojen muistin säästöedut menetetään tässä skenaariossa. Se myös hidastaa moduulin lataamista merkittävästi. Tästä syystä uudelleenjakoa on vältettävä aina kun mahdollista, ja Microsoftin toimittamilla DLL-tiedostoilla on valmiiksi lasketut perusosoitteet, jotta ne eivät mene päällekkäin. Ei -uudelleenkäyttötapauksessa PE: llä on siis erittäin tehokas koodi, mutta muistin käytön uudelleenkohottaminen voi olla kallista. Tämä on ristiriidassa ELF: n kanssa, joka käyttää täysin sijainnista riippumatonta koodia ja yleisen offset-taulukon, joka vaihtaa suoritusajan edullisempaan muistin käyttöön.
.NET, metatiedot ja PE -muoto
.NET -suoritettavassa tiedostossa PE -koodiosa sisältää tynkän, joka kutsuu CLR -virtuaalikoneen käynnistysmerkinnän _CorExeMaintai _CorDllMainsisään mscoree.dll, aivan kuten Visual Basic -ohjelman suoritettavissa tiedostoissa. Virtuaalikone käyttää sitten läsnä olevia .NET -metatietoja, joiden juureen IMAGE_COR20_HEADER(jota kutsutaan myös "CLR -otsakkeeksi") viitataan syöttämällä IMAGE_DIRECTORY_ENTRY_COMHEADERPE -otsikon tietohakemistoon. IMAGE_COR20_HEADERmuistuttaa voimakkaasti PE: n valinnaista otsikkoa, ja sillä on olennainen rooli CLR -kuormaimessa.
CLR liittyvät tiedot, mukaan lukien juuri itse rakenne, on tyypillisesti sisältyvät yhteinen koodi osassa .text. Se koostuu muutamista hakemistoista: metatiedot, upotetut resurssit, vahvat nimet ja muutama natiivikoodien yhteentoimivuudesta. Metatietohakemisto on joukko taulukoita, joissa luetellaan kaikki kokoonpanon erilliset .NET -entiteetit, mukaan lukien tyypit, menetelmät, kentät, vakiot, tapahtumat sekä viittaukset niiden ja muiden kokoonpanojen välillä.
Käytä muissa käyttöjärjestelmissä
PE-muotoa käyttää myös ReactOS , koska ReactOS on tarkoitettu binääriyhteensopivaksi Windowsin kanssa. Sitä ovat historiallisesti käyttäneet myös monet muut käyttöjärjestelmät, kuten SkyOS ja BeOS R3. Kuitenkin sekä SkyOS että BeOS muuttivat lopulta ELF: ään .
Koska Mono -kehitysalusta aikoo olla binaarinen yhteensopiva Microsoft .NET Framework -ohjelman kanssa , se käyttää samaa PE -muotoa kuin Microsoft -toteutus. Sama pätee Microsoftin omaan cross-platform .NET Coreen .
Käytössä x86 (-64) Unix- käyttöjärjestelmistä Windows binäärit (PE-muodossa) voidaan suorittaa kanssa viini . HX DOS Extender käyttää myös PE-muodossa natiivia DOS 32-bittinen binäärejä, lisäksi se voi jossain määrin toteuttaa nykyinen Windows binäärejä DOS, mikä toimii kuten vastaava Wine DOS.
Käytössä IA-32 ja x86-64 Linux voi myös suorittaa Windows " DLL alla LoadLibrary.
Mac OS X 10.5 pystyy lataamaan ja jäsentämään PE -tiedostoja, mutta se ei ole binaarinen yhteensopiva Windowsin kanssa.
UEFI ja EFI firmware Kannettava Ohjelmatyyppiset sekä Windows ABI x64 kutsumistapa varten sovelluksiin .
Katso myös
- EXE
- Suoritettava ja linkitettävä muoto
- Mach-O
- a. ulos
- Suoritettavien tiedostomuotojen vertailu
- Suoritettava pakkaus
- ar (Unix), koska kaikki COFF -kirjastot käyttävät samaa muotoa
- Sovellusten virtualisointi
Viitteet
Ulkoiset linkit
- PE -muoto (viimeisin online -asiakirja)
- Microsoft Portable Executable and Common Object File Format Specification (versio 8.1, OOXML -muoto)
- Microsoft Portable Executable and Common Object File Format Specification (versio 6.0, .doc -muoto)
- Kuvan alkuperäinen def artikkelin mukaan Matt Pietrek ( MSDN Magazine, maaliskuu 1994)
- Osa I. perusteellisen katsauksen Win32 def tiedostomuodon mukaan Matt Pietrek ( MSDN Magazine, helmikuu 2002)
- Osa II. Perusteellisen katsauksen Win32 def tiedostomuodon mukaan Matt Pietrek ( MSDN Magazine, maaliskuu 2002)
- Daniel Pistellin .NET -tiedostomuoto
- Ero Carreran blogi, jossa kuvataan PE -otsikko ja kuinka kävellä läpi
- PE Internals tarjoaa helpon tavan oppia kannettava suoritettava tiedostomuoto