GCC在共享对象.init_array前留虚拟内存间隙的原因及相关疑问
关于共享对象(SO)的两个内存与尺寸疑问
- 发现共享对象中
.init_array段前始终存在虚拟内存间隙,不确定这只是行业惯例还是有明确规范要求,暂未找到相关参考资料。当主程序加载大量SO时,htop显示的虚拟内存占用会明显上升,虽推测该间隙仅为虚拟地址空间,不会被实际页入物理内存、无实质性能影响,但这种显示方式存在误导性。 - 同时发现
size命令输出的总尺寸数值与文件实际磁盘占用不匹配,推测原因是size未计算段/节之间的填充空间。
复现示例
使用gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609测试,其他系统结果一致:
foo.c代码
#include <stdio.h> void foo(void) { puts("Hello, I am a shared library"); }
编译命令
gcc -c -Wall -Werror -fpic -g3 foo.c gcc -shared -o libfoo.so foo.o
查看SO文件的输出
size -A -d libfoo.so输出:
libfoo.so : section size addr .note.gnu.build-id 36 456 .gnu.hash 60 496 .dynsym 336 560 .dynstr 172 896 .gnu.version 28 1068 .gnu.version_r 32 1096 .rela.dyn 192 1128 .rela.plt 24 1320 .init 26 1344 .plt 32 1376 .plt.got 16 1408 .text 275 1424 .fini 9 1700 .rodata 29 1709 .eh_frame_hdr 28 1740 .eh_frame 100 1768 .init_array 8 2100736 .fini_array 8 2100744 .jcr 8 2100752 .dynamic 448 2100760 .got 40 2101208 .got.plt 32 2101248 .data 8 2101280 .bss 8 2101288 .comment 53 0 .debug_aranges 48 0 .debug_info 145 0 .debug_abbrev 69 0 .debug_line 424 0 .debug_str 15511 0 .debug_macro 4020 0 Total 22225
ls -l libfoo.so输出:
-rwxr-xr-x 1 root root 28936 Apr 17 18:48 libfoo.so*
内容的提问来源于stack exchange,提问作者Zack Light
相关产品推荐
相关产品推荐

