2016-04-25 14 views
3

Ich möchte LD_PRELOAD auf eine gemeinsam genutzte Bibliothek zeigen, wo ich entweder eine 64-Bit- oder 32-Bit-Anwendung ausführen kann. Es ist offensichtlich, dass die gemeinsam genutzte Bibliothek und die ausführbare Datei in Bit-Übereinstimmung übereinstimmen müssen.Verwenden von LD_PRELOAD gemischte 64bit/32bit-Umgebung in Linux

$ LD_PRELOAD=/lib64/lib_init.so ./hello32 
ERROR: ld.so: object '/lib64/lib_init.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored 

wo hello32 ist eine 32-Bit-Anwendung. Es gibt einige Seiten in der Welt aus, die sagen, dass ich in der Lage sein sollte, zu tun:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello32 
ERROR: ld.so: object '/$LIB/lib_init.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored 

Wo $ LIB automatisch zwischen lib und lib64 je nach schaltet, ob die Anwendung 32 oder 64 Bit ist. Aber offensichtlich funktioniert das nicht.

Gibt es einen Trick, damit das funktioniert? LD_PRELOAD_32, LD_PRELOAD_64? Danke!

+0

Ich würde einen Verpackungsskript verwenden, die die Bitness der App überprüft und eine Bibliothek entsprechend – user3159253

+1

gesetzt Versuchen Sie nicht vollständigen Pfad angeben. Der dynamische Linker wählt den richtigen, z. LD_PRELOAD = lib_init.so – kofemann

+0

@kofemann das war genau das was ich gesucht habe. Könnten Sie mir bitte eine Antwort geben, damit ich es genehmige? –

Antwort

5

Durch Angabe des vollständigen Pfads zur Bibliothek lässt der dynamische Linker seinen Suchpfad nicht gemäß der Binärarchitektur anpassen. Definieren Sie nur den Namen der Bibliothek und lassen Sie Linker die richtige Bibliothek für Sie auswählen. ZB:

$ LD_PRELOAD=lib_init.so ./hello32 

für lib_init.so in/lib suchen, während

$ LD_PRELOAD=lib_init.so ./hello64 

sucht in/lib64

2

Es stellt sich heraus, dass Sie verwenden $ LIB bei der Einstellung LD_PRELOAD einstellen (oder setzen Sie die Datei /etc/ld.so.preload). Das Problem ist, dass der Wert, auf den $ LIB gesetzt wird, von Ihrer Linux-Distribution abhängt. PFUI!

In meinen begrenzten Tests habe ich entdeckt, dass redhat-basierte Systeme $ LIB auf "lib64" für 64-Bit-Anwendungen erweitern und "lib" für 32-Bit-Anwendungen.

Allerdings habe ich auf Debian-basierten Distributionen festgestellt, dass $ LIB für 64-Bit-Anwendungen auf "lib/x86_64-linux-gnu" und für 32-Bit-Anwendungen auf "lib/i386-linux-gnu" erweitert wird. Ich habe keine Dokumentation gefunden, aber ich habe das getestet.

Das bedeutet, dass, wenn ich:

$ LD_PRELOAD='/$LIB/lib_init.so' ./hello64 

und auf einem Debian-basierten System wie Ubuntu ich habe:

/lib/x86_64-linux-gnu/lib_init.so (for 64bit apps) 

und

/lib/i386-linux-gnu/lib_init.so (for 32bit apps) 

Das wird gut funktionieren (auf ein Ubuntu-basierter Linux-Computer)

Ansonsten auf einer RedHat basierte Distribution müssen Sie

/lib64/lib_init.so and /lib/lib_init.so 

für 64 und 32-Bit-Anwendungen.

Die Verwendung von LD_PRELOAD = '/ $ LIB/lib_init.so' hat den Vorteil, dass Sie nicht von dem Wert von $ LD_LIBRARY_PATH abhängig sind.

Nur nicht vergessen, die einfachen Anführungszeichen, wenn in LD_PRELOAD $ LIB Einstellung

Verwandte Themen