2017-03-23 39 views
0

私は第三者から入手した静的ライブラリ(libexample.a)に依存するライブラリを持っています。 リンクステージで私のビルドが失敗しました__aeabi_f2lzについての不平は不定です。私は静的なlibをチェックし、定義されていないシンボル__aeabi_f2lzを持っています。リンク中にこのシンボルが解決されると思います。また__aeabi_f2lzはどこに実装されていますか?

、私は自分のライブラリにこのようなコードを追加した場合:

volatile float fixme_float = 1.3f; 
volatile int64_t fixme_int64 = static_cast<int64_t>(fixme_float); 

リンクエラーが消えます。私は上記のコードが__aeabi_f2lzの使用を余儀なくされ、不思議にリンクエラーを解決したと思います。私はこれがちょうどリンクオーダーの問題だと思う。

どのライブラリに__aeabi_f2lzの実装が含まれているか知っていますか?私は問題を解決できるかどうかを見るために静的ライブラリをリンクした後、ライブラリに依存関係を強制したい。それとも、私はこれが注文を結びつけるためだと主張する権利さえあるのでしょうか? Android NDKのスタンドアロンアームツールチェーンを使用しています。

ありがとうございました!

アップデート[1]: ビルドコマンドは次のとおりです。

third_party/llvm-build/Release+Asserts/bin/clang++ -shared -Wl,--fatal-warnings \ 
    -fPIC -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro -Wl,-z,defs -Wl,--as-needed \ 
    --gcc-toolchain=third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 \ 
    -fuse-ld=gold -Wl,--icf=all -Wl,--no-undefined -Wl,--exclude-libs=libgcc.a \ 
    -Wl,--exclude-libs=libc++_static.a -Wl,--exclude-libs=libvpx_assembly_arm.a \ 
    --target=arm-linux-androideabi -Werror -nostdlib \ 
    --sysroot=.third_party/android_tools/ndk/platforms/android-16/arch-arm \ 
    -Wl,-wrap,calloc -Wl,-wrap,free -Wl,-wrap,malloc -Wl,-wrap,memalign \ 
    -Wl,-wrap,posix_memalign -Wl,-wrap,pvalloc -Wl,-wrap,realloc -Wl,-wrap,valloc \ 
    -Lthird_party/android_tools/ndk/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \ 
    -o "./lib.unstripped/libexample.so" -Wl,-soname="libexample.so" 
+0

実際には、そのコマンドでリンクされているオブジェクトは表示されません。私は 'clang ++ -lgcc -lmylib'のようなものを見ることを期待しています。ここでmylibは静的ライブラリです。もしそうなら、libgccはmylibがリンクされる前にチェックされます。つまり、libgccから決して選択されません。 '-v'をリンクコマンドに追加することで、clangに完全なリンカーコマンドラインを教えることができます。これは、この種の問題に役立ちます。 –

答えて

0

それはlibgccの中にあります:

$ readelf -sW $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a | grep __aeabi_f2lz 
    24: 00000000 56 FUNC GLOBAL DEFAULT 1 __aeabi_f2lz 

これは、しかし、デフォルトでリンクされています。リンクオーダーに何か問題がある可能性があります。ライブラリをリンクするために使用しているコマンドを含めるように答えを更新できますか?

+0

私は私の質問にコマンドを含めました。私たちはゴールドリンカーを使用し、libgcc.aはコマンドラインから除外されています:-Wl、 - exclude-libs = libgcc.aこれが問題なのかどうか分かりませんか? – Aaron

+0

'--exclude-libs'は実際にリンクされないようにしません。 GLOBALではなく、LOCALにしてシンボルを再エクスポートすることを防ぎます(フラグのためにひどい名前)。これはまだ一般的にあなたがlibgccで望むものです。 –

関連する問題