Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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.

Hasonló előadás


Az előadások a következő témára: "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."— Előadás másolata:

1 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 2 2006

2 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

3 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

4 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

5 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...

6 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)

7 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

8 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ó +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

9 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

10 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

11 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 11 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

12 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

13 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

14 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ó

15 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

16 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

17 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.)

18 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

19 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

20 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

21 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 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

22 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

23 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 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...

24 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ó)

25 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

26 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

27 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 27 Generált kód példa

28 2006BBTE, Alkalmazások és operációs rendszerek optimizálása 28 Köszönöm a figyelmet!


Letölteni ppt "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."

Hasonló előadás


Google Hirdetések