可执行文件编译过程
文章平均质量分 62
可执行文件编译过程
黯止依蓝
这个作者很懒,什么都没留下…
展开
-
关于elf文件load段上内存映射
那么我们我们会发现,y round之后是11000,那么,偏移就是x.size%1000,也就是offset往回走,我们load y的时候多load了x某部分,这部分大小是x.size%1000,然后我们load大小也加了这个大小,最后结果就是再地址11000,load了大小为x.size%1000+y.size的文件。那么mmap之后,就会在11000+g+1000这个位置开始映射,然后把距离文件开始位置为0的remaining_bss字节映射,内容全部映射为0(匿名映射,映射为0)原创 2024-03-12 18:49:13 · 904 阅读 · 0 评论 -
(4)可执行文件
program-headers我们会发现有多类型的段,只有load的会上内存,vitraddr说的是虚拟地址的起始位置,align是对齐方式。这时候我们看最终的可执行文件会发现这个位置是main。也就是说连接器自动帮我们把入口识别为main。我们把.o文件链接起来得到可执行文件,然后一开始没有指定函数执行入口,连接器显示如下。头文件,会发现这时候已经有了program的内容,这是用来构建上内存的部分。所以我们重新用-e main来指定连接器入口为main,再看看。然后我们看看section。原创 2024-03-11 15:41:10 · 326 阅读 · 0 评论 -
(2).S文件
假设sp一开始在32,会得到上面的代码结构可以看到c,b,局部变量存储在栈上为001,然后把a从全局存的段加载,c也放到寄存器,然后进行函数调用,没理解为什么栈上有地方空着。主要是这里,可以看到调用函数之前,是先把局部变量放在了内存上面,然后,在调用函数之前,是把全局变量a和栈上的变量放在了寄存器里,然后我们看add函数汇编。这边是把a0,a1放进栈,然后又加载回来,其实就是没变,然后执行相加操作。clang编译的riscv32 .s文件如下。我们主要看和源代码的联系。原创 2024-03-08 10:38:19 · 350 阅读 · 0 评论 -
(1)预处理
不论是标准库的头文件,还是我们自己写的头文件,预处理器处理它们的方式是相同的。指令,将包含的头文件内容插入到包含指令的位置。这里不区分标准库头文件和自定义头文件,预处理器根据指定的搜索路径查找头文件,并将头文件内容插入到源文件中。简而言之,不论头文件的来源如何,预处理器的处理方式是一致的,都是将头文件内容插入到源文件中,然后继续进行宏展开、条件编译处理等操作。这里使用riscv的工具链编译为.i文件,需要使用-E,就是只进行预处理,我们可以得到两个.i文件即main.i和add.i。:将代码中的注释移除。原创 2024-03-04 17:09:07 · 475 阅读 · 0 评论 -
(3).o文件
是 RISC-V 架构的 ELF 文件中的一个特殊节,用于存储与 RISC-V 架构相关的特定属性信息。在 ELF 文件中,很多地方都会引用字符串,比如节的名称、符号的名称等等,这些字符串都被存储在。节中的条目提供了符号的名称、类型、绑定信息以及符号在文件中的地址或者与之关联的节的索引等信息。中,记录了需要进行重定位的位置和需要进行的重定位操作,例如修改代码中的某个地址,使其指向正确的数据或函数。节是 ELF 文件中的符号表节,用于存储程序的全局符号信息。节)中的地址,以便正确地引用其他部分的数据或代码。原创 2024-03-11 11:25:25 · 1027 阅读 · 0 评论 -
Executable and Linkable Format(ELF)
如果e_ident[EI_OSABI] == 3,则glibc 2.12+将该字段视为动态链接器的ABI版本:它定义了动态链接器功能的列表,将e_ident[EI_ABIVERSION]视为共享对象(可执行文件或动态库)所请求的功能级别,并且如果请求了未知功能,则拒绝加载它,即e_ident[EI_ABIVERSION]大于已知功能的最大值。0x7FFFFFFF PT_HIPROC PT_LOOS到PT_HIOS(PT_LOPROC到PT_HIPROC)是保留范围,用于操作系统(处理器)特定的语义。原创 2024-03-01 14:45:48 · 864 阅读 · 0 评论 -
elf文件执行
一个简单程序从编译、链接、装载(执行)的过程-预编译、编译 - 知乎 (zhihu.com)原创 2024-03-01 16:36:51 · 332 阅读 · 0 评论