我正在寻找一种快速检查ELF二进制文件是共享对象还是位置无关可执行文件的方法。我认为可以通过检查包含的符号/函数来做到这一点。我正在寻找一种不必阅读完整文件的更有效方法。我必须在不同的平台上执行检查,至少是Android,Linux(32位和64位)。
答案 0 :(得分:6)
我正在寻找一种快速检查ELF二进制文件是共享对象还是独立位置可执行文件的方法。
无法检查:PIE可执行文件是共享对象。
我认为可以通过检查包含的符号/函数来做到这一点。
符号可以被删除,一旦符号,你就不能告诉。
共享对象和可执行文件,它们通常由链接的启动代码
区分
这是真的:PIE通常与Scrt1.o
链接,但共享库通常不会。但是没有什么可以阻止共享库与Scrt1.o
链接,并且在剥离的二进制文件中甚至发现启动代码可能有些问题。
如果您真正想要的是区分共享库和您自己构建的PIE可执行文件(而不是解决任何共享库的一般情况和< em>任何 PIE),然后检查是否存在PT_INTERP
(readelf -l a.out | grep INTERP
)可能是最简单的方法:PIE可执行文件保证有PT_INTERP
,并且共享库通常没有它(libc.so.6
是一个值得注意的例外)。
答案 1 :(得分:0)
尝试elfutils和附带的程序 eh-readelf :
eh-readelf --file-header $ELFFILE
显示文件标题以及它是什么类型的文件:
...
Typ: EXEC (Executable file)
...
或
Typ: DYN (Shared object file)
结合一点sed
行,你应该得到你想要的结果。