免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2113 | 回复: 3
打印 上一主题 下一主题

Computer Systems书里面有关fPIC的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-17 10:00 |只看该作者 |倒序浏览
书里面讲fPIC访问变量时用下面的代码?

      call L1
L1: popl %ebx; # ebx contains the current PC
      addl $PROCOFF, %ebx # ebx points to GOT entry for proc
      call *(%ebx) # call indirect through the GOT

既然$PROCOFF是编译时就确定的,为什么不直接用绝对地址访问,还要addl一次呢?

论坛徽章:
0
2 [报告]
发表于 2008-07-17 10:17 |只看该作者
原帖由 goodier 于 2008-7-17 10:00 发表
书里面讲fPIC访问变量时用下面的代码?

      call L1
L1: popl %ebx; # ebx contains the current PC
      addl $PROCOFF, %ebx # ebx points to GOT entry for proc
      call *(%ebx) # call indire ...

建议LZ再返回去看看书中讲为什么需要PIC代码的原因哈。
举个例子,如果使用绝对地址,程序刚加载执行时是没有问题的。但加载后又把程序搬移到一个新的地址执行(re-locate),链接时产生的绝对地址不就失效了。

论坛徽章:
0
3 [报告]
发表于 2008-07-17 10:44 |只看该作者
原帖由 zx_wing 于 2008-7-17 10:17 发表

建议LZ再返回去看看书中讲为什么需要PIC代码的原因哈。
举个例子,如果使用绝对地址,程序刚加载执行时是没有问题的。但加载后又把程序搬移到一个新的地址执行(re-locate),链接时产生的绝对地址不就失效了。


这一段我确实看得不是很明白. 而且我把代码copy错了,对于变量的引用:

        call L1
L1: popl %ebx; # ebx contains the current PC
      addl $VAROFF, %ebx # ebx points to the GOT entry for var
      movl (%ebx), %eax # reference indirect through the GOT
      movl (%eax), %eax

不能把 call L1 直接改成?
       movl GOT的地址 %ebx
       movl (%ebx), %eax # reference indirect through the GOT
     movl (%eax), %eax

GOT的地址在连接的时候不能确定吗?GOT是在exe(caller一方)中,还是在so(callee一方)中 ?

论坛徽章:
0
4 [报告]
发表于 2008-07-17 11:10 |只看该作者
原帖由 goodier 于 2008-7-17 10:44 发表


这一段我确实看得不是很明白. 而且我把代码copy错了,对于变量的引用:

        call L1
L1: popl %ebx; # ebx contains the current PC
      addl $VAROFF, %ebx # ebx points to the GOT entry  ...

唉,CU的搜索功能为啥就不能做好一点呢,本可以搜索以前的回复的,搞得又要多打一次字。
先不要管代码,先把为啥要有fPIC搞清楚,代码自然就明白了。
额,突然觉得要打的字很多,LZ还是再倒回去看一下,为啥动态库必须要是可以重定位的,也就是说为啥动态库不设计成加载到固定虚拟地址。
fPIC本来就是使用相对地址而不用绝对地址,所以这里访问GOT没有用绝对地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP