2016-01-19 6 views
6

Ich habe einen C++ 14 Code, der eine beliebige gemeinsame Objektdatei mit dlopen laden soll. Leider können diese So-Dateien auf einigen Systemen (z. B. mein Archlinux, gilt auch für einige .so auf Ubuntu und Gentoo) "GNU-ld-Skripte" anstelle der tatsächlichen Binärdateien sein.Loading GNU ld Skript mit dlopen

Als Referenz hier ist der Inhalt meiner /usr/lib/libm.so:

/* GNU ld script 
*/ 
OUTPUT_FORMAT(elf64-x86-64) 
GROUP (/usr/lib/libm.so.6 AS_NEEDED (/usr/lib/libmvec.so.1)) 

Ich habe ein paar Code-Stücke gefunden, die in ghc oder ruby mit diesem Thema beschäftigen. Ich möchte vermeiden, die Textdatei, die den dlerror Text und die Datei analysiert, manuell zu analysieren. Ich denke, das ist schrecklich böse und ich werde keine Eckfälle dieses Formats implementieren und pflegen können.

Gibt es eine saubere Möglichkeit, diesen Fall zu implementieren? Ehrlich gesagt bin ich verwirrt, warum dlopen nicht wirklich diese tranparently behandelt.

Hinweis: In Anbetracht der oben genannten Patches denke ich, dass dies nicht nur ein Problem mit meiner Systemkonfiguration/Versionen ist. Wenn dies mit dlopen out-of-the-box funktioniert (Bug statt fehlende Funktion), lass es mich wissen.

+0

Ist Ihre ld.so gerade neu genug? – marcolz

+0

Nicht im Zusammenhang mit einer bestimmten Sprache, sondern zum Laden/Verknüpfen. – Olaf

+0

@Olaf Ich suche eine Lösung, die ich in meinem C++ Programm verwenden kann. Da ich die Bibliothek während der Laufzeit mit C++/C-Code lade, denke ich darüber nach. – Zulan

Antwort

4

Die Linker-Skripts sollen vom Linker und nicht vom Laufzeitlinker verwendet werden.

Der GNU ld script Kommentar sollte ein Werbegeschenk sein: Dies ist für ld, nicht für ld.so. ;-)

Siehe zum Beispiel: http://www.math.utah.edu/docs/info/ld_3.html

also denke ich mit dieser mit dlopen() nachahmen würde bedeuten,/Teil ld ‚s Magie für diesen importieren, die manuell Ihre Befürchtungen über den Rückgriff bestätigen würde, den Text zu parsen und schrecklich bösen Code zu halten.

EDIT: Es scheint eine Sache zu sein, die Sie aber helfen können:

https://www.sourceware.org/ml/libc-alpha/2011-07/msg00152.html

<gnu/lib-names.h> sollte ein LIBM_SO definieren enthalten, die Sie auf die richtige Datei zeigen sollte, dass Sie tatsächlich dlopen kann().

Das bedeutet, dass normalerweise kein böser Code nötig wäre.

+0

Während dies nicht das war, was ich mir erhofft habe, ist die Bearbeitung sehr hilfreich. Während es das Problem nicht transparent behandelt und die Lösung in den Anrufercode verschiebt, ist es sauber und schützt mich vor den Schrecken. – Zulan