19-可执行文件:静态链接和加载 (Funny Little Executable; ELF 文件的静态加载) [南京大学2024操作系统]

作者: 绿导师原谅你了分类: 计算机技术 发布时间: 2024-05-07 18:45:57 浏览:8643 次

19-可执行文件:静态链接和加载 (Funny Little Executable; ELF 文件的静态加载) [南京大学2024操作系统]

凉城旧梦不老坟:
这些东西只要往下深入一点就可以进入安全的深坑了。 比如如果你有能力改掉这些结构体的一部分内容........

伐木:
记笔记~[脱单doge] 🖥️🔢📦🔧🔨✍️🔄 💾📂🔄➡️🧠🏃‍♂️🚀 🔗📁🔩🕒🔗🛠️🔗🏗️🔗📊

睡醒有呆毛:
PC寄存器是指向当前指令还是下一条指令?两种说法都有看到过[笑哭]

【回复】这你得看架构,arm 和 x86 是不同的。为什么不问问神奇的 ai 呢?百度或许都可以直接获取答案
【回复】过程大概是这样:pc到了某条指令->取出指令->pc 到下一条指令->执行指令。指令已经取出来了,pc没有道理停留在当前指令,这和cpu的流水线设计也有一定关系。当前指令在执行的时候下一条指令已经可以取入了。不管怎么说pc都不需要指向当前正在运行的指令
计算机科学研究员:
《年轻人的第一个可执行文件》 蒋老师会在课程里加入很多梗, 有时候会不会惋惜没有get到,哈哈哈。

Dubai终于有硬币改名了:
bilibiliAI视频总结: 可执行文件的概念和原理,以及静态链接的可执行文件的实现。可执行文件是一个操作系统对象,也是一个字节序列,可以用各种工具进行操作和编辑。可执行文件的初始状态由操作系统的ABI规定,包括内存和寄存器等信息。在操作系统中,可执行文件可以被加载到内存中运行。静态链接的可执行文件是在编译时将多个目标文件链接在一起形成的。

golden_pigeon:
我这里测试的时候(使用jyywiki上的代码)这个loader会直接段错误,经过调试发现(假设加载musl-demos/dummy程序)loader在第二轮循环的mmap的时候会把自己的代码段(从0x401000开始)覆盖掉,可能是这个原因导致程序无法继续执行了

【回复】回复 @小白围观 : 我找到解决办法了,应该给loader加个-fPIE和-pie的编译参数,这样才能生成位置无关的代码,我从wiki上下载的原始代码并没有加这个参数。加参数后loader就可以正确加载elf文件了。
【回复】回复 @小白围观 :回复 @小白围观 :我当时就看了mapping了的,执行mmap前400000开始的几段都是loader的映射,第一次mmap把400000到401000变成了dummy的映射,由于代码段没变,程序还能继续执行,第二次mmap,401000到402000变成了dummy的映射,而这个时候的rip正好是401xxx,代码段被覆盖,程序直接报段错误。你说的minimal我也试了,是一样的
【回复】回复 @golden_pigeon : gdb可以用info proc mappings看程序地址空间, 一般程序都是随机地址, 应该不会在0x401000; 所以我觉得不是覆盖地址的原因, 有可能你加载的程序是动态链接的程序, 你可以先用用老师的minimal尝试下有没有问题再排除原因。
杜宇a:
从来没有这么清楚的理解过,加载的过程,jyy yyds

AI视频小助理:
--本内容由第六组_ghy 大佬下凡召唤,热心市民@AI视频小助理闪现赶来 一、操作系统中可执行文件的概念和原理,包括静态链接的可执行文件的概念和实现,以及链接器和加载器的实现。 00:01 - 操作系统内核的实现就是对象加API 01:07 - 操作系统对象的访问包括进程管理、存储管理、文件等 01:47 - 可执行文件是操作系统中的对象,是一个字节序列,包含ELF格式的魔法头 二、操作系统中的可执行文件,包括其动态生成的信息和编译时确定的内容,以及如何使用工具查看和生成二进制文件。 08:20 - 环境变量是动态信息,程序每次运行参数不同。 09:31 - 程序执行时,地址空间中的数据已经提前被安排好,否则无法执行。 11:33 - 可执行文件定义了地址空间的状态,需要工具来查看。 三、可执行文件的数据结构和相关工具,并对比了ERF和A点out文件的不同。同时,作者也反思了教学中讲解可执行文件格式的难度和重要性。 16:41 - 可执行文件是描述状态机的一个数据结构 17:43 - 可执行文件的内容非常密集,手册注释版难以理解 22:04 - 早期的UNIX可执行文件没有现在那么复杂,只有几个字段 四、ELF文件格式的起源和设计,以及其在LINUX系统中的应用。ELF格式支持动态链接、调试信息、内存对齐等功能,旨在提供更好的可读性和兼容性。 25:01 - A点out被淘汰的原因是不支持动态链接和调试信息 27:06 - 支持的特性越多,对人类越不友好,需要兼顾性能 32:15 - 设计FRE格式时使用UNICODE emoji代码来表示代码和符号,方便人类理解 五、如何通过文本编辑器和二进制编辑器来查看和修改可执行文件,以及如何使用工具链来编译和链接目标文件。 33:20 - 可执行文件的静态链接和加载 35:52 - 实现完整的Binary utilities工具链,包括CC编译器、链接器、解析文件的工具等 38:47 - 目标文件由多个section组成,每个section都有标签和字节序列,由代码、符号和重定位组成 六、可执行文件的编译链接过程,包括预编译、编译、汇编、链接等步骤,以及如何提取代码、符号和重定位信息。 41:42 实名羡慕up这溢出屏幕的才华[点赞][点赞][点赞],YYDS!快来一键三连吧[热词系列_优雅]

Miracle-Yumi:
请问一下有uu知道哪里获得演示代码吗?官方主页似乎没有。

【回复】找到了,要点vscode图标[笑哭]
【回复】回复 @Miracle-Yumi : 在wiki里,使用wget下载

操作系统 汇编 C语言 编程 南京大学 C/C++ Linux

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!