[英]linux kernel function length in Oops and objdump (disassembly)
我有一些内核 Oops 在这里失败了:
BUG: ...
IP: [<ffffffffabcdefab>] myfunction+0x10/0x1e [mymodule]
在 Oops 中,我们可以看到函数长度为 30 字节(十进制)。
我想这个长度是从第一条指令的第一个字节到最后一条指令的第一个字节的字节数。 即从第一条指令的地址分散到最后一条指令的地址。 我对吗?
那么如何确保myfunction
是 30 字节长度查看objdump
输出呢? 只是从最后一条指令的地址中减去第一条指令的地址?
铁:
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
我们能从objdump
输出中看出myfunction
的长度是0x6894e
- 0x68930
= 1e
(十进制的 30 个字节)吗? 如果不是,就反汇编而言,函数的长度是多少?
它应该是从第一条指令开始到最后一条指令结束的字节数,包括在内。 这相当于取最后一条指令后的字节地址,减去第一条指令的第一个字节的地址。
在这种情况下,函数的最后一条指令实际上是从jmp 688f0
开始的jmp 688f0
6894c
,因此该指令后面的字节位于6894e
。 xchg %ax, %ax
指令实际上并不是您函数的一部分; 请注意,在您的函数中的任何地方都无法访问它。 这是一个由编译器作为填充添加的无操作指令,以便下一个函数可以在 8 或 16 字节边界上对齐(这对缓存等更好)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.