Linking, DLLs etc
-
Hallo,
ich würde gerne ein tieferes Verständnis für folgende Dinge bekommen:
+ Wie der Linker genau arbeitet
+ Wie genau Funktionen aus DLLs geladen werden
+ Was passiert wenn ich eine exe doppelklicke (also wie Windows aus der PE einen Prozess macht)
+ Wie konkret unter Windows so ein Prozess aussieht.Kennt da jemand ein gutes Tutorial?
-
Interessierter schrieb:
ich würde gerne ein tieferes Verständnis für folgende Dinge bekommen:
...Kennt da jemand ein gutes Tutorial?
"Tieferes Verständnis" und "Tutorial" passt nicht zusammen.
Zu deinen Fragen würde ich vermuten, dass die Dokumentation des Windows Driver Development Kit dazu etwas schreibt.
-
Welches Linken meinst du? Dynamisches oder statisches?( Deinen weiteren Fragen nach zu urteilen wohl eher dynamisches? )
Eine Kurzbeschreibung zur Funktion des Linkers hab ich nach einmal googeln gefunden: http://www.mikrocontroller.net/topic/147498#1374908
-
+ Wie der Linker genau arbeitet
Der Linker hat den Objectcode aller Sourcefiles vorliegen und kopiert sich zusammen was er braucht + kümmert sich um OS-spezifische Elemente der Executeable.
+ Wie genau Funktionen aus DLLs geladen werden
Hierzu zeige ich dir eine Eigenimplementation von GetProcAddress, leider nicht kommentiert:
//Written by Cypher, credit him FARPROC Process::customGetProcAddress(HMODULE module, const std::string& functionName) const { PIMAGE_DOS_HEADER pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(module); if(!pDosHeader || pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) throw std::runtime_error("Process::customGetProcAddress Error : DOS PE header is invalid."); PIMAGE_NT_HEADERS pNtHeader = reinterpret_cast<PIMAGE_NT_HEADERS>(reinterpret_cast<PCHAR>(module) + pDosHeader->e_lfanew); if(pNtHeader->Signature != IMAGE_NT_SIGNATURE) throw std::runtime_error("Process::customGetProcAddress Error : NT PE header is invalid."); PVOID pExportDirTemp = reinterpret_cast<PBYTE>(module) + pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; PIMAGE_EXPORT_DIRECTORY pExportDir = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(pExportDirTemp); if(pExportDir->AddressOfNames == NULL) throw std::runtime_error("Process::customGetProcAddress Error : Symbol names missing entirely."); PDWORD pNamesRvas = reinterpret_cast<PDWORD>(reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfNames); PWORD pNameOrdinals = reinterpret_cast<PWORD>(reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfNameOrdinals); PDWORD pFunctionAddresses = reinterpret_cast<PDWORD>( reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfFunctions); for (DWORD n = 0; n < pExportDir->NumberOfNames; n++) { PSTR CurrentName = reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(module) + pNamesRvas[n]); if(functionName == CurrentName) { WORD Ordinal = pNameOrdinals[n]; return reinterpret_cast<FARPROC>(reinterpret_cast<PBYTE>(module) + pFunctionAddresses[Ordinal]); } } return 0; }
+ Was passiert wenn ich eine exe doppelklicke (also wie Windows aus der PE einen Prozess macht)
Es wird Speicher alloziert, der komplette Code/Daten gemappt, ein Mainthread erstellt.
+ Wie konkret unter Windows so ein Prozess aussieht.
Ein Container von Threads, Heapblöcken und Modulen.