博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态链接过程
阅读量:4710 次
发布时间:2019-06-10

本文共 729 字,大约阅读时间需要 2 分钟。

  最近学习了elf文件的格式,重点关注了动态链接过程中的使用到的section

  第一步程序在加载时,会把解释器程序加入到.interp段。可以解决动态库和可执行文件的加载。

  一般来讲程序的加载方式是懒启动,Lazy;除非指定了LD_BIND_NOW环境变量非0,那么在程序启动时就会把外部符号地址全部加载完成。

  当遇到还未加载的符号时,比如printf,出在libc中。

  首先程序会到call plt段中的某个地址,这里只是一个跳转,如:

   调用malloc

  0x080484d8 <+24>:    e8 63 fe ff ff  call   0x8048340 <malloc@plt>

  此处是跳转到*0x804a004中的内容指定的地址,这个指针地址是处于.got.plt段的,如果是第一次调用,那么.got.plt表中保存的是0x8048346,就是plt段的下一句话,这时候会压入一个offset,这个8,这个8是这个符号在所对应的重定位表中的偏移量,找到重定位表中的这个符号,这个符号有一个32位的标志,里面有符号表中的信息,接着找到符号表中的符号。以上这些从重定位表开始的操作都应该是由ld这个库里面的函数里完成的。

  0x08048340 <+0>: jmp *0x804a004

  0x08048346 <+6>: push $0x8
  0x0804834b <+11>: jmp 0x8048320

  实际上这个偏移量8对应的就是地址0x804a004,ld将会找到正确的地址赋给指针0x804a004。

  

转载于:https://www.cnblogs.com/leo0000/p/5604025.html

你可能感兴趣的文章
python面试题
查看>>
MySQL 数据备份与还原
查看>>
Android Camera2 参数调节关键字翻译集合,常用关键字解析
查看>>
NSMutableString 常用操作
查看>>
php-Mysql示例1
查看>>
python第三方库requests学习笔记
查看>>
Oracle基本查询语言
查看>>
Word直接发表博客测试
查看>>
sublime text2 中Emmet常用的技巧 和快捷键
查看>>
浏览器对应用程序的根URL发出请求时所发生的情况(结合 DI)
查看>>
VS2013 F12无法转到函数的定义处,总是从“元数据”获取的问题 ——解决方法...
查看>>
Python列表list对象方法总结
查看>>
jjs 产生undefined的情况
查看>>
chrome的uget扩展程序红色 Unable to connect with uget-integrator问题
查看>>
16 个免费和收费的视频、多媒体 WordPress 主题
查看>>
noip2018游记
查看>>
[SCOI2008]配对
查看>>
尚学堂Spring视频教程(七):AOP XML
查看>>
PHP 常用函数库和一些实用小技巧
查看>>
互联网架构消息队列
查看>>