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

标签 linux assembly linux-kernel disassembly objdump

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

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/

相关文章:

linux - 如何对指定路径下的所有文件执行 for-each 循环?

linux - 我怎么知道 cron 作业已经开始或完成?

c - 如何从命令提示符编译和运行汇编程序源代码?

c++ - 使用内联 asm Hook usercall

linux - 中断处理程序中的 Printk 或 I/O 危险

linux - 如何强制所有centos终端dns查询到squid代理?

linux - 向 btrfs 卷添加新设备,但可用大小几乎没有增长

assembly - “Unaligned address in store” 保存单词时出错

linux - Linux内核如何确定ld.so的加载地址?

ubuntu - YOCTO:启动 menuconfig 打开一个空终端