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

浙公网安备 33010602011771号