【问题标题】:Why can't I find the int value in a binary为什么我在二进制文件中找不到 int 值
【发布时间】:2017-02-13 10:57:33
【问题描述】:

我在 64 位 linux 机器上编译了以下程序:

#include <stdio.h>

main()
{
    int a = 12345;

    if (a == 12346)
        printf ("YES\n");

    return;
}

如果我使用 hexdump 输出二进制文件,我可以找到 12346(十六进制的 303a),但找不到 12345 的值 (0x3039)。这是为什么呢?

(小端或大端在找到该值时应该没有区别)

【问题讨论】:

  • 为什么小与大没有区别?
  • 我希望编译器能够完全优化比较。您确定您找到的 0x303a 是源文件中的实际数字,而不是其他恰好相同的两个字节序列吗?
  • 如果我按照您的描述进行编译并使用gcc main.c 进行编译,我会在偏移量 00000538 处看到39 30,仅在3A 30 之前几个字节。如果我使用gcc -O2 main.c(例如,打开优化),我看不到它们中的任何一个(不出所料,因为整个事情最终都是return)。
  • 您的程序格式不正确。任何现代 C 编译器都会告诉你。
  • 查看generated assembly code。如果代码没有优化,你应该找到这两个数字。

标签: c linux elf hexdump


【解决方案1】:

这就是我在普通hexdump 的输出中的值;看看加粗的区域。

0000500 39fc 0030 8100 fc7d 303a 0000 0a75 a4bf

如果您希望将3039 视为一个组,那就可以解释这种混乱。实际字节数是:

fc 39 30 00 00 81 7d fc 3a 30 00 00 75 0a bf a4

如果您不希望 hexdump 执行其“有用”的默认输出,它将输入重新解释为小端双字节字的序列,您可以花一个小时弄清楚如何使用它的格式字符串,或者只是选择 xxd。

【讨论】:

    【解决方案2】:

    回答此类问题的最简单方法是使用-S 命令行选项编译它,它将您的C 程序输出为汇编代码。

    这就是您的 main() 函数在没有任何优化的情况下编译的内容(即,使用 -O0 命令行开关)。我删除了一些多余的标记语句并添加了一些 cmets:

    main:
            leal    4(%esp), %ecx        # Create local storage on stack
            andl    $-16, %esp
            pushl   -4(%ecx)
            pushl   %ebp
            movl    %esp, %ebp
            pushl   %ecx
            subl    $20, %esp
            movl    $12345, -12(%ebp)   # Initialize `a` to 12345
            cmpl    $12346, -12(%ebp)   # Compare with 12346
            jne     .L4
            subl    $12, %esp           # If equal, ...
            pushl   $.LC0
            call    puts                # print "YES"
            addl    $16, %esp
    .L4:
            nop
            nop
            movl    -4(%ebp), %ecx      # Tidy up and exit
            leave
            leal    -4(%ecx), %esp
            ret
    

    您可以在 movlcmpl 说明中看到数字 12345 和 12346 包含在您的代码中。

    通过优化,代码变得简单了很多。编译器可以看到if 语句永远不会计算为真。它还可以看到变量a 从未使用过。这就是main() 使用硬优化编译时的样子 (-O3):

    main:
            rep ret
    

    注意:我在 32 位 Ubuntu Xenial 上编译了这个,但在 64 位机器上会发生完全相同的优化。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2011-07-17
      相关资源
      最近更新 更多