簡體   English   中英

Oops 和 objdump 中的 linux 內核函數長度(反匯編)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM