如何判断Android .so编译的运行时?

时间:2017-11-24 15:59:43

标签: android android-ndk runtime android-stlport

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

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

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

1 个答案:

答案 0 :(得分:1)

像亚历克斯所说,你可以使用readelf找出其中的一部分。以下内容可以让您知道库是否依赖于共享STL,以及哪一个:

SharedModule

如您所见,此库依赖于libc ++ _ shared。忽略libstdc ++。这样你也看到了。那是https://github.com/android-ndk/ndk/issues/105

如果它依赖于静态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 ++或非libc ++构建的。所有libc ++符号都在内部命名空间(-fvisibility=hidden而不仅仅是std::__ndk1)中,以支持对STL进行版本控制并避免与系统STL发生冲突。如果它是一个非常古老的(r10或更旧的)libc ++,它将只是std

__1

如果您正在尝试确定使用哪个版本的NDK构建库,则可以使用https://android.googlesource.com/platform/ndk/+/master/parse_elfnote.py

$ 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构建的库(r14?我不记得何时添加此内容)。