问题描述
我正在尝试学习 ELF 文件的结构以及如何手动制作。
我正在研究 aarch64 Linux 操作系统,我正在检查的 ELF 文件是 elf64-littleaarch64
格式。
我也尝试自学,但是我遇到了一些问题......
- 当我执行
xxd code
时,输出的每一行中的第一个数字指定文件中字节的地址。但是当objdump -D code
时,第一个数字类似于4000b0
,但对应于000000b0
中的xxd
。为什么开头是四? - 在
objdump
中,字节码是例如11000a94
,“意思是”add w20,w20,#2
正在组装中。我知道,11
是操作码,但是000a94
是什么意思?我想,应该是参数,但是我添加了值 2 并且在其中找不到数字 2。
如果你有好的文章可以阅读,或者能帮我解释一下,我将不胜感激!
解决方法
-
xxd
显示磁盘上文件中字节的偏移量。objdump -D
显示(暂时)内存中的地址,当程序运行时这些字节将被加载到该地址。它们之间相差一个整数是很常见的。特别地,0x400000
可能对应一个更高级别的页表条目;参见适用于 x86-64 的 Why Linux/gnu linker chose address 0x400000?,但我认为 ARM64 类似(尚未检查)。它与0x40
是 ASCII@
的事实没有任何关系;这只是巧合。注意,如果使用了 ASLR,每次程序运行时都会随机选择实际的内存地址,与
objdump
显示的不匹配,尽管差异仍然是一个页面大小的倍数。
嗯,这个问题我问得太快了,但现在,我也来回答一下。
-
objdump
是字符“@”的十六进制表示,意思是“at”,指向一个地址,很简单! - Little Endian 将 CPU 地址存储为 5 位而不是 6 位或 8 位。这意味着,我应该查找
objdump
代码的二进制值:11000a94
--> {{1} },这里可以用10001000000000000101010010100
分为
40
中地址开头的[10001][00000000000010][10100][10100]
两个答案都是错误的,请参阅已接受的答案。 不过我还是会让他们在这里