如何用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. 如何判断一个Web应用是否使用Angular构建?
- 5. 如何判断是否在CKEditor中选择了任何东西
- 6. 如何判断文件是否是使用PHP的文本?
- 7. 如何判断是否有东西可以拆分python
- 8. 使用类似fputcsv的东西创建一个XLS文件?
- 9. 如何判断是否使用stream_copy_to_stream下载了整个文件?
- 10. 如何判断某个Excel文件是否使用VB.NET打开?
- 11. 我如何检查是否在Python中输入了什么东西是一样的CSV文件的东西
- 12. 如何判断Safari是否使用HTTP2?
- 13. 如何判断是否使用EF5
- 14. 如何判断是否使用glibc
- 15. 如何判断soundmanager2是否使用html5?
- 16. 当用UINavigationController返回时,是否有像prepareForSegue这样的东西?
- 17. 如何判断一个项目是否使用PHP框架完成的?
- 18. 使用JNotify库,如何判断删除的文件是文件还是目录?
- 19. 如何判断“ZipArchiveEntry”是否是目录?
- 20. 是否可以使用python创建.mobi文件?如果是这样,怎么样?
- 21. 如何判断iPhone应用程序是否由PhoneGap创建?
- 22. 如何判断一个窗口是否使用GJS最小化?
- 23. 如何判断一个索引是否曾被使用过
- 24. 如何判断一个网站是否使用SSL
- 25. 如何制作这样的东西?
- 26. 我如何模拟这样的东西?
- 27. 如何判断文件是否是nv12格式的文件?
- 28. 如何判断一组值是否符合目标函数
- 29. 资源加载:如何判断它是否是一个目录
- 30. 如何判断文件是否在使用Perl的远程文件系统上?
相关https://unix.stackexchange.com/questions/89211/test-whether-linux-binary-is-compiled-as-position-independent-code –