次のコードで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出力奇妙です。
ありがとうございました。私はファイルの逆コンパイルとファイルを別の方法で抽出終了 – rolls