Linux下查看.so和可执行文件是否debug编译的方法(必看)
今天同事问我,如何判断一个.so是否是debug编译的。
我记得以前自己是用file来查看一个.so,根据是否包含"notstripped"来判断该.so是否是debug编译的,于是就没做实验就回答。
然而,stripped/notstripped并不是debug/release编译的判断标准.我对debug和release的.so运行file后,得出几乎相同的输出,都是notstripped.所以我算是误导同事了。
根据
我在Ubuntu11.04上分别对同一个开源软件进行debug和release编译,并且查看某个.so的段(readelf-S),发现release编译的只有29个段:
Thereare29sectionheaders,startingatoffset0x1b7d78: SectionHeaders: [Nr]NameTypeAddressOffset SizeEntSizeFlagsLinkInfoAlign [0]NULL000000000000000000000000 00000000000000000000000000000000000 [1].note.gnu.build-iNOTE00000000000001c8000001c8 00000000000000240000000000000000A004 [2].gnu.hashGNU_HASH00000000000001f0000001f0 00000000000034300000000000000000A308 [3].dynsymDYNSYM000000000000362000003620 000000000000b4000000000000000018A428 [4].dynstrSTRTAB000000000000ea200000ea20 00000000000083e20000000000000000A001 [5].gnu.versionVERSYM0000000000016e0200016e02 0000000000000f000000000000000002A302 [6].gnu.version_rVERNEED0000000000017d0800017d08 00000000000000800000000000000000A428 [7].rela.dynRELA0000000000017d8800017d88 00000000000095700000000000000018A308 [8].rela.pltRELA00000000000212f8000212f8 00000000000080d00000000000000018A3108 [9].initPROGBITS00000000000293c8000293c8 00000000000000180000000000000000AX004 [10].pltPROGBITS00000000000293e0000293e0 00000000000055f00000000000000010AX004 [11].textPROGBITS000000000002e9d00002e9d0 00000000001446580000000000000000AX0016 [12].finiPROGBITS000000000017302800173028 000000000000000e0000000000000000AX004 [13].rodataPROGBITS000000000017304000173040 000000000001e9a00000000000000000A0032 [14].eh_frame_hdrPROGBITS00000000001919e0001919e0 000000000000427c0000000000000000A004 [15].eh_framePROGBITS0000000000195c6000195c60 0000000000017d7c0000000000000000A008 [16].ctorsPROGBITS00000000003ae1e8001ae1e8 00000000000000100000000000000000WA008 [17].dtorsPROGBITS00000000003ae1f8001ae1f8 00000000000000100000000000000000WA008 [18].jcrPROGBITS00000000003ae208001ae208 00000000000000080000000000000000WA008 [19].data.rel.roPROGBITS00000000003ae220001ae220 0000000000005b380000000000000000WA0032 [20].dynamicDYNAMIC00000000003b3d58001b3d58 00000000000001a00000000000000010WA408 [21].gotPROGBITS00000000003b3ef8001b3ef8 00000000000010e80000000000000008WA008 [22].got.pltPROGBITS00000000003b4fe8001b4fe8 0000000000002b080000000000000008WA008 [23].dataPROGBITS00000000003b7b00001b7b00 00000000000001580000000000000000WA0032 [24].bssNOBITS00000000003b7c58001b7c58 00000000000000100000000000000000WA008 [25].commentPROGBITS0000000000000000001b7c58 000000000000002a0000000000000001MS001 [26].shstrtabSTRTAB0000000000000000001b7c82 00000000000000f50000000000000000001 [27].symtabSYMTAB0000000000000000001b84b8 000000000000fdb00000000000000018287888 [28].strtabSTRTAB0000000000000000001c8268 000000000000b8b00000000000000000001 KeytoFlags: W(write),A(alloc),X(execute),M(merge),S(strings),l(large) I(info),L(linkorder),G(group),T(TLS),E(exclude),x(unknown) O(extraOSprocessingrequired)o(OSspecific),p(processorspecific)
而debug编译的则有38个段,且所有比release编译多出来的段,都是以.debug_作为开始字符串来命名的:
Thereare38sectionheaders,startingatoffset0xdacc00: SectionHeaders: [Nr]NameTypeAddressOffset SizeEntSizeFlagsLinkInfoAlign [0]NULL000000000000000000000000 00000000000000000000000000000000000 [1].note.gnu.build-iNOTE00000000000001c8000001c8 00000000000000240000000000000000A004 [2].gnu.hashGNU_HASH00000000000001f0000001f0 00000000000036200000000000000000A308 [3].dynsymDYNSYM000000000000381000003810 000000000000c0000000000000000018A428 [4].dynstrSTRTAB000000000000f8100000f810 0000000000008ccb0000000000000000A001 [5].gnu.versionVERSYM00000000000184dc000184dc 00000000000010000000000000000002A302 [6].gnu.version_rVERNEED00000000000194e0000194e0 00000000000000700000000000000000A428 [7].rela.dynRELA000000000001955000019550 0000000000009b400000000000000018A308 [8].rela.pltRELA000000000002309000023090 00000000000083880000000000000018A3108 [9].initPROGBITS000000000002b4180002b418 00000000000000180000000000000000AX004 [10].pltPROGBITS000000000002b4300002b430 00000000000057c00000000000000010AX004 [11].textPROGBITS0000000000030bf000030bf0 00000000001d24280000000000000000AX0016 [12].finiPROGBITS000000000020301800203018 000000000000000e0000000000000000AX004 [13].rodataPROGBITS000000000020304000203040 00000000000276b80000000000000000A0032 [14].eh_frame_hdrPROGBITS000000000022a6f80022a6f8 00000000000059dc0000000000000000A004 [15].eh_framePROGBITS00000000002300d8002300d8 000000000001715c0000000000000000A008 [16].ctorsPROGBITS000000000044801800248018 00000000000000100000000000000000WA008 [17].dtorsPROGBITS000000000044802800248028 00000000000000100000000000000000WA008 [18].jcrPROGBITS000000000044803800248038 00000000000000080000000000000000WA008 [19].data.rel.roPROGBITS000000000044804000248040 0000000000005b380000000000000000WA0032 [20].dynamicDYNAMIC000000000044db780024db78 00000000000001a00000000000000010WA408 [21].gotPROGBITS000000000044dd180024dd18 00000000000012d00000000000000008WA008 [22].got.pltPROGBITS000000000044efe80024efe8 0000000000002bf00000000000000008WA008 [23].dataPROGBITS0000000000451be000251be0 00000000000001600000000000000000WA0032 [24].bssNOBITS0000000000451d4000251d40 00000000000000400000000000000000WA0016 [25].commentPROGBITS000000000000000000251d40 00000000000000540000000000000001MS001 [26].debug_arangesPROGBITS000000000000000000251d94 00000000000030c00000000000000000001 [27].debug_pubnamesPROGBITS000000000000000000254e54 000000000000b8cb0000000000000000001 [28].debug_infoPROGBITS00000000000000000026071f 000000000097f69b0000000000000000001 [29].debug_abbrevPROGBITS000000000000000000bdfdba 00000000000282110000000000000000001 [30].debug_linePROGBITS000000000000000000c07fcb 0000000000075fbf0000000000000000001 [31].debug_strPROGBITS000000000000000000c7df8a 00000000000197890000000000000001MS001 [32].debug_locPROGBITS000000000000000000c97713 00000000000435280000000000000000001 [33].debug_pubtypesPROGBITS000000000000000000cdac3b 00000000000d1c970000000000000000001 [34].debug_rangesPROGBITS000000000000000000dac8d2 00000000000001c00000000000000000001 [35].shstrtabSTRTAB000000000000000000daca92 000000000000016e0000000000000000001 [36].symtabSYMTAB000000000000000000dad580 000000000001468800000000000000183714378 [37].strtabSTRTAB000000000000000000dc1c08 000000000000e5a10000000000000000001 KeytoFlags: W(write),A(alloc),X(execute),M(merge),S(strings),l(large) I(info),L(linkorder),G(group),T(TLS),E(exclude),x(unknown) O(extraOSprocessingrequired)o(OSspecific),p(processorspecific)
对于可执行文件也有类似的区别。
所以这应当是判断debug/release的一个比较正确的方法了。
===================================
命令
readelf-Slibxxx.so|grepdebug
以上这篇Linux下查看.so和可执行文件是否debug编译的方法(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。