[Linux]ELF中.eh_frame段的简单说明


最近在进行某个So文件的size优化,通过命令(readelf -t/objdump -h)发现.eh_frame段占了一定的空间,如下:
12 .rodata 0001a9f0 000de060 000de060 000de060 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 .eh_frame_hdr 00005914 000f8a50 000f8a50 000f8a50 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .eh_frame 0001b984 000fe364 000fe364 000fe364 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA

网上搜了一下,发现这个段主要用于系统运行时调试使用的,便于栈展开调试(跟-g选项不同,-g信息可以通过strip命令去掉)。

若要去掉此段信息,可以通过-fno-asynchronous-unwind-tables编译选项,但是可能无法完全去除,原因是编译使用的的其他.o可能未加此选项。

12 .rodata 0001a9f0 000de060 000de060 000de060 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
13 .eh_frame_hdr 00000034 000f8a50 000f8a50 000f8a50 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
14 .eh_frame 000000fc 000f8a84 000f8a84 000f8a84 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA

eh_frame_hdr保存着eh_frame的额外信息,包括指向eh_frame数据起始地址的指针以及a binary search table of pointers to the .eh_frame records are found in this section.

关于eh_frame_hdr信息:
https://refspecs.linuxfoundation.org/LSB_1.3.0/gLSB/gLSB/ehframehdr.html

相关信息来源:https://stackoverflow.com/questions/26300819/why-gcc-compiled-c-program-needs-eh-frame-section