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

Cra*_*enz 53 gcc shared-libraries objdump fpic

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

Emp*_*ian 61

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

readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'
Run Code Online (Sandbox Code Playgroud)

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

  • 我测试了我的PIC /无PIC对象,但这个测试不起作用.实际上--reloc什么都没列出来. (2认同)
  • 这不是一个非常有用的测试.如果它不是空的,这不会证明什么.考虑一个由2个目标文件组成的共享库.一个目标文件是用-fPIC编译的,另一个是没有编译的.输出不会为空,但库不是位置无关的. (2认同)
  • @Vanuan 该测试不适用于共享库,是的。但问题是关于目标文件,而不是共享库。 (2认同)
  • 您介意解释一下为什么这个测试有意义,或者其背后的原因是什么吗?一个人苦苦挣扎是为了什么?为什么在没有 -fPIC 的情况下找不到这些东西? (2认同)

ind*_*div 13

我只需要在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]$
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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