22得票3回答
在用户空间中用C语言加载ELF文件

我正在尝试在64位x86环境下的Linux中加载使用 "gcc -m32 test.c -o test.exe"编译的ELF文件。我正在尝试将这个32位文件(test.exe)加载到具有以下核心逻辑(32位ELF)的用户空间ELF加载器中。 问题在于调用返回的起始地址会导致分段错误核心转储。...

22得票4回答
理解 __libc_init_array

我查看了http://newlib.sourcearchive.com/documentation/1.18.0/init_8c-source.html中的__libc_init_array源代码。 但我不太理解这个函数的作用。 我知道这些符号 /* These magic symbols...

21得票1回答
Symbol visibility,异常,运行时错误

我正在努力更好地理解符号可见性。GCC Wiki(http://gcc.gnu.org/wiki/Visibility)有一节关于“C++异常问题”。据GCC Wiki称,由于未导出异常,可能会出现运行时错误。没有编译时错误/警告的运行时错误非常危险,因此我试图更好地理解这个问题。我进行了一些...

21得票3回答
为什么Linux/GNU链接器选择地址0x400000?

我正在尝试在Linux x86_64上使用ELF可执行文件和GNU工具链进行实验: 我已经手动连接和剥离了一个“Hello World”测试程序test.s: .global _start .text _start: mov $1, ...

21得票2回答
ELF文件中的“节到段映射”存储在哪里?

作为尝试从零开始编写编译器的一部分,我目前正在处理处理ELF文件的部分。 经过阅读多篇文章和规范,我仍然不太明白节到段映射存储在哪里。 当观察使用NASM+ld生成的小型可执行文件时,我可以看到.text节被某种方式映射到LOAD类型的程序头上,但是如何实现呢? 给定一个小型(工作)可执行...

21得票2回答
如何使用十六进制编辑器在Linux上创建可执行的ELF文件?

只是好奇。显然这不是实际编程的非常好的解决方案,但是假设我想在Bless(一个十六进制编辑器)中创建一个可执行文件。 我的架构是x86。我能制作一个非常简单的程序吗? 一个Hello World? 一个无限循环?类似于这个问题,但在Linux下。

20得票1回答
ELF文件的哪一部分必须加载到内存中?

可执行文件的ELF格式包含程序头部(segment header)和节头部(section header),这些可以通过readelf -a命令查看,下面是一个例子: 上述两张图片分别为节头部和程序头部。可以看出,一个程序头部由多个节头部组成,用于将程序加载到内存中。 只有.tex...

20得票1回答
如何将文本文件的内容作为一个节添加到ELF文件中?

我有一个NASM汇编文件,在Intel-64 Linux上组装和链接。 有一个文本文件,我希望文本文件的内容以字符串形式出现在生成的二进制文件中。该二进制文件是一个ELF可执行文件。 我的计划是在ELF文件中创建一个新的只读数据段(相当于传统的.rodata节)。 理想情况下,将有一种工...

20得票5回答
二进制文件(PE/COFF和ELF)格式和术语的澄清

我对这些术语感到有些困惑。 输入链接器的文件称为目标文件,链接器生成的映像文件被加载器用作输入。 这段内容来自于《MS PE & COFF规范》。 问题1:映像文件也称为二进制映像、二进制文件或者只是二进制。对吗? 问题2:根据上述术语,PE/ELF/COFF是映像文件的格式,而不...

20得票1回答
为什么一个完全静态的 Rust ELF 二进制文件会有一个全局偏移表 (GOT) 段?

这段代码针对 x86_64-unknown-linux-musl 目标编译时,会生成一个 .got 段: fn main() { println!("Hello, world!"); } $ cargo build --release --target x86_64-unknow...