ELF文件之二——使用链接脚本

Posted yanhc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELF文件之二——使用链接脚本相关的知识,希望对你有一定的参考价值。

main.c

技术图片
int main()
{
    return 0;
}
View Code

编译: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) }
}
View Code

输出的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

ELF文件之六——使用链接脚本-2个函数-data-bss-temp

使用链接描述文件制作 ELF 文件,在节之间没有零初始化块

Linux内存从0到1学习笔记(七,用户空间虚拟内存之二 - 内存空间的建立)

链接脚本和可执行文件