指定入口地址链接32位ELF文件出现的未知程序头含义咨询
其余程序头的具体含义如下:
- 第一个LOAD段(虚拟地址0x08048000):承载了
.note.gnu.property段的内容,存储GNU工具链生成的程序属性信息,包括程序适配的ABI版本、支持的CPU特性等。你只通过-Ttext指定了.text段的加载地址,其余未指定地址的可加载段ld会默认使用x86 32位程序的默认基址0x08048000。 - 第三个LOAD段(虚拟地址0xc0002000):承载了
.eh_frame段的内容,是gcc默认生成的异常处理栈展开信息,即使你的程序没有用到异常机制,该信息也会被默认生成,可用于调试时的栈回溯场景。 - 第四个LOAD段(虚拟地址0xc0004000):承载了
.got.plt段的内容,也就是全局偏移表的过程链接表部分,哪怕程序没有外部动态依赖,ld默认也会生成最小化的该段预留动态链接能力,无动态链接需求的场景下该段无效。 - NOTE段:属于ELF标准定义的标注类程序头,指向第一个LOAD段里的
.note.gnu.property段,告诉加载器该区域存储的是系统/架构相关的标注信息,仅需只读加载。 - GNU_PROPERTY段:GNU扩展的程序头类型,专门用于解析
.note.gnu.property中的属性信息,Linux内核加载ELF时会读取该段校验程序运行要求是否满足。 - GNU_STACK段:GNU扩展的栈权限标记段,不占用实际的文件存储空间,仅用于标记程序运行时栈的访问权限,此处的
RW标记说明默认栈是可读写、不可执行的安全配置。
可选操作:去除多余段的方法
如果不需要这些额外段,可以在编译时添加参数关闭默认生成:
gcc -m32 -c -o main.o main.c -fno-asynchronous-unwind-tables -Qn -fno-pic
链接时添加参数关闭多余段生成:
ld main.o -melf_i386 -Ttext 0xc0001500 -e main -o main.bin --no-dynamic-linker --no-eh-frame-hdr
内容的提问来源于stack exchange,提问作者Zobin Huang
相关产品推荐
相关产品推荐

