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.


Anmelden zum Antworten