ELF文件之二——使用链接脚本
Posted yanhc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELF文件之二——使用链接脚本相关的知识,希望对你有一定的参考价值。
main.c
int main() { return 0; }
编译:sparc-elf-gcc.exe -c main.c -o main.o
链接:sparc-elf-ld.exe main.o -nostartfiles -script=linkerscript.ld -o main.elf
linkerscript.ld
SECTIONS { . = 0x08000000; .text : { *(.text) } . = 0x70000000; .data : { *(.data) } .bss : { *(.bss) } }
输出的main.elf文件
section header如下,
使用链接脚本后,text节大小与o文件一致,为20字节;
symtab有11个符号,相比o文件增加了3个,但比使用默认链接脚本少了很多(30个);
strtab大小与o文件一致
symbol table如下:
从最后一列可以看出该符号位于节头表的索引,
1为text,数值为0x08000000,为.text的地址,main函数位于text节,地址也为0x08000000(如果增加一个函数,其应该在另一个地址?)
2为.data,数值为0x70000000,为.data的地址
3为.bss,数值为0x70000000,为.bss的地址,由于没有data节,所以,.bss节的地址也为0x70000000
4、5、6、7节为辅助信息,不需要在内存中
ABS绝对地址包括main.c文件名和*ABS*(这个不知道是什么?)
program header
红色为入口点entry point,.text起始地址
程序头偏移为0x34,项目数量为2.
第一个项目偏移为0x74,大小为0x14=20字节,即main函数的长度,虚拟地址和物理地址都为0x0800 0000
第二个项目偏移为0x88,大小为0,即没有,因为没有data和bss节内容;虚拟地址和物理地址都为0x7000 0000(如果增加个全局变量应该就有东西了)
以上是关于ELF文件之二——使用链接脚本的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段
ELF文件之六——使用链接脚本-2个函数-data-bss-temp