当前位置:  开发笔记 > 编程语言 > 正文

如果使用-fPIC构建目标文件,我怎么能用objdump之类的东西来判断?

如何解决《如果使用-fPIC构建目标文件,我怎么能用objdump之类的东西来判断?》经验,为你挑选了2个好方法。

如何使用类似的东西来判断objdump是否已经构建了一个目标文件-fPIC



1> Employed Rus..:

答案取决于平台.在大多数平台上,如果输出

readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'

是空的,然后要么foo.o没有编译-fPIC,要么foo.o不包含任何重要的代码-fPIC.


我测试了我的PIC /无PIC对象,但这个测试不起作用.实际上--reloc什么都没列出来.
这不是一个非常有用的测试.如果它不是空的,这不会证明什么.考虑一个由2个目标文件组成的共享库.一个目标文件是用-fPIC编译的,另一个是没有编译的.输出不会为空,但库不是位置无关的.

2> indiv..:

我只需要在PowerPC目标上执行此操作,以查找在没有-fPIC的情况下构建的共享对象(.so).我做的是运行readelf -d libMyLib1.so并寻找TEXTREL.如果您看到TEXTREL,则构成.so的一个或多个源文件不是使用-fPIC构建的.您也可以替换readelfelfdump如果需要的话.

例如,

[user@host lib]$ readelf -d libMyLib1.so | grep TEXT   # Bad, not -fPIC
 0x00000016 (TEXTREL)
[user@host lib]$ readelf -d libMyLib2.so | grep TEXT   # Good, -fPIC
[user@host lib]$

为了帮助人们搜索解决方案,我运行可执行文件时遇到的错误是:

root@target:/# ./program: error while loading shared libraries: /usr/lib/libMyLi
b1.so:  R_PPC_REL24 relocation at 0x0fc5987c for symbol 'memcpy' out of range

我不知道这些信息是否适用于所有架构.

资料来源:blogs.oracle.com/rie

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有