Aufruf einer DLL Funktion



  • Hallo,

    ich habe mehrere Fragen, bitte sagt mir ob ich falsch liege oder richtig:

    1. wenn ich ein C++ Programm schreibe und eine Funktion aus einer .lib statisch dazu linke (zb printf), dann befindet sich ja wirklich der Code von printf in meiner exe und an der Aufrufstelle steht dann sowas wie "jmp XYZ", wobei XYZ die Stelle mit dem printf Code ist. Stimmt das?

    2. Aber wie funktioniert das, wenn ich printf dynamisch linke (also zu meinem Projekt die Importlib .lib linke, aber der echte Code in einer DLL steht). Dann kann ja in meinem Code nicht eine konkerete Adresse stehen, also sowas wie "jmp 43EEF3BC" geht dann ja nicht, oder? Was steht dann da?

    3. Wenn ich jetzt mein Programm starte, das eine Funktion aus einer DLL aufruft, wann wird dann die Adresse ausgelöst? Sobald ich die Exe starte oder erst wenn die Codeausführung an die Aufrufstelle kommt und der Call notwendig ist?

    4. Wenn mein Programm test.exe eine DLL Funktion aufruft (sagen wir meine Exe ruft Funktion "foo()" aus DLL "bar.dll" auf. Wird dann der Code von foo() aus bar.dll in den Prozess von test.exe kopiert? Sprich: Wenn 3 Prozesse foo() aus bar.dll benutzen, hat dann jeder der 3 Prozesse ein eigenes foo()?



    1. wenn ich ein C++ Programm schreibe und eine Funktion aus einer .lib statisch dazu linke (zb printf), dann befindet sich ja wirklich der Code von printf in meiner exe und an der Aufrufstelle steht dann sowas wie "jmp XYZ", wobei XYZ die Stelle mit dem printf Code ist. Stimmt das?

    Nö, ein "call XYZ", außer der Compiler sollte sich aus unergründlichen Gründen zu einem Jump entschließen.

    1. Aber wie funktioniert das, wenn ich printf dynamisch linke (also zu meinem Projekt die Importlib .lib linke, aber der echte Code in einer DLL steht). Dann kann ja in meinem Code nicht eine konkerete Adresse stehen, also sowas wie "jmp 43EEF3BC" geht dann ja nicht, oder? Was steht dann da?

    Der Prozess hat ein Import-Table, da sind die Addressen von den "dynamischen Funktionen". Die Addresse des Import-Tables ist zur Compilezeit bekannt.

    1. Wenn ich jetzt mein Programm starte, das eine Funktion aus einer DLL aufruft, wann wird dann die Adresse ausgelöst? Sobald ich die Exe starte oder erst wenn die Codeausführung an die Aufrufstelle kommt und der Call notwendig ist?

    Bevor Code in der Hauptfunktion aufgerufen wird, werden alle Module (DLLs) gemappt, außer man lädt manuell mit LoadLibrary nach.

    1. Wenn mein Programm test.exe eine DLL Funktion aufruft (sagen wir meine Exe ruft Funktion "foo()" aus DLL "bar.dll" auf. Wird dann der Code von foo() aus bar.dll in den Prozess von test.exe kopiert? Sprich: Wenn 3 Prozesse foo() aus bar.dll benutzen, hat dann jeder der 3 Prozesse ein eigenes foo()?

    Bin ich mir gar nicht so sicher 😉
    Theoretisch nein, der Vorteil des dynamischen Links ist ja die Speicherplatzersparnis, als legt jeder Prozess nur für Variablen und nicht für Code Speicher an. Da ich aber öfters mit Hooks spiele, weiß ich dass diese nur prozesslokal funktionieren, also müssten die anderen Prozesse anderen Code haben...


Anmelden zum Antworten