【发布时间】:2020-09-14 04:59:48
【问题描述】:
ELF 文档中的e_type 列出了以下可用的对象文件类型:
Name Value Meaning
ET_NONE 0 No file type
ET_REL 1 Relocatable file
ET_EXEC 2 Executable file
ET_DYN 3 Shared object file
ET_CORE 4 Core file
ET_LOPROC 0xff00 Processor-specific
ET_HIPROC 0xffff Processor-specific
我在哪里可以详细了解这些文件类型是什么?例如,我从未听说过“特定于处理器”的文件:有什么例子?
在做$ xxd -l 32 /bin/ls时,对象类型是ET_DYN:
00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............
00000010: 0300 <-- object type = 3 or "shared object file"
为什么ls 不被视为可执行文件,而是共享对象? (编者按:这部分是Why does GCC create a shared object instead of an executable binary according to file?的副本,另外readelf -h /bin/ls是解码ELF头的更简单的方法,包括ELF类型)
最后,core 文件是什么?这像堆栈跟踪吗? http://man.netbsd.org/core.5, Get the address that caused segmentation fault from core dump using C.
(编者注:此部分与 What is a core dump file in Linux? What information does it provide? 重复。不幸的是,这是 1 个帖子中的 3 个问题,因此在回答非重复部分时不能轻易将其标记为重复)
【问题讨论】:
-
简化视图:
ET_REL=> 对象文件ET_EXEC=> 非 PIE 可执行文件(固定加载基础),ET_DYN=> 共享库和 PIE 执行程序,ET_CORE=> 核心dump?,ET_LOPROC-ET_HIPROC=> 由特定处理器的 ELF 补充定义(到目前为止,AFAIK、x86、ARM、powerPc、IBM zseries 和 PA-RISC 没有定义特定类型)。 -
关于
ls的部分是Why does GCC create a shared object instead of an executable binary according to file?的复制品。关于为什么ls是 ET_DYN 的部分已经作为一个单独的问题存在。 -
@MargaretBloom 我看到这样做
as file.s将创建一个ET_REL文件(目标文件),然后执行ld file.o将创建ET_EXEC(可执行文件)。这或多或少是正确的吗?