Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux a、 输出被ELF文件格式替换?_Linux_Unix_File Format_Elf_Coredump - Fatal编程技术网

Linux a、 输出被ELF文件格式替换?

Linux a、 输出被ELF文件格式替换?,linux,unix,file-format,elf,coredump,Linux,Unix,File Format,Elf,Coredump,我有几个问题: 为什么a.out被ELF取代 a.out格式中导致ELF文件格式提高的主要缺陷是什么 早期的核心转储基于a.out,但现在它们基于ELF。ELF有哪些优势 我记得,a.out格式最初的问题之一是它只支持三个部分:文本、数据和bss。ELF允许任何数量(或至少更多)。a.out头格式非常简单,类似于: word <magic> word <text size> word <data size> word <bss size> wo

我有几个问题:

  • 为什么
    a.out
    ELF
    取代
  • a.out格式中导致ELF文件格式提高的主要缺陷是什么
  • 早期的核心转储基于a.out,但现在它们基于ELF。ELF有哪些优势

我记得,a.out格式最初的问题之一是它只支持三个部分:文本、数据和bss。ELF允许任何数量(或至少更多)。a.out头格式非常简单,类似于:

word <magic>
word <text size>
word <data size>
word <bss size>
word
单词
单词
单词
相反,ELF格式有节头,带有名称、大小等


拥有更多的节可以使用标准节,但也可以为我们提供常量节、构造函数节,甚至每个函数一节(如果我们需要)。a.out格式强制共享库在内存中占据固定位置。如果要分发a.out共享库,必须注册其地址空间。这对性能有好处,但根本无法扩展。你自己看看(linuxjournal)


相比之下,在ELF中,共享库可以加载到内存中的任何位置,甚至可以出现在同一台计算机上运行的不同应用程序的不同地址(代码仍然有效地加载到物理内存中的一个位置)!为了实现这一点,在IA-32体系结构中,必须牺牲寄存器(%ebx)。显示出共享库在ELF中变得更加复杂,但这是编译器方面的复杂性,而不是程序员方面。

这解释了不同之处,但没有解释a.out的错误所在,也没有解释为什么拥有更多的节更好一点——a.out代表汇编程序输出,直到今天,gcc将编译C代码,并默认将输出文件命名为a.out,除非指定了另一个输出名称,尽管输出文件仍然是ELF。这是代码被直接翻译成汇编程序输出的时代遗留下来的东西……很高兴看到遗留下来的东西在精神上继续存在!!请注意,尽管gcc默认使用名称
a.out
,但格式仍然是ELF。我想知道ebx在前后的使用情况,以及coff的不同之处elf@EvanCarroll原来的问题根本不是指COFF。您的评论听起来像是一个新问题,我请您提问。@EvanCarroll在a.out中,ebx作为通用寄存器可用于用户代码。在x86(32位)ELF ABI中,ebx保存全局偏移表(GOT)的地址,因此它不可用于用户代码。叶函数不调用任何其他函数的函数可以保存并使用它,但与被调用方保存寄存器不同的是,在条目中保存它并不足以在一般情况下使用它。