繁体   English   中英

我如何知道Android .so是在哪个运行时编译的?

[英]How can I tell which runtime an Android .so was compiled with?

我有一些预编译的so文件,所以谁知道用来生成它们的标志。 我很好奇,知道它们使用哪个STL的运行时/版本进行编译(gnustl_shared?stlport_shared?),以避免与我自己的代码发生冲突。

如何从已编译的so文件中找出它们被编译为使用哪个运行时?

这就是所有Android NDK C ++代码。

就像Alex所说的那样,您可以使用readelf找出其中的一些内容。 以下内容可以让您知道该库是否依赖于共享的STL,以及哪个依赖于该STL:

$ readelf -dW path/to/libfoo.so | grep NEEDED
 0x00000001 (NEEDED)                     Shared library: [libc++_shared.so]
 0x00000001 (NEEDED)                     Shared library: [libc.so]
 0x00000001 (NEEDED)                     Shared library: [libm.so]
 0x00000001 (NEEDED)                     Shared library: [libstdc++.so]
 0x00000001 (NEEDED)                     Shared library: [libdl.so]

如您所见,该库取决于libc ++ _ shared。 忽略libstdc ++。so,您也会看到。 那是https://github.com/android-ndk/ndk/issues/105

如果它依赖于静态STL(或者您的库是静态库),并且不是使用-fvisibility=hidden构建的,则该方法将不起作用。 在这种情况下,您仍然可以确定该库是针对libc ++还是针对非libc ++构建的。 所有libc ++符号都在内部命名空间( std::__ndk1而不是std )中,以支持对STL进行版本控制并避免与系统STL发生冲突。 如果它是一个非常老的(r10或更旧的)libc ++,它将只是__1

$ readelf -sW path/to/libfoo.so | grep __ndk1
     6: 000008bf    86 FUNC    WEAK   DEFAULT   12 _ZNSt6__ndk112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcj
     7: 000008a9    22 FUNC    WEAK   DEFAULT   12 _ZNSt6__ndk112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev

如果您要弄清楚使用哪个NDK版本的库,可以使用https://android.googlesource.com/platform/ndk/+/master/parse_elfnote.py

$ python parse_elfnote.py foo/libs/armeabi-v7a/libfoo.so 
----------ABI INFO----------
ABI_NOTETYPE: 1
ABI_VENDOR: Android
ABI_ANDROID_API: 14
ABI_NDK_VERSION: r17-canary
ABI_NDK_BUILD_NUMBER: dev

大多数信息仅适用于使用相对较新的NDK构建的库(r14?我不记得何时添加此库)。

NDK带有一个名为readelf的实用程序(在NDK / toolchains下)。 要查看预构建的二进制文件需要哪个共享STL库,可以运行

$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/*/bin/arm-linux-androideabi-readelf -a 3rd-party-lib.so | grep NEEDED | grep _shared

版本比较棘手。 STL共享二进制文件不包含版本信息,并且我不相信有一个过程可以测试它们的向后兼容性。 尽管如此,这两家公司至少已经稳定了两年。

通常,您可以确定用于构建二进制文件的编译器,但是不,NDK编译器并不总是在每个NDK版本中都进行更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM