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

问题描述

我正在尝试学习 ELF 文件的结构以及如何手动制作。

我正在研究 aarch64 Linux 操作系统,我正在检查的 ELF 文件elf64-littleaarch64 格式。

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

  1. 当我执行 xxd code 时,输出的每一行中的第一个数字指定文件中字节的地址。但是当 objdump -D code 时,第一个数字类似于 4000b0,但对应于 000000b0 中的 xxd。为什么开头是四?
  2. objdump中,字节码是例如11000a94,“意思是” add w20,w20,#2 正在组装中。我知道,11 是操作码,但是 000a94 是什么意思?我想,应该是参数,但是我添加了值 2 并且在其中找不到数字 2。

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

解决方法

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

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

,

嗯,这个问题我问得太快了,但现在,我也来回答一下。

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

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