gpt4 book ai didi

Oops 和 objdump 中的 linux 内核函数长度(反汇编)

转载 作者:行者123 更新时间:2023-12-03 09:58:51 28 4
gpt4 key购买 nike

我有一些内核 Oops 在这里失败了:

BUG: ...
IP: [<ffffffffabcdefab>] myfunction+0x10/0x1e [mymodule]

在 Oops 中,我们可以看到函数长度为 30 字节(十进制)。
我想 长度是字节数 从第一条指令的第一个字节到最后一条指令的第一个字节 . IE。从第一条指令的地址分散到最后一条指令的地址。我对吗?

那么如何确保 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

我们可以说 myfunction的长度是 0x6894e - 0x68930 = 1e (十进制的 30 个字节)来自 objdump 的输出?如果不是,就反汇编而言,函数的长度是多少?

最佳答案

它应该是从第一条指令开始到最后一条指令结束的字节数,包括在内。这相当于取最后一条指令后的字节地址,减去第一条指令的第一个字节的地址。

在这种情况下,函数的最后一条指令实际上是 jmp 688f0开始于 6894c ,所以这条指令后面的字节在 6894e . xchg %ax, %ax指令并不是你职能的一部分;请注意,在您的函数中的任何地方都无法访问它。这是一个由编译器作为填充添加的无操作指令,以便下一个函数可以在 8 或 16 字节边界上对齐(这对缓存等更好)。

关于Oops 和 objdump 中的 linux 内核函数长度(反汇编),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59199056/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com