【问题标题】:where is __aeabi_f2lz implemented?__aeabi_f2lz 在哪里实现?
【发布时间】:2017-03-23 22:59:52
【问题描述】:

我有一个依赖于我从第三方获得的静态库(libexample.a)的库。 我的构建在链接阶段失败,抱怨 __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 的独立 arm 工具链。

感谢您的帮助!

更新[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"

【问题讨论】:

  • 我实际上没有看到该命令中链接了任何对象。我期待看到类似clang++ -lgcc -lmylib 的东西,其中 mylib 是一个静态库。如果是这样的话,libgcc 将在 mylib 被链接之前被检查,这意味着它永远不会从 libgcc 中获取东西。您还可以将-v 添加到链接命令中,让clang 告诉您完整的链接器命令行,这对解决这类问题很有帮助。

标签: android-ndk linker clang


【解决方案1】:

它在 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

默认情况下这是链接的。您的链接顺序可能有问题。您能否更新您的答案以包含您用于链接库的命令?

【讨论】:

  • 我在问题中包含了该命令。我们使用黄金链接器并且 libgcc.a 从命令行中排除:-Wl,--exclude-libs=libgcc.a 不确定这是不是问题?
  • --exclude-libs 实际上并没有阻止它们被链接。它只是通过使它们成为本地而不是全球来防止符号被重新导出(是的,标志的可怕名称)。不过,它通常仍然是您想要的 libgcc。
猜你喜欢
  • 1970-01-01
  • 2012-04-13
  • 2019-10-14
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 2011-04-18
相关资源
最近更新 更多