我有一些内核哎呀在这里失败了:
BUG: ...
IP: [<ffffffffabcdefab>] myfunction+0x10/0x1e [mymodule]
在 Oops 中我们可以看到函数长度为十进制 30 个字节。
我认为长度是从第一个指令的第一个字节到最后一个指令的第一个字节的字节数。 IE。从第一条指令的地址分散到最后一条指令的地址。我说得对吗?
那么如何确保查看 objdump
输出时 myfunction
的长度为 30 字节呢?只是从最后一条指令的地址中减去第一条指令的地址?
例如:
0000000000068930 <myfunction>:
68930: 53 push %rbx
68931: 48 8b 07 mov (%rdi),%rax
68934: 48 89 fb mov %rdi,%rbx
68937: ff 10 callq *(%rax)
68939: 80 7b 08 00 cmpb $0x0,0x8(%rbx)
6893d: 75 09 jne 68948 <foo1+0x20>
6893f: 5b pop %rbx
68940: c3 retq
68941: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
68948: 48 89 df mov %rbx,%rdi
6894b: 5b pop %rbx
6894c: eb a2 jmp 688f0 <foo2>
6894e: 66 90 xchg %ax,%ax
我们可以看出myfunction
的长度是0x6894e
- 0x68930
= 1e
(十进制30个字节) )来自 objdump
的输出?如果不是,那么反汇编后函数的长度是多少?
最佳答案
它实际上应该是从第一条指令的开头到最后一条指令的结尾(含)的字节数。这相当于获取最后一条指令之后的字节地址,并减去第一条指令的第一个字节的地址。
在这种情况下,函数的最后一条指令实际上是从 6894c
开始的 jmp 688f0
,因此该指令后面的字节位于 6894e
。 xchg %ax, %ax
指令实际上并不是您函数的一部分;请注意,您无法从函数中的任何位置访问它。这是一条无操作指令,由编译器添加为填充,以便下一个函数可以在 8 或 16 字节边界上对齐(这更有利于缓存等)。
关于Oops 和 objdump 中的 Linux 内核函数长度(反汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59199056/