如何用objdump
这样的东西说明,如果目标文件是用-fPIC
构建的?如何用objdump这样的东西判断一个目标文件是否使用-fPIC创建的?
回答
答案取决于平台。在大多数平台上,如果输出
readelf --relocs foo.o | egrep '(GOT|PLT|JU?MP_SLOT)'
是空的,那么无论foo.o
没有与-fPIC
编译或foo.o
并不其中-fPIC
事项包含任何代码。
我测试了我的PIC /非PIC对象而这个测试不起作用。事实上--reloc没有列出任何东西。 – teambob
这个测试为我在PPC架构上工作。 –
@teambob对不起,'objdump'不理解'--relocs'标志,'readelf'。 –
我只需要在PowerPC目标上执行此操作来查找哪个共享对象(.so)正在构建而没有-fPIC。我所做的是运行readelf -d libMyLib1.so并寻找TEXTREL。如果您看到TEXTREL,构成您的.so的一个或多个源文件不是用-fPIC构建的。如有必要,您可以用readelf替换为elfdump。
例如,
[[email protected] lib]$ readelf -d libMyLib1.so | grep TEXT # Bad, not -fPIC
0x00000016 (TEXTREL)
[[email protected] lib]$ readelf -d libMyLib2.so | grep TEXT # Good, -fPIC
[[email protected] lib]$
,帮助人们寻找解决方案,当我跑我的可执行文件是这样的,我得到的错误:
[email protected]:/# ./program: error while loading shared libraries: /usr/lib/libMyLi
b1.so: R_PPC_REL24 relocation at 0x0fc5987c for symbol 'memcpy' out of range
我不知道这个信息是否适用到所有体系结构。
另一种选择来区分你的程序是否生成带有-fPIC选项:
前提是你的代码有编译时启用-g3 -gdwarf-2选项。
其他海湾合作委员会调试格式也可能包含宏信息:
注意以下$“..”语法是假设的bash
echo $' main() { printf("%d\\n", \n#ifdef __PIC__\n__PIC__\n#else\n0\n#endif\n); }' | gcc -fPIC -g3
-gdwarf-2 -o test -x c -
readelf --debug-dump=macro ./test | grep __PIC__
这种方法工作,因为gcc手册宣称,如果-fpic被使用,PIC被定义为1,并且如果 -fPIC使用,PIC是2
通过检查GOT是个以上的答案更好的方法。因为-g3 -gdwarf-2的预先请求我很少被使用。
我想,你真正想知道的是共享库是否由用-fPIC编译的目标文件组成。
如前所述,如果有TEXTREL,则不使用-fPIC。
有一个很棒的工具scanelf可以显示导致.text重定位的符号。
readelf -a *.so | grep Flags Flags: 0x50001007, noreorder, pic, cpic, o32, mips32
这应该在大多数情况下工作。
这看起来很简单,但我前面的库是可重定位的,它的.rel.plt表中有大量的R_386_JUMP_SLOT条目,但标志为0x0。也许它只适用于mips32。 – James
-fPIC意味着代码将能够以不同于编译地址的地址执行。
要做到这一点,disasambler看起来像这样....
call get_offset_from_compilation_address
get_offset_from_compilation_address: pop ax
sub ax, ax , &get_offset_from_compilation_address
现在斧头我们已经偏移,我们需要增加内存的任何访问。
load bx, [ax + var_address}
- 1. 如何创建这样的东西
- 2. 用数据创建一个文件我需要这样的东西
- 3. 如何判断一个FTP文件是否存在使用ruby?
- 4. 如何判断文件是否是使用PHP的文本?
- 5. 如何判断某个Excel文件是否使用VB.NET打开?
- 6. 我如何检查是否在Python中输入了什么东西是一样的CSV文件的东西
- 7. 如何判断soundmanager2是否使用html5?
- 8. 如何判断是否使用glibc
- 9. 当用UINavigationController返回时,是否有像prepareForSegue这样的东西?
- 10. 如何判断一个项目是否使用PHP框架完成的?
- 11. 使用JNotify库,如何判断删除的文件是文件还是目录?
- 12. 是否可以使用python创建.mobi文件?如果是这样,怎么样?
- 13. 如何判断iPhone应用程序是否由PhoneGap创建?
- 14. 我如何模拟这样的东西?
- 15. 如何判断一个索引是否曾被使用过
- 16. 如何判断一个网站是否使用SSL
- 17. 如何判断一个窗口是否使用GJS最小化?
- 18. 如何判断文件是否是nv12格式的文件?
- 19. 如何判断一组值是否符合目标函数
- 20. 资源加载:如何判断它是否是一个目录
- 21. 如何判断文件是否在使用Perl的远程文件系统上?
- 22. 如何判断一个目录是否使用Java远程挂载
- 23. 如何判断PDF是否被标记
- 24. 创建一个类的东西琐碎?
- 25. 如何判断buildout是否从子目录中使用setup.py?
- 26. 如何判断文件是否包含在目录中?
- 27. 如何判断我的列是否使用excel vba作为R1C1引用样式?
- 28. 使用任何东西创建一个选框? Javascript,jquery,CSS
- 29. 如何用-fPIC标志重新编译libperl.a目标文件?
- 30. 如何判断文件是否是使用RVideo的有效视频流?
相关https://unix.stackexchange.com/questions/89211/test-whether-linux-binary-is-compiled-as-position-independent-code –