2017-10-08 7 views
0

次のコードでSOファイルを動的にロードしようとしています。 SOファイルは、このSOライブラリのx86版とアーム版(モノラルC#dllでパックされたファイル)を含むapkから抽出されました。私のプログラムを実行するときにdlopenを使用してx86 android .soファイルを動的にロードすると、未定義シンボルのエラー

void * mono = dlopen("./libmonodroid_bundle_app.so", RTLD_LAZY); 
if(!mono){ 
    cerr << "Cannot Load Library. Error: " << dlerror() << '\n'; 
    return -1; 
} 

私は、まず、次のエラーを得た:

Cannot Load Library. Error: /usr/lib/i386-linux-gnu/libc.so

これは私のlibc.soファイルはリンカスクリプトであることと、実際のSOファイルとしてそれを読み取ろうとしているためです。

手動でlibc.soをコピーすると、sudo cp /lib/i386-linux-gnu/ld-linux.so.2 libc.soが動作します。

Cannot Load Library Error: /libmonodroid_bundle.app.so undefined symbol: __sF

:。私はそのように

は、今私が最終的にdlopenを呼び出すときに、すべてのこれらのライブラリは、私は次のエラーを取得する持っているのlibstdC++も、私はどのliblog.soのx86バージョンを見つけなければなりませんでした未定義のシンボルですか? .soファイルを編集してIDA経由で削除することもできますが、正しく機能しない可能性があります。

ldd -r -v libmonodroid_bundle_app.so 
    linux-gate.so.1 => (0xb77fd000) 
    libc.so => /usr/lib/i386-linux-gnu/libc.so (0xb6de2000) 
    libm.so => /usr/lib/i386-linux-gnu/libm.so (0xb6d8c000) 
    libdl.so => /usr/lib/i386-linux-gnu/libdl.so (0xb6d85000) 
    liblog.so => /usr/lib/i386-linux-gnu/liblog.so (0xb6d83000) 
    libz.so => /usr/lib/i386-linux-gnu/libz.so (0xb6d66000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6bac000) 
    /lib/ld-linux.so.2 (0x80009000) 
undefined symbol: __sF (./libmonodroid_bundle_app.so) 

    Version information: 
    /usr/lib/i386-linux-gnu/libm.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libdl.so: 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
    /usr/lib/i386-linux-gnu/libz.so: 
     libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6 
     libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6 
    /lib/i386-linux-gnu/libc.so.6: 
     ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2 
     ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 

編集:ここではIDAからのexternテーブルであり、あなたが__sFがどの何を指していないことがわかりますが、私はそれが助け場合は、以下の呼び出ししようとしていますの.soファイルの

LDD出力奇妙です。

https://i.imgur.com/spI9Lu3.png

答えて

1

あなたがのglibcを使用していますGNU/Linuxシステム上で(Android用)バイオニックのlibcに対して、コンパイルされたバイナリを使用しようとしているようです。これらの2つのCライブラリは互換性がありません。

私はあなたが試みていることをすることは不可能だとは言わないが、あなたの目標を達成することは、いくつかのファイルをコピーするほど簡単ではない。 Bionic libc呼び出しをglibc呼び出し(または未処理のシステム呼び出し)に変換するカスタム動的リンカーとシムが必要です。

+0

ありがとうございました。私はファイルの逆コンパイルとファイルを別の方法で抽出終了 – rolls

関連する問題