关于ELF文件格式的一些问题

Some questions about ELF file format

我正在尝试了解 ELF 文件的结构以及可能如何手动制作。

我正在研究 aarch64 Linux OS,我正在检查的 ELF 文件是 elf64-littleaarch64 格式。

我也尝试自学,但是我遇到了一些问题...

  1. 当我执行 xxd code 时,每行输出中的第一个数字指定文件中字节的地址。但是当objdump -D code时,第一个数字是4000b0,但是对应xxd中的000000b0。为什么开头是四?
  2. objdump中,字节码例如11000a94,即'means' add w20, w20, #2 在汇编中。我知道,11 是操作码,但 000a94 是什么意思?我想,应该是参数,但是我加了值2,里面找不到数字2。

如果你有好的文章可以看,或者能帮我解释一下,我将不胜感激!

好吧,我问得太快了,但现在,我也来回答一下。

  1. 40objdump中地址的开头是字符“@”的十六进制表示,意思是“at”,指向一个地址,很简单!
  2. Little Endian 有 CPU 地址存储在 5 位而不是 6 或 8。这意味着,我应该寻找 objdump 代码的二进制值:11000a94 - -> 10001000000000000101010010100,这里可以分为[10001][00000000000010][10100][10100][opcode][value][first address][second address]

两个答案都是错误的,请参阅已接受的答案。 不过我还是会让他们来的

  1. xxd 显示文件中字节在磁盘上的偏移量。 objdump -D 显示(暂定)程序在 运行 时将加载这些字节的内存地址。它们通常相差一个整数。特别是,0x400000 可能对应一个更高级别的页面 table 条目;请参阅 Why Linux/gnu linker chose address 0x400000?,它适用于 x86-64,但我认为 ARM64 类似(尚未检查)。它与 0x40 是 ASCII @ 这个事实没有任何关系;纯属巧合。

    请注意,如果使用 ASLR,每次程序 运行 时都会随机选择实际内存地址,并且不会与 objdump 显示的内容匹配,尽管差异仍然是页面大小的倍数。