深入探讨libc _shared.so与libstdc、libc之间的链接关系

问题点1:  -lstdc++ libc++_shared.so的关联;

当在makefile中引入-lstdc++时,其意味着调用动态库libstdc++.so,

Note动态库libstdc++.so 所对应的静态库是libstdc++.a;

Note:当前测试libstdc++.so来自于Android12的./prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/x86_64-linux/lib64文件夹

 使用指令objdump -x libstdc++.so |grep NEEDED看到其并没有直接引用libc++_shared.so

测试(测试工具链为android-ndk-r25b):

Case 1): 在自定义ABC.so的makefile中添加-lstdc++,即调用libstdc++.so,

compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其需链接

libc++_shared.so

Case 2): 在自定义ABC.so的makefile中通过-Xlinker "-(" -lstdc++ -Xlinker "-)"形式,即调用libstdc++.a, compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其同样需链接libc++_shared.so

小结:不论调用libstdc++.so 还是libstdc++.a,compile出的自定义so都需链接

libc++_shared.so(测试结果基于Android12);

 

问题点2-lc++ libc++_shared.so的关联;

当在makefile中引入-lc++时,其意味着调用动态库libc++.so,

Note动态库libc++.so 所对应的静态库是libc++_static.a;

libc++.so和libc++_static.a来自于Android12

其中libc++_static.a具体来自于./prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/文件夹下

测试(测试工具链为android-ndk-r25b):

Case 3): 在自定义ABC.so的makefile中添加-lc++,即调用libc++.so,

compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其需链接

libc++_shared.so

Case 4): 在自定义ABC.so的makefile中通过-Xlinker "-(" -lc++_static -Xlinker "-)"形式,即调用libc++_static.a, compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其不需链接libc++_shared.so

结论:以上4种测试case中,唯一不需链接libc++_shared.so的只有libc++_static.a

且在Android12 源码中,也能找到其为了避开libc++_shared.so而使用

libc++_static.a的例子;

’如:./package/modules/NetworkStack/Android.bp中,

 

物联沃分享整理
物联沃-IOTWORD物联网 » 深入探讨libc _shared.so与libstdc、libc之间的链接关系

发表回复