Alkalmazások és operációs rendszerek optimizálása „Babeş-Bolyai” Tudományegyetem, Matematika-Informatika Kar Programok fordítása, szerkesztése és végrehajtása (Visual C alatt) előadás dr. Robu Judit szeminárium drd. Lukács Sándor
BBTE, Alkalmazások és operációs rendszerek optimizálása 2 Eszközök Microsoft Visual C/C++ kompiler (14.0) ...\VC\bin\cl.exe Microsoft Linker (8.00) …\VC\bin\link.exe Microsoft Library Manager (8.00) …\VC\bin\lib.exe Microsoft COFF/PE Dumper (8.00) …\VC\bin\dumpbin.exe Microsoft Browse Information Maintance Utility (8.00) …\VC\bin\bscmake.exe Microsoft Portable Executable and Common Object File Format Specification MSDN / Platform SDK An In-Depth Look into the Win32 Portable Executable File Format MSDN Magazine
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 3 Program konfigurációk és fordítások 1 Solution → N Projekt x K Platform Build → Configuration Manager... debug (checked) és release (free) fordítások debug – debug szekciók, szimbolikus információk release – gyors, optimizált különböző fordítási módok Build – csak a módosított állományokat •a Visual C tud függvényenként is fordítani (incremental build) Rebuild (Build All) – minden állományt érvényes lehet csak az aktuális projektre vagy a teljes Solution-ra a kiterjesztés fontos, nyelvi különbségek vannak! .CPP kiterjesztés → alapértelmezetten C++ fordító .C kiterjesztés → alapértelmezetten C fordító Project → Project Dependencies... Build → Clean
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 4 Programok fejlesztése és betöltése source 1 source 2 source N kompiler obj 1 obj 2 obj N könyvtár szerkesztő LIB függvény könyvtár source 1 source 2 source N kompiler obj 1 obj 2 obj N linker futtatható EXE állomány source 1 source 2 source N kompiler obj 1 obj 2 obj N linker import könyvtár DLL EXE kód és adat inicializálatlan adat DLL verem... loader statikus import dinamikus import
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 5 C/C++ állományok szerkezete... #include "buborekpublic.h"- külső függőségek (kód és adat) PRENDEZ rendezo = &RendezBuborek; - globális adatok int main(int argc, char* argv[]) - állományon belüli kód { PVEKTOR pV;- lokális adat HMODULE module; InitRand();- más modulban lévő kód hívása module = LoadLibrary(L"gyors.dll");... if (0 == Inicializal(&pV, 100, 1))- más állományban lévő kód hívása...
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 6 Visual C/C++ opciók 1 Project → Properties (ALT+F7) mindig vigyázni kell a konfiguráció és a platform kiválasztására van All Configurations és All Platforms opció Configuration Properties → General Output Directory – a végső bináris állományok könyvtára (EXE, DLL, LIB, ILK, PDB,...) •sok hasznos makró, pl. $(SolutionDir), $(ConfigurationName) •használhatunk relatív könyvtárakat, pl. ″..\randinit″ Intermediate Directory – átmeneti, ideiglenes állományok könyvára Extensions to Delete on Clean Build Log File – fordítási / szerkesztési hibák esetén jól fog •részletesen tartalmazza a parancssor opciókat Configuration Type •EXE, LIB, DLL, Makefile (pl. driverek számára) Whole Program Optimization •Use Link Time Code Generation (/LTCG)
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 7 Visual C/C++ opciók 2 C/C++ → General Additional Include Directories – /I[path].H állományok Debug Information Support – /Zi /ZI Warning Level – /W0... /W3 /W4 •mindig /W4-el kell fordítani (ritkán elfogadható a /W3) Detect 64-bit Portability Issues – /Wp64 •pl. pointerek ellenőrzése Treat Warnings As Errors – /WX C/C++ → Optimization Optimization – /Od (nincs, debug mód) /O2 (maximális) Inline Function Expansion – /Ob1 (csak __inline) /Ob2 Whole Program Optimization – /GL
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 8 Visual C/C++ opciók 3 C/C++ → Preprocessor Preprocessor Definitions •WIN32,_DEBUG,_CONSOLEvagy _LIB •WIN32,NDEBUG,_CONSOLEvagy _LIB •megfelel a #define preprocesszor direktívának Generate Preprocessed File – /P •kiválóan alkalmazható ha problémáink vannak bonyolult makrók fordításával C/C++ → Code Generation Runtime Library •/MT /MTd – multi-threaded, statikus import •/MD /MDd – multi-threaded, DLL load-time import Enable Function-Level Linking – /GyEdit & Continue Enable Enhanced Instruction Set – /arch:SSE2 Floating Point Model – /fp:precise vagy /fp:fast •az előző két opció %-ot is jelenthet lebegőpontos programok esetén C/C++ → Language Disable Language Extensions – /Za •ANSI, pl. ha Linux-ra is kell fordítani
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 9 Visual C/C++ opciók 4 C/C++ → Output Files Assembler Output – /FA /FAs/Fa[name] •hasznos, ha elemezni akarjuk a C kompiler generálási módját vagy fel akarjuk használni a kódot asszembly szinten Object File Name – /Fo[name] Program Database File Name (.PDB) – /Fd[name] •a.PDB-re szüksége van a debugger-nek C/C++ → Browse Information Enable Browse Information – /FR/FR[name] •referenciát készít a forráskódról, így gyorsan lehet ugrani és kereni IDE-ből C/C++ → Advanced Calling Convention – /Gd (__cdecl) /Gr (__fastcall) /Gz (__stdcall) Use Full Paths – /FC •hasznos, ha bonyolult könyvtárstruktúrából (pl. több verzió) fordítjuk a programot C/C++ → Command Line ezt érdemes időnként átnézni
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 10 Visual C/C++ opciók 5 Linker → General Output File – /OUT:[file] Show Progress – /VERBOSE Enable Incremental Linking – /INCREMENTAL Additional Library Directories – /LIBPATH:[dir].LIB állományok Linker → Input Additional Dependencies.LIB állományok Linker → Debugging Generate Debug Info – /DEBUG •szükséges Release fordítások esetén is szimbolikus debug számára Generate Program Database File – /PDB:name Generate Map File – /MAP/MAP:[file] Map Exports – /MAPINFO:EXPORTS •jól fog ha C és Asm kódot használunk vagy speciális trükköket alkalmazunk Linker → System SubSystem – /SUBSYSTEM:CONSOLE/SUBSYSTEM:WINDOWS /SUBSYSTEM:NATIVE/SUBSYSTEM:POSIX
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 11 MAP file példa... Preferred load address is Start Length Name Class 0001: dcH.text CODE... Address Publics by Value Rva+Base Lib:Object 0001: f buborek.obj 0001: _RendezBuborek f buborek.obj... Exports ordinal name 1 _RendezBuborek exported name: RendezBuborek IDA
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 12 Visual C/C++ opciók 6 Linker → Advanced Entry Point – /Entry:[symbol] •nem kötelező C-ben a main Import Library – /IMPLIB:[name] •load-time linking számára Target Machine – /MACHINE:X86 /MACHINE:X64 Browse Information → General Output File – /o[file] Build Events Pre-Build Event – előkészítés a fordításra Pre-Link Event – előkészítése a szerkesztésre Post-Build Event – fordítás utáni utófeldolgozás •pl. következő verziószám generálása.H file-ba, automatikus backup a projektről stb. Makefile project esetén fontos a NMake opciók beállítása pl. driverek fejlesztése esetén megengedi a code-browsing-et és az IntelliSense integrálását
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 13 Programok szerkesztése (link) 1 static linking a leggyakrabban használt •.OBJ-k esetén is egy programon belül, vagy fordítás után az.OBJ-k és külső, expliciten megadott.LIB állományok felhasználásával történik az exportokat egy LIB tartalmazza szerkesztés közben a LIB beszerkesztődik a végső állományba megengedi a forráskód nélküli disztribúciót (.H és.LIB) load-time dynamic linking az exportokat egy DLL tartalmazza szerkesztés közben egy import LIB-el kell összeszerkeszteni a végső állományt – explicit függvényhívások a relokáció során történik az importok megoldása egy DLL-t több processz is megoszthat
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 14 Programok szerkesztése (link) 2 run-time dynamic linking az exportokat egy DLL tartalmazza nincs szükség import LIB-re LoadLibrary() – DLL betöltése; GetProcAddress() – függvény kezdőcímének betöltése megengedi a programok könnyű további bővítését és frissítését plugin rendszerek load-time linking esetén ha nem található a DLL, a program nem indítható
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 15 PE állományok – Bevezető Microsoft specifikus COFF (UNIX eredetű) PE32 és PE32+ formátum (ez utóbbi 64 bites) MS-DOS kompatibilis STUB, 0x3C-nél jelzett DWORD pozíción kezdődik a PE/COFF fejléc 0x014C – Intel 386 0x0004 – 4 szekció 0x00E0 – op. fejléc mérete
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 16 PE állományok – Alapfogalmak ImageBase – egy PE állomány memóriába való betöltése után az állomány báziscíme VA – egy változó, függvény stb. virtuális címe, ahová a memóriába be fog kerülni a betöltés során előre nem ismert (csak az alpértelmezett báziscím esetén), mert az állomány báziscíme a betöltés során relokálódhat RVA – bázisrelatív cím (VA-ImageBase) előre ismert, mivel az elemek egymáshoz viszonyított pozíciója konstans File Pointer – egy elem effektív pozíciója a PE vagy OBJ állományon belül Szekció – a kód és adat alapegysége PE/COFF állományokban pl. a teljes kód lehet egy szekcióban, vagy mindenik függvény lehet külön szekcióba egy szekció RAW adatai a PE állományból folytonosan kell betöltődjenek a memóriába vannak speciális szekciók, pl..reloc,.tls egy szekció hasonlít némiképp egy x86-os szegmensre
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 17 PE állományok – Szekciók Name VirtualSize – szekcíó mérete a memóriában VirtualAddress – RVA cím SizeOfRawData – lehet kisebb mint VirtualSize PointerToRawData – File Pointer a RAW adatokhoz Characteristics – jellemzők (írható, olvasható stb.)
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 18 PE állományok – Betöltés a memóriába a szekciók mérete eltérő az állományban és betöltve a memóriába
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 19 PE állományok – Opcionális fejléc Magic – az állomány típusa SizeOfCode SizeOfInitializedData SizeOfUnitializedData AddressOfEntryPoint – RVA kezdőcím ImageBase – báziscím SizeOfImage – MS-DOS stub, fejlécek, összes szekció Checksum Subsystem – 3 – Console Export Table – RVA és méret Import Table – RVA és méret Resource Table – RVA és méret
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 20 PE állományok – Exportok (.edata) három táblával történik az export Export Address Table – RVA címeket tartalmaz Export Name Pointer Table – mutatókat az exportok nevére Export Ordinal Table – 16 bites indexek az EAT-ba NumberOfNamePointers – az ENPT és EOT elemeinek száma AddressTableEntries – az EAT bemeneteinek száma lehet nagyobb mint NumberOfNamePointers ExportAddressTableRVA NamePointerRVA OrdinalTableRVA
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 21 Export példa...\visual_c_peldak\experiment>dumpbin /exports gyors.dll Dump of file gyors.dll File Type: DLL Section contains the following exports for gyors.dll characteristics 452B3F67 time date stamp Tue Oct 10 09:36: version 1 ordinal base 1 number of functions 1 number of names ordinal hint RVA name Rendez = _Rendez
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 22 PE állományok – Importok (.idata) minden DLL számára egy IMAGE_IMPORT_DESCRIPTOR két táblázat Import Lookup Table – táblázat 32 bites szám szerinti importokra (import by ordinal) vagy név-mutatókra (import by name) Import Address Table – effektíve 32 bites címek a relokáció után NameRVA – a DLL nevére mutat ImportLookupTableRVA ImportAddressTableRVA
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 23 Import példa \visual_c_peldak\experiment>dumpbin /imports rendez1.exe Section contains the following imports: KERNEL32.dll Import Address Table Import Name Table F8 FreeLibrary 1A0 GetProcAddress... buborek.dll 40204C Import Address Table Import Name Table 0 RendezBuborek MSVCR80.dll...
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 24 Importok egy PE állományban minden függvény számára egy-egy stub generálódik a stub egy táblázatban lévő címre ugrik, ezt a loader fogja behelyettesíteni (relokáció)
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 25 Programok betöltése (load) amikor egy futtatható állományt a memóriába töltünk be és előkészítjük a végrehajtásra LoadLibrary() – DLL betöltése CreateProcess() – process indítása (pl. EXE) memória foglalódik le a kód és adat szekciók számára read-only vagy read-write adatok NX bit beállítása kód szegmensek esetén relokáció (explicit JMP-ok, CALL-ok megoldása) elég kevés van, mert a legtöbb az relatív JMP/CALL •az x64 megengedi az IP relatív címzést load-time importok elvégzése
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 26 Programok végrehajtása (execution) a processzor kikódolja és végrehajtja az utasításokat bővebben lesz szó erről az ASM optimizálásoknál
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 27 Generált kód példa
2006BBTE, Alkalmazások és operációs rendszerek optimizálása 28 Köszönöm a figyelmet!