如何使用类似的东西来判断objdump
是否已经构建了一个目标文件-fPIC
?
答案取决于平台.在大多数平台上,如果输出
readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'
是空的,然后要么foo.o
没有编译-fPIC
,要么foo.o
不包含任何重要的代码-fPIC
.
我只需要在PowerPC目标上执行此操作,以查找在没有-fPIC的情况下构建的共享对象(.so).我做的是运行readelf -d libMyLib1.so并寻找TEXTREL.如果您看到TEXTREL,则构成.so的一个或多个源文件不是使用-fPIC构建的.您也可以替换readelf与elfdump如果需要的话.
例如,
[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