即使在CMake中构建Release,也能在最终SO文件中获得调试符号
Getting debug symbols in final SO file even when building Release in CMake
我使用CMake(生成器是ninja(使用NDK工具链(g++4.9(构建共享库。以下是使用ninja构建库时在库中构建单个CPP文件的详细输出:
[34/164]/usr/local/bin/android-ndk/toolchains/arm-linux-androidabi-4.9/pre-builded/linu-x86_64/bin/arm-linux-Androidabi-g++-DANDROID-DBOOST_ALL_NO_LIB-fexceptions-frtti-fpic-Wno psabi-sysroot=/usr/local/biin/android-ndk/platforms/android-15/arch-arm-funwind tables-finline limit=64-fsigned char-无规范前缀-march=armv7-a-mfloat abi=softfp-mfpu=vfpv3-d16-fda ta截面-函数部分-Wa,--noexecstack-mthumb-fmit帧指针-fno严格混叠-O3-DNDEBUG-isystem/usr/local/bin/android-ndk/platforms/android-15/arch-arm/usr/include-isystem/usr/local/bin/android ndk/sources/cxx stl/gnu libstdc++/4.9/include-isystem/usr/local/bin/android ndk/sources/cx stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include-isystem/usr/local/bin/android-ndk/sources/cxx stl/gnu libstdc++/4.9/include/backward-I/usr/local/bin/android ndk/sources/android/cpufeatures-I/usr/local/bin/android ndk/sources/android/nature_app_glue-ICore/Artifacts/android-IApplications/Survey/Source-ICore/UI/-ICore/UI/Source-ICore/ThirdParty/PowerVR/sdk/Include-ICore/ThirdParty/Power VR/tools/Include-ICore/ThirdParty/PowerVR/tools/Include/OGLES2-ICore/TirdParty/boost/Include-ICore/ThirdParty/openssl/Include-ICore/ThirdParty/sqlite/Include-ICore/WebServices/Source-std=gnu++14-MMD-MT Applications/Survey/CMakeFiles/Resurve.dir/Source/View/Radio-MFApplications/Survey/CMakeFiles/Seurve.dir/Source/View/RadioGroup.cpp.o-d-o Applications/Survey/CMakeFiles/Surve.dir/Source/VView/RadioGroup.cpp.o-c Applications/Survy/Source/View/RradioGroup.cpp
请注意,我在生成时指定了-DCMAKE_BUILD_TYPE=Release
。
命令行调用中不存在-g
选项,但是最终的二进制文件是19MB:
-rwxrwxr-x 1 bamboo bamboo 19173588 Jul 15 10:30 libzApp.so*
我在上面运行了size
,以确定是什么让它如此巨大,但我得到了这个:
$ size libzApp.so
text data bss dec hex filename
7097019 201268 53488 7351775 702ddf libzApp.so
这只占700亿的数据。所以我运行了这个:
$ objdump --debugging libzApp.so | head -25
libzApp.so: file format elf32-little
Contents of the .debug_abbrev section:
Number TAG (0x0)
1 DW_TAG_compile_unit [has children]
DW_AT_producer DW_FORM_strp
DW_AT_language DW_FORM_data1
DW_AT_name DW_FORM_strp
DW_AT_comp_dir DW_FORM_strp
DW_AT_low_pc DW_FORM_addr
DW_AT_entry_pc DW_FORM_addr
DW_AT_ranges DW_FORM_data4
DW_AT_stmt_list DW_FORM_data4
DW_AT value: 0 DW_FORM value: 0
2 DW_TAG_typedef [no children]
DW_AT_name DW_FORM_strp
DW_AT_decl_file DW_FORM_data1
DW_AT_decl_line DW_FORM_data1
DW_AT_type DW_FORM_ref4
DW_AT value: 0 DW_FORM value: 0
3 DW_TAG_base_type [no children]
DW_AT_byte_size DW_FORM_data1
DW_AT_encoding DW_FORM_data1
我认为这在很大程度上证实了它有调试符号。有人能帮我理解.so为什么这么大吗?假设这是因为调试符号,那么命令行调用会导致这种情况吗?
编辑
正如注释部分所建议的,在SO文件上运行strip
肯定会将其大小降低到预期值(基本上是我们从size
命令的结果中看到的(。然而,当我特别告诉GCC不要构建调试符号时,为什么要将调试符号构建到共享对象中?我是不是遗漏了什么?
我可以建议您使用strip
来删除调试信息,例如:
strip libzApp.so
这样做还不错,因为例如,Qt的构建系统qmake
总是在生成的Makefile的install
目标中这样做。
默认情况下,编译器总是将重新定位信息和符号表添加到二进制文件中。它还添加了许多其他信息,这些信息可能会被删除(请参阅下面答案上的链接(。
您也可以对编译器使用-s
参数:
g++ -s ...
根据文件:
-s:
Remove all symbol table and relocation information from the executable.
此标志应与strip
完全相同。关于stackoverflow,这里也有一些类似的答案。
- 如何使用ndk-build.cmd构建Android.so文件
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 如何从构建 libgpio.so 的生成文件构建libgpio.a
- 用于构建 cuda .so 文件(共享库)的生成文件
- 无法从 SO 文件调用 SO 文件的函数 - C++生成文件
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 C++ 的 .so 文件中包含库
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- Google Colab 看不到 .so 文件
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 如何在 Linux 中从 .so 文件打开可执行文件?
- 如何在makefile中包含tensorflow c ++".so"文件?
- 缺少 .h 文件,尽管从库文件夹链接了 .so 文件
- 如何在 CMake 超级生成中查找 dll/so 文件
- 如何用.so文件linux打包所有需要的库
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- 如何使用 gnu c++ 程序获取共享对象文件(.so 文件)的体系结构
- EMF文件(.so)调试,符号找不到VTable错误
- 如何将c++库作为共享对象文件(.so)加载到Python中?