Aufbau eines einfachen Hallo-Welt-esque) Beispiel für die Verwendung von ld-option -rpath mit $ORIGIN

Hinweis: Vollständige Beispiel unten. Original-Frage folgt:

Ich Probleme mit ld ' s -rpath parameter mit $ORIGIN.

So konnte ich nicht finden ein vollständiges Beispiel, ich dachte, ich würde versuchen eins selbst zu schreiben, so dass ich und andere Sie später benutzen können. Sobald ich es funktioniert werde ich ordentlich es.

Ich fragte über diese vor, aber ich denke, mein post war ein bisschen verwirrend.

Beispiel-Projekt erstellt eine freigegebene Bibliothek und eine ausführbare Datei, die links auf diese Bibliothek.

Es ist sehr klein (3 Dateien, 22 Zeilen incl buildscripts).

Herunterladen können Sie das Projekt aus hier


Aufbau der Datei (vor dem Gebäude):

  • project/
    • src/
      • foo.cpp
      • main.cpp
    • make.sh

project/src/foo.cpp


int foo()
  { return 3; }

project/src/main.cpp


int foo();

#include <iostream>
int main()
  {
    std::cout << foo() << std::endl;
    return 0;
  }

project/make.sh


# Make directories:
mkdir -p -v obj
mkdir -p -v lib
mkdir -p -v run

# Build the library:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.sh obj/foo.o

# Build the executable:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../../lib' -Llib -l:foo.sh

Aus der project Verzeichnis, führen Sie make.sh (stellen Sie sicher, es ist ausführbar).


Datei-Struktur (nach dem Aufbau):

  • project/
    • src/
      • foo.cpp
      • main.cpp
    • obj/
      • foo.o
      • main.o
    • lib/
      • foo.so
    • run/
      • main.run
    • make.sh

run/main.run sollte jetzt laden lib/foo.sh auf Ausführung, von überall.

Probleme

Derzeit ist dies nur teilweise funktioniert.

Die Dateien kompilieren und verknüpfen-OK, aber es nicht link, wenn Sie von jedem Verzeichnis außer project (das ist der Sinn der übung).

Inspektion main.run mit readelf -d zeigt:

0x0000000000000001 (NEEDED) Shared library: [lib/foo.sh]

0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../../lib]
Das sieht in der Nähe (ich würde lieber [foo.sh] als [lib/foo.sh] aber ich Mach dazu später).

AFAICT die $ORIGIN im -Wl,-rpath,'$ORIGIN/../../lib' bedeutet project/run/main.run so dass diese rpath werden sollte project/lib.

Habe ich versucht $ORIGIN/.., $ORIGIN/../lib, $ORIGIN/../.., $ORIGIN/../../lib ohne Erfolg.

Hinweis: ich bin mit -l: erfordert die vollständige Bibliothek mit dem Namen (unter anderen Gründen, ist es einfacher script mit Variablen, wenn alle Funktionen haben den gleichen Namen-format).

Weiß jemand, warum dies nicht funktioniert?

Oder alternativ, hat jemand oder weiß ein funktionsfähiges Beispiel?

InformationsquelleAutor Simon | 2011-06-10
Schreibe einen Kommentar