你的位置:首页 > 操作系统

[操作系统]动态链接过程


  最近学习了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。