[英]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.