我有一些预编译的so文件,所以谁知道用它们生成了什么标志。我很想知道他们编译的STL的运行时/版本(gnustl_shared?stlport_shared?),以避免与我自己的代码发生冲突。
如何从已编译的so文件中找出它们被编译为使用哪个运行时?
这是所有Android NDK C ++代码。
答案 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?我不记得何时添加此内容)。