.init_array
之前总是有一个间隙。这只是一个约定吗?我找不到任何相关参考。如果我的主程序加载了太多 SO,htop 会显示虚拟内存空间使用量显着增加。这似乎很有误导性,尽管我认为它对现实世界的影响为零,因为间隙只是虚拟的,不会被引用并因此分页到物理内存中?
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
❯ l -l libfoo.so
-rwxr-xr-x 1 root root 28936 Apr 17 18:48 libfoo.so*