2017-12-02 8 views
1

古代のソフトウェア(1999年のUnreal Tournament "Classic"、UT99とも呼ばれます)を使用したいと思います。ダイナミックライブラリlibtxc_dxtn.soが暗黙的に読み込まれ、オプションのS3テクスチャ圧縮(S3TC)がサポートされています。残念ながら、ライブラリをロードすると、メインアプリケーションがセグメンテーションフォルトでクラッシュします(クラッシュもhereと記載されています)。回避策は、libtxc_dxtn.soを削除または移動してMesaのテクスチャ圧縮ライブラリを削除することです。アプリケーションはテクスチャ圧縮なしで完璧に正常に動作しますが、テクスチャ圧縮のサポートを必要とするその他のアプリケーションは現在壊れています。当然ながら、私は特定のアプリケーションに対して自分のシステムを変更したくありません。特定のダイナミックライブラリがロードされないようにする方法

私の質問は次のとおりです。
特定のアプリケーションによって特定のダイナミックライブラリがロードされないように(「マスク」または「無効にする」ように)できますか?私はLD_PRELOADの反対のようなものを見つけることを願っています。

更新libtxc_dxtn.soは暗黙的と間接的ロードされています。アプリケーションのバイナリを変更することは不可能です。

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] 
+0

_indirectly loaded_とはどういう意味ですか? 'dlopen()'?可能であれば、おそらく、libtxc_dxtn.soを通さない 'dlopen()'オーバーライドを 'LD_PRELOAD'することができます。 – PSkocik

+0

はい、 'dlopen()'が使用されています。 「間接的にロードされる」とは、「ライブラリはアプリケーション自体によって読み込まれるのではなく、アプリケーションによってロードされる共有ライブラリによって読み込まれる」という意味です。私の場合、 'application'→' libSDL-1.1.so.0'→ 'libGL.so.1'→' i965_dri.so'→ 'libtxc_dxtn.so'です。最初のライブラリのみが依存関係としてロードされ、他のライブラリは 'dlopen()'によってロードされます。 – Hermann

+0

'dlopen'オーバーライドアプローチの' LD_PRELOAD'が有効です(依存ライブラリが 'RTLD_LOCAL'を使用していない限り、これは廃止された非標準フラグです。私は私の答えを更新しました。 – PSkocik

答えて

2

あなたが実行からDSOの依存関係を削除できるようにする必要がありと呼ばれるユーティリティがあります。ここで

がダミー実行ファイルから libpthread依存関係を削除する例を示します

echo 'int main(){}' | 
    gcc -x c - -Wl,--no-as-needed -lpthread && 
    ldd a.out && 
    patchelf --remove-needed libpthread.so.0 a.out && 
    echo ====== && 
    ldd a.out 

マイ出力:

linux-vdso.so.1 => (0x00007ffeced67000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f21560f1000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2155d28000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f215630f000) 
====== 
    linux-vdso.so.1 => (0x00007fffac536000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6235c0d000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6235fd6000) 

更新:

libtxc_dxtn.so場合はdlopenがロードされています(LD_PRELOAD)をプリロードすることができ、dlopenオーバーライドは、NULLを返します。 のファイル名の引数が"libtxc_dxtn.so"ltraceなど)であれば、実際のファイル名の引数を確認してください。次のようなもの:

#define _GNU_SOURCE 
#include <dlfcn.h> 
#include <string.h> 

void *dlopen(char const *Fnm, int Flg) 
{ 
    void *(*real_dlopen)(char const *, int); 
    *(void**)(&real_dlopen) = dlsym(RTLD_NEXT, "dlopen"); 
    if(0==strcmp("libtxc_dxtn.so", Fnm)){ 
     return NULL; 
    }else{ 
     return real_dlopen(Fnm, Flg); 
    } 

} 
+1

'Fnm'がNULLで、' real_dlopen'への呼び出しを中継するというチェックを追加しました。これは素晴らしい作品です。私はあなたの非常に詳細な答えに感謝します。 – Hermann

+0

レコードに関しては、https://stackoverflow.com/questions/6083337/overriding-malloc-using-the-preload-mechanismもこの点で有用でした。 – Hermann

関連する問題