290 likes | 432 Views
Programok fordítása, szerkesztése és végrehajtása (Visual C alatt). 2. előadás dr. Robu Judit szeminárium drd. Lukács Sándor. 2006. Eszközök. Microsoft Visual C/C++ kompiler (14.0) ... VCbincl.exe Microsoft Linker (8.00) …VCbinlink.exe Microsoft Library Manager (8.00)
E N D
Programok fordítása, szerkesztése és végrehajtása (Visual C alatt) 2 előadás dr. Robu Judit szeminárium drd. Lukács Sándor 2006
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
Programok fejlesztése és betöltése ... source 1 obj 1 verem source 2 kompiler obj 2 könyvtárszerkesztő LIB függvénykönyvtár ... source N obj N EXEkód és adat statikus import source 1 obj 1 futtatható EXEállomány inicializálatlanadat loader source 2 kompiler obj 2 linker ... source N obj N dinamikus import DLL source 1 obj 1 import könyvtár ... source 2 kompiler obj 2 linker ... DLL source N obj N BBTE, Alkalmazások és operációs rendszerek optimizálása
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 ... BBTE, Alkalmazások és operációs rendszerek optimizálása
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) BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
Visual C/C++ opciók 3 • C/C++ → Preprocessor • Preprocessor Definitions • WIN32,_DEBUG,_CONSOLE vagy _LIB • WIN32,NDEBUG,_CONSOLE vagy _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 – /Gy Edit & Continue • Enable Enhanced Instruction Set – /arch:SSE2 • Floating Point Model – /fp:precise vagy /fp:fast • az előző két opció +20-30%-ot is jelenthet lebegőpontos programok esetén • C/C++ → Language • Disable Language Extensions – /Za • ANSI, pl. ha Linux-ra is kell fordítani BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
MAP file példa ... Preferred load address is 10000000 Start Length Name Class 0001:00000000 000007dcH .text CODE ... Address Publics by Value Rva+Base Lib:Object 0001:00000000 _DllMain@12 10001000 f buborek.obj 0001:00000010 _RendezBuborek 10001010 f buborek.obj ... Exports ordinal name 1 _RendezBuborek exported name: RendezBuborek IDA BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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ó BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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.) BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 00000000 characteristics 452B3F67 time date stamp Tue Oct 10 09:36:23 2006 0.00 version 1 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 1 0 00001040 Rendez = _Rendez BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
Import példa \visual_c_peldak\experiment>dumpbin /imports rendez1.exe Section contains the following imports: KERNEL32.dll 402000 Import Address Table 402214 Import Name Table F8 FreeLibrary 1A0 GetProcAddress ... buborek.dll 40204C Import Address Table 402260 Import Name Table 0 RendezBuborek MSVCR80.dll ... BBTE, Alkalmazások és operációs rendszerek optimizálása
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ó) BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
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 BBTE, Alkalmazások és operációs rendszerek optimizálása
Generált kód példa BBTE, Alkalmazások és operációs rendszerek optimizálása
Köszönöm a figyelmet! BBTE, Alkalmazások és operációs rendszerek optimizálása