1 / 28

Programok fordítása, szerkesztése és végrehajtása (Visual C alatt)

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)

damien
Download Presentation

Programok fordítása, szerkesztése és végrehajtása (Visual C alatt)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

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

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

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

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

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

More Related