资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

android如何编译出带符号表的.so库

android如何编译出带符号表的.so库

关于这个问题,其实编译器带-g就会有调试信息。这是gcc相关的。
默认其实android编译的就是带符号表的,只是在strip掉了。

创新互联致力于互联网品牌建设与网络营销,包括网站建设、成都网站建设、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10余年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。

例如下面的操作:
/$ find . | grep libext2_e2p.so
./obj/SHARED_LIBRARIES/libext2_e2p_intermediates/LINKED/libext2_e2p.so
./obj/lib/libext2_e2p.so
./symbols/system/lib64/libext2_e2p.so
./symbols/system/lib/libext2_e2p.so
./obj_arm/SHARED_LIBRARIES/libext2_e2p_intermediates/LINKED/libext2_e2p.so
./obj_arm/lib/libext2_e2p.so
./system/lib64/libext2_e2p.so
./system/lib/libext2_e2p.so
/$ ls -l ./obj/SHARED_LIBRARIES/libext2_e2p_intermediates/LINKED/libext2_e2p.so
-rwxrwxr-x 1 neil neil 109808 12月 19 21:20 ./obj/SHARED_LIBRARIES/libext2_e2p_intermediates/LINKED/libext2_e2p.so
/$ ls -l ./obj/lib/libext2_e2p.so
-rwxrwxr-x 1 neil neil 31448 12月 19 21:25 ./obj/lib/libext2_e2p.so
/$ ls -l ./symbols/system/lib64/libext2_e2p.so
-rwxrwxr-x 1 neil neil 109808 12月 19 21:24 ./symbols/system/lib64/libext2_e2p.so
/$ ls -l ./symbols/system/lib/libext2_e2p.so
-rwxrwxr-x 1 neil neil 86172 12月 19 21:20 ./symbols/system/lib/libext2_e2p.so
/$ ls -l ./system/lib64/libext2_e2p.so
-rwxrwxr-x 1 neil neil 31448 12月 19 21:27 ./system/lib64/libext2_e2p.so
/$ ls -l ./system/lib/libext2_e2p.so
-rwxrwxr-x 1 neil neil 22444 12月 19 21:25 ./system/lib/libext2_e2p.so

从上面可以看出,stip前和strip后,文件大小不同。
由于strip前后,elf文件的其他section段的内容没有变化,只是删除了symbol和debug的section,所以程序跑strip后的elf文件,调试时使用strip前有符号表的elf文件,不会出问题,因为他们的代码和数据部分相同。

/$ readelf -S ./system/lib/libext2_e2p.so
There are 21 section headers, starting at offset 0x5464:

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 00000134 000134 000013 00 A 0 0 1
[ 2] .dynsym DYNSYM 00000148 000148 0004b0 10 A 3 1 4
[ 3] .dynstr STRTAB 000005f8 0005f8 000381 00 A 0 0 1
[ 4] .hash HASH 0000097c 00097c 000240 04 A 2 0 4
[ 5] .rel.dyn REL 00000bbc 000bbc 0002e8 08 A 2 0 4
[ 6] .rel.plt REL 00000ea4 000ea4 000180 08 A 2 7 4
[ 7] .plt PROGBITS 00001024 001024 000254 00 AX 0 0 4
[ 8] .text PROGBITS 00001278 001278 001da0 00 AX 0 0 4
[ 9] .ARM.exidx ARM_EXIDX 00003018 003018 000108 08 AL 8 0 4
[10] .rodata PROGBITS 00003120 003120 000fb8 00 A 0 0 4
[11] .ARM.extab PROGBITS 000040d8 0040d8 00000c 00 A 0 0 4
[12] .fini_array FINI_ARRAY 00005e60 004e60 000004 00 WA 0 0 4
[13] .dynamic DYNAMIC 00005e64 004e64 0000c8 08 WA 3 0 4
[14] .got PROGBITS 00005f2c 004f2c 0000d4 00 WA 0 0 4
[15] .data PROGBITS 00006000 005000 000344 00 WA 0 0 4
[16] .bss NOBITS 00006344 005344 0001f0 00 WA 0 0 4
[17] .comment PROGBITS 00000000 005344 000010 01 MS 0 0 1
[18] .note.gnu.gold-ve NOTE 00000000 005354 00001c 00 0 0 4
[19] .ARM.attributes ARM_ATTRIBUTES 00000000 005370 000040 00 0 0 1
[20] .shstrtab STRTAB 00000000 0053b0 0000b4 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
/$ readelf -S ./symbols/system/lib/libext2_e2p.so
There are 31 section headers, starting at offset 0x14bc4:

可以看到上面的文件没有symbol的section

Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .interp PROGBITS 00000134 000134 000013 00 A 0 0 1
[ 2] .dynsym DYNSYM 00000148 000148 0004b0 10 A 3 1 4
[ 3] .dynstr STRTAB 000005f8 0005f8 000381 00 A 0 0 1
[ 4] .hash HASH 0000097c 00097c 000240 04 A 2 0 4
[ 5] .rel.dyn REL 00000bbc 000bbc 0002e8 08 A 2 0 4
[ 6] .rel.plt REL 00000ea4 000ea4 000180 08 A 2 0 4
[ 7] .plt PROGBITS 00001024 001024 000254 00 AX 0 0 4
[ 8] .text PROGBITS 00001278 001278 001da0 00 AX 0 0 4
[ 9] .ARM.exidx ARM_EXIDX 00003018 003018 000108 08 AL 8 0 4
[10] .rodata PROGBITS 00003120 003120 000fb8 00 A 0 0 4
[11] .ARM.extab PROGBITS 000040d8 0040d8 00000c 00 A 0 0 4
[12] .fini_array FINI_ARRAY 00005e60 004e60 000004 00 WA 0 0 4
[13] .dynamic DYNAMIC 00005e64 004e64 0000c8 08 WA 3 0 4
[14] .got PROGBITS 00005f2c 004f2c 0000d4 00 WA 0 0 4
[15] .data PROGBITS 00006000 005000 000344 00 WA 0 0 4
[16] .bss NOBITS 00006344 005344 0001f0 00 WA 0 0 4
[17] .comment PROGBITS 00000000 005344 000010 01 MS 0 0 1
[18] .debug_info PROGBITS 00000000 005354 005b3f 00 0 0 1
[19] .debug_abbrev PROGBITS 00000000 00ae93 001daf 00 0 0 1
[20] .debug_loc PROGBITS 00000000 00cc42 002d90 00 0 0 1
[21] .debug_aranges PROGBITS 00000000 00f9d2 0002e8 00 0 0 1
[22] .debug_ranges PROGBITS 00000000 00fcba 000438 00 0 0 1
[23] .debug_line PROGBITS 00000000 0100f2 001aa6 00 0 0 1
[24] .debug_str PROGBITS 00000000 011b98 001432 01 MS 0 0 1
[25] .debug_frame PROGBITS 00000000 012fcc 000514 00 0 0 4
[26] .note.gnu.gold-ve NOTE 00000000 0134e0 00001c 00 0 0 4
[27] .ARM.attributes ARM_ATTRIBUTES 00000000 0134fc 000040 00 0 0 1
[28] .symtab SYMTAB 00000000 01353c 001030 10 29 185 4
[29] .strtab STRTAB 00000000 01456c 00052e 00 0 0 1
[30] .shstrtab STRTAB 00000000 014a9a 00012a 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings)
I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
O (extra OS processing required) o (OS specific), p (processor specific)
/$

可以看到上面的文件有symbol的section

可以看到,symbol/system目录的.so库文件大小比system目录的大。因为含有符号表。

关于ELF文件的介绍和linux中的加载原理和实现,欢迎观看我的视频:
https://edu.51cto.com/course/17147.html

关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

我的新的更多优惠的打包课程链接如下:
https://edu.51cto.com/sd/0a9d4


新闻名称:android如何编译出带符号表的.so库
链接URL:http://www.cdkjz.cn/article/jogsij.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220