Upload
damien
View
36
Download
0
Embed Size (px)
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
Citation preview
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
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
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
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
tő
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
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...
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)
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
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
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
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
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
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
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
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ó
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
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
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.)
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
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
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
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
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
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 ...
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ó)
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
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
2006BBTE, Alkalmazások és operációs rendszerek optimizálása
27Generált kód példa
2006BBTE, Alkalmazások és operációs rendszerek optimizálása
28
Köszönöm a figyelmet!