printf rufen - ohne stdio.h



  • Moin!

    Mich beschäftigt zur Zeit folgende Frage:
    Ich möchte die Funktion printf() rufen. printf nehme ich als Beispiel.
    Das Problem ist, dass ich zur Kompilierzeit weder weiß, wie die Funktion heißt, noch in welchem Modul sie kompiliert ist, noch welche Parameter sie hat.

    Ich muss also zur Laufzeit über eine Konfiguration das Modul laden, die Funktion darin finden und sie rufen.

    Kann mir jemand eine Kurzanleitung geben, bzw. den Namen der benötigten Systemfunktionen, damit ich mich durch die Man-Pages lesen kann? Links zu passenden Seiten oder Informationen aller Art sind willkommen.

    Vielen Dank. 🙂



  • Du möchtest die Funktion (bzw. das Symbol) aus einer Shared Library laden, ja? Dafür gibt es dlopen, dlsym, dlclose.

    Ein Minimalbeispiel hätte ich auch 😉

    #include <dlfcn.h>
    
    int main()
    {
        int (*loaded_printf)(const char*, ...);
        void* handle = dlopen("libc.so", RTLD_NOW);
        loaded_printf = dlsym(handle, "printf");
        loaded_printf("success: %p\n", loaded_printf);
        return 0;
    }
    


  • Super, genau, was ich brauche.
    Vielen Dank.

    Wenn's sonst noch interessiert, das Programm ist per gcc mit "-ldl" zu übersetzen.



  • Xin schrieb:

    Wenn's sonst noch interessiert, das Programm ist per gcc mit "-ldl" zu übersetzen.

    Stimmt, hatte ich vergessen (sorry).



  • Wieso ist libdl linkbar, libc aber nicht? 😕

    EDIT: Beim zweiten Lesen seh ich: Beispiel. 🤡



  • LordJaxom schrieb:

    Xin schrieb:

    Wenn's sonst noch interessiert, das Programm ist per gcc mit "-ldl" zu übersetzen.

    Stimmt, hatte ich vergessen (sorry).

    Ich habe noch ein Problem: Wenn ich dlclose() darunter setze, stürzt das Programm ab.
    Eine Idee, warum?



  • dlclose(handle) oder dlclose(loaded_printf)? 😉



  • LordJaxom schrieb:

    dlclose(handle) oder dlclose(loaded_printf)? 😉

    dlclose(handle); schmiert ab.


Anmelden zum Antworten