programok fordítása, szerkesztése és végrehajtása (visual c alatt)

28
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

Upload: damien

Post on 24-Jan-2016

36 views

Category:

Documents


0 download

DESCRIPTION

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) - PowerPoint PPT Presentation

TRANSCRIPT

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

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 Juditszeminárium

drd. Lukács Sándor

2

2006

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

2Eszkö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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

3Program 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

4Programok fejlesztése és betöltése

source 1

source 2

source N

kom

pile

r obj 1

obj 2

obj N

köny

vtár

szer

kesz

LIB függvénykönyvtár

source 1

source 2

source N

kom

pile

r obj 1

obj 2

obj Nlin

ker futtatható EXE

állomány

source 1

source 2

source N

kom

pile

r obj 1

obj 2

obj N

linke

r import könyvtár

DLL

EXEkód és adat

inicializálatlanadat

DLL

verem

...

...

...

...

...

load

er

statikus import

dinamikus import

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

9Visual 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

10Visual 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

11MAP 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

12Visual 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

13Programok 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

15PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

16PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

18PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

19PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

20PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

21Export példa

...\visual_c_peldak\experiment>dumpbin /exports gyors.dllDump of file gyors.dllFile 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

22PE á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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

23Import példa

\visual_c_peldak\experiment>dumpbin /imports rendez1.exeSection 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 ...

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

25Programok 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

26Programok 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

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

27Generált kód példa

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

2006BBTE, Alkalmazások és operációs rendszerek optimizálása

28

Köszönöm a figyelmet!