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