2009-04-15 4 views
2

Ein Zwang von LD_PRELOAD nur auf HP-Plattform und nicht auf anderen Unix-Varianten (AIX, Linux und Solaris).Warum muss ich LD_PRELOAD für libcl.2 verwenden, um XML :: LibXML :: Common unter HP/UX zu verwenden?

Ich baute Perl-Modul XML::LibXML::Common auf allen Unix-Flavors.I musste LD_PRELOAD speziell für libcl.2-Bibliothek auf HP-Plattform nur tun. Während auf anderen Unix-Plattformen nichts als solches erforderlich war.

Ist dies ein Betriebssystem Verhalten oder etwas wirklich fehlt in HP Loader/Compiler?

ich ein Perl-Skript ausgeführt wird, die einfach ein neues Objekt erstellt "XML :: LibXML :: SAX"

use XML::LibXML::SAX; 
$x = XML::LibXML::SAX->new(); 

und beschwerte sich für

kann nicht geladen werden ‚site_perl/5.8.8/PA-RISC2.0-thread-Multi/auto/XML/LibXML/Common/Common.sl‘für Modul XML :: LibXML :: Häufig: Exec format error

und wenn ich das tue die LD_PRELOAD für libcl.2 der Fehler geht a Weg und die Perl ist für eine Multi-Thread-Unterstützung gebaut.

Antwort

1

Ihre Frage ist nicht klar ... warum mussten Sie LD_PRELOAD verwenden?

Liegt das daran, dass HP-UX SHLIB_PATH anstelle von LD_LIBRARY_PATH verwendet, sodass Sie die falsche Umgebungsvariable festgelegt haben?

Es hat andere Schreibweisen auf anderen Plattformen auch - Solaris und Linux teilen sich oft die gleiche Menge von env. Vars. MacOS X verwendet DYLIB_LIBRARY_PATH; AIX benutzt LIBPATH, glaube ich.

+0

Ja, ich musste LD_PRELOAD auf HP machen. Ich spreche nicht über Umgebung für, wo die Bibliothek mit LIBPATHS zu finden ist (denke, die Synonyme variieren je nach Betriebssystem). Was ich meinte ist, ich musste eine Bibliothek speziell zu laden, und dies hat nichts mit dem Finden einer Bibliothek in env zu tun Variablen. hoffe ich mache Sinn. – kadeshpa

+0

Warum mussten Sie die Bibliothek laden? War es das Überschreiben von Symbolen aus einer anderen Bibliothek? Gibt es eine libcl.sl, die du ersetzen musst? Im Moment haben Sie nicht erklärt, was schief gelaufen ist, bevor Sie LD_PRELOAD gemacht haben. Also, ich bin verwirrt; Der Mangel an anderen Antworten deutet darauf hin, dass andere auch sind. –

2

Ich denke, Sie fragen, warum Sie es verwenden müssen. Wenn Sie Perl Multithreading ausführen, wird eine der Bibliotheken, die Sie aufrufen, vor libc geladen und ist wahrscheinlich single threaded. Als Teil seiner Abhängigkeitsverarbeitung versucht es, eine Multithread-Bibliothek in Ihrer Umgebung zu laden. Durch Verwendung von LD_PRELOAD denke ich, dass Sie das Prinzip der Bibliotheksinterposition verwenden, um das Laden dieser Bibliothek vor dem Laden der unsicheren Bibliothek zu erzwingen. Der Begriff der Zwischen ist komplex und man könnte einen gewissen Nutzen aus der folgenden link gewinnen:

Auszug:

Bibliothek Zwischenschaltung zu verwenden, Sie benötigen eine spezielle freigegebene Bibliothek und Satz zu erstellen die LD_PRELOAD-Umgebung Variable. Wenn LD_PRELOAD festgelegt ist, verwendet der dynamische Linker die angegebene Bibliothek vor allen anderen, wenn er nach gemeinsam genutzten Bibliotheken sucht.

0

Ich bin mir nicht sicher, ob das relevant ist, aber es ist wahrscheinlich. Das Perl, das mit HP-UX mitgeliefert wird, ist nicht das Standard-Perl, sondern eine Kopie von ActiveState Perl - und was auch immer an Fremdheit sein mag. Wenn Sie feststellen, dass Perl im Gegensatz zu jeder anderen Umgebung seltsamerweise auf HP-UX reagiert, prüfen Sie, ob ActiveState Perl den Fehler verursacht.

0

Obwohl dies ein altes Thema ist, sehe ich jetzt etwas ähnliches auf HP-UX. In meinem Fall ist es nicht Perl, aber beim Erstellen der Sqlite3-Bindung von Python schlägt das dynamische Laden von /usr/lib/libcl.2 fehl.

Ich habe das configure-Skript mit --with-libs = '- lcl' ausgeführt. Obwohl die Verknüpfung mit der Binärdatei und die Verwendung von LD_PRELOAD nicht identisch ist, werden beide geändert, wenn /usr/lib/libcl.2 geladen wird. Seit es meine gelöst hat, versuchen Sie das.

Verwandte Themen