Dynamische Bibliothek



  • Servus beinander,

    Also ich bin neu hier und auch was c/c++ angeht.
    Ich programmiere aber schon Jahre mit PHP und habe Erfahrung mit dem kompilieren von Linux Server mit GCC.

    Ich habe mir eine kleine Funktion geschrieben und aus dieser eine dynamische Bibliothek erstellt.

    Wenn ich diese nun Linke und mein Programm baue, dieses per CGI starte bekomme ich einen 500.

    Im Apacheerrorlog finde ich dann:

    error while loading shared libraries: lib???.so: cannot open shared object file: No such file or directory
    

    Schön normalerweise muss die ja in einem Verzeichniss das ldgechached ist.
    Die Frage ist wie das als unprivilegierter Benutzer geht.

    Schöne Grüße
    Philipp


  • Mod

    Wenn du in den Pfaden, in denen ld standardmäßig sucht, nicht schreiben darfst, dann gibt es trotzdem Möglichkeiten:
    -statisch linken 😃 (vermutlich nicht, was du möchtest)
    -Mit der Umgebungsvariable LD_RUN_PATH kannst du einen (oder mehrere) Pfade angeben, die zur Linkzeit(! Das heißt, wenn du ein Programm erstellst) fest in die Executable eingetragen werden. Wenn das Programm ausgeführt wird, wird zuerst in diesen Pfaden nach Bibliotheken gesucht. Kommt nur in Frage, wenn du das Programm, welches die Bibliothek nutzt, auch selber erstellst. Wenn sich die Pfade ändern, muss das Programm neu erstellt werden.
    -Mit der Umgebunsvariable LD_LIBRARY_PATH kannst du einen oder mehrere Pfade zu den Pfaden hinzu fügen, die von ld durchsucht werden (und zwar zuerst!). Das gilt dann für alle Programme, die du ausführst, solange diese Variable gesetzt ist.
    -Man kann mit LD_PRELOAD Bibliotheken angeben, die vor allen anderen (selbst der Standardbibliothek!) benutzt werden. Damit kann man auch absolute Pfade angeben. Das ist ein Missbrauch dieser Funktionalität, aber ich will es der Vollständigkeit wegen noch erwähnen.
    -Irgendwas, was ich noch vergessen habe :p

    Wahrscheinlich ist LD_LIBRARY_PATH für dich das richtige, da es so klingt, als wolltest du möglicherweise mehrere Bibliotheken installieren, ohne Administratorrechte zu haben. Leg dir dazu ein lib-Verzeichnis irgendwo in deinem home-Ordner an und füge diesen Pfad LD_LIBRARY_PATH hinzu (möchtest du wahrscheinlich in irgendeinem Startup-Script setzen (möglicherweise .bach_profile, aber das kommt auf deine genaue Konfiguration an). Gleiches kannst du auch für Headerdateien und fertige Executables machen: PATH setzt Pfade, in denen nach Executables gesucht wird. CPATH setzt Pfade, in denen der GCC (und viele andere Compiler) nach Headern gucken (kann man auch noch feiner einstellen, siehe Anleitung).



  • .bach_profile

    ???
    Gemeint ist wohl .bash_profile, oder?



  • Du könntest deine Bibliothek auch mit man: dlopen händisch öffnen und die Funktion selber mit man: dlsym laden. Dann kannst du auch einen beliebigen Pfad nutzen.

    So hast du auch die Möglichkeit auf den Fehlschlag zu reagieren und nicht einfach mit einem 500 abzubrechen.

    Bei den Umgebungsvariablen bin ich gerade nicht sicher, aber das Programm wird ja vom apache mit dessen Rechten ausgeführt, oder? Dann dürfte die eigene .bash_profile nicht geladen werden. Mit einem Wrapper-Skript um dein cgi-Programm sollte es aber gehen... imo



  • Also ich habe das jetzt so verstanden, dass ich mit putenv die Variable "LD_LIBRARY_PATH" setzen kann und somit so-Bibliotheken laden kann. Hierfür stdlib.h bzw cstdlib in c++ es gibt keine Bibliothek.

    Philipp



  • pagyei schrieb:

    Also ich habe das jetzt so verstanden, dass ich mit putenv die Variable "LD_LIBRARY_PATH" setzen kann und somit so-Bibliotheken laden kann.

    Ja und Nein. 😉 Du musst die LD_LIBRARY_PATH setzen, bevor dein Programm geladen wird. Denn schon beim Laden werden die gelinkten Bibliotheken gesucht und evtl wird mit einem Fehler abgebrochen. (Wenn er also die Bibliothek nicht findet, wird dein Programm garnichterst ausgeführt und somit ist eine enthaltenes putenv ohne Einfluss.)
    In einem Wrapper-Programm könnte es aber so gehen. (Also ein kleines Programm, was das putenv und danach das eigentliche Programm aufruft.)

    pagyei schrieb:

    Hierfür stdlib.h bzw cstdlib in c++ es gibt keine Bibliothek.

    Keine Ahnung, was du mit diesem "Satz" sagen möchtest.



  • OK verstehe,
    Dann werde ich vermutlich .bsshrc verwenden.

    Danke



  • pagyei schrieb:

    Dann werde ich vermutlich .bsshrc verwenden.

    lagalopex schrieb:

    Bei den Umgebungsvariablen bin ich gerade nicht sicher, aber das Programm wird ja vom apache mit dessen Rechten ausgeführt, oder? Dann dürfte die eigene .bash_profile nicht geladen werden.

    Aber probiers aus, ist ja jetzt nicht so ein riesen Aufwand. 😉


Anmelden zum Antworten