elf文件相关知识记录

动态链接和静态链接

ldd实际上是调用/lib64/ld-linux-x86-64.so.2动态库(注意,这也是一个可执行文件)进行一些操作。


readelf -l ./unbound在program headers里可以看到对应的解释器

readelf -d ./unbound查看动态段

readelf -r ./unbound可以查看重定位的符号

看下.interp段里面的内容是啥
objdump -s -j ‘.interp’ ./unbound

先查到动态方法的plt,然后jmp到对应plt位置,然后jmp到_dl_runtime_resolve_xsavec方法,在_dl_runtime_resolve_xsave方法绑定完符合后,挑转到指定方法。
然后再看下对应的got.plt的值0x58a460。
这里其实是2张表,.plt和.got.plt,.plt是可执行和可访问的,.got.plt是可写和可访问的



注意,未初始化前.got.plt位置存储的是下一条指令的位置




现在.got.plt存储就是实际的strchr的方法的地址了。

linux 加载过程elf文件

入口方法:load_elf_binary

检验文件头魔数、类型(可执行、动态)、文件是否支持mmap(需要将文件中的段mmap到内存中)。
读取程序头,获取解释器路径并打开(可选),遍历剩余的程序头,判断是否栈的数据可执行等等。
如果有解释器,读取解释器的程序头。
释放旧的二进制文件、持有当前二进制文件、释放旧的mmap的vma(需要重新映射当前文件),关闭CLOEXEC标志的文件。
映射section到内存,如果设置randomize_va_space,则对栈、brk加上随机值,如果有解释器,则将解释器的入口作为启动地址,否则就是当前文件的入口作为启动地址。
调用start_thread替换完成,重新执行。

https://blog.csdn.net/weixin_43844521/article/details/132852363

posted @ 2025-04-25 02:02  yghr  阅读(62)  评论(0)    收藏  举报