Ich möchte eine alte Software verwenden (Unreal Tournament "Classic" von 1999, auch bekannt als UT99). Die dynamische Bibliothek libtxc_dxtn.so
wird implizit geladen und sucht nach der Unterstützung für die S3-Texturkomprimierung (S3TC). Leider stürzt die Hauptanwendung beim Laden der Bibliothek mit einem Segmentierungsfehler ab (Crash auch beschrieben here). Eine Problemumgehung scheint das Entfernen der Texturkomprimierungsbibliothek für Mesa durch Löschen oder Verschieben von libtxc_dxtn.so
. Die Anwendung läuft perfekt ohne Texturkomprimierung, aber natürlich sind andere Anwendungen, die die Unterstützung der Texturkomprimierung verlangen, jetzt defekt. Natürlich möchte ich mein System nicht für eine bestimmte Anwendung ändern.So verhindern Sie, dass eine bestimmte dynamische Bibliothek geladen wird
Also meine Frage ist:
Kann ich verhindern (wie in "Maske" oder "deaktivieren") eine bestimmte dynamische Bibliothek von einer bestimmten Anwendung geladen werden? Ich hoffe, etwas wie das Gegenteil von LD_PRELOAD
zu finden.
aktualisieren: libtxc_dxtn.so
ist implizit und indirekt geladen. Das Ändern der Anwendungsbinärdatei ist nicht möglich.
initialize program: ut-bin
file=libSDL-1.1.so.0 [0]; needed by ut-bin [0]
file=libGL.so.1 [0]; dynamically loaded by libSDL-1.1.so.0 [0]
file=i965_dri.so [0]; dynamically loaded by libGL.so.1 [0]
file=libtxc_dxtn.so [0]; dynamically loaded by i965_dri.so [0]
Was meinst du _indirectly loaded_? 'dlopen()'? Wenn ja, könnten Sie vielleicht 'LD_PRELOAD' eine' dlopen() 'überschreiben, die' libtxc_dxtn.so' nicht durchschaltet. – PSkocik
Ja, 'dlopen()' wird verwendet. Mit "indirekt geladen" meine ich, dass "die Bibliothek nicht von der Anwendung selbst geladen wird, sondern von einer gemeinsam genutzten Bibliothek, die wiederum von der Anwendung geladen wird". In meinem Fall ist es "Anwendung" → "libSDL-1.1.so.0" → "libGL.so.1" → "i965_dri.so" → "libtxc_dxtn.so". Nur die erste Bibliothek wird als Abhängigkeit geladen, die anderen werden mit 'dlopen()' geladen. – Hermann
Der 'LD_PRELOAD' eines' dlopen' Override-Ansatzes sollte funktionieren (solange die abhängigen Bibliotheken nicht 'RTLD_LOCAL' verwenden, aber das ist ein veraltetes Nicht-Standard-Flag, das sowieso nicht verwendet werden sollte). Ich habe meine Antwort aktualisiert. – PSkocik