装载与汇编

发布于 2023-02-25  186 次阅读


一个程序是如何从存储的硬盘里面执行的

计算机的内核提供接口来与用户编写的程序进行交互,fork函数是将当前的进程复制一份,之后执行execve(),用新的可执行二进制文件代码替换复制出的进程的代码,以此创建新进程,然后进入内核状态,内核去执行以下的几个函数(sys_execve()、do_execve()、search_binary_handler()、load_elf_binary()),之后新的进程会进入到 _start标签,_start标签里面会执行__libc_start_main,然后执行main函数。

动态链接程序的执行过程:

当多个程序需要相同的库时,动态链接相比于静态链接能节省空间,因为静态链接库会每copy出多个库再提供给每个程序,而动态链接同时向多个程序提供同一个库。因此动态链接内存布局要比静态链接内存布局小得多。动态链接的概念大致就是,当一个程序运行时, 内存里映射有程序本身以及所需库,当装载该程序时若用到所需库,则是需要访问装载过的所需库的地址来调取该库,每个程序都可调用所需库。动态链接程序的执行过程比静态链接多一个ld.so,ld.so的作用就是解决调用函数库时如何把该函数库的地址填到程序中去 。

计算机中的跳到某个地址经历的过程是取址、译码、执行

偏移地址的计算方法:

偏移地址是相对于整个文件而言,位移是相对于偏移地址来说。

常用汇编指令:Add /Sub指令 即加减,目标操作数加/减原操作数再放到目标操作数的位置。

push与pop指令:

CALL指令:

两种汇编格式:


穿过云层我试着努力向你奔跑