c - 可执行文件之间有什么区别?

标签 c linux elf objcopy

我有以下 C 程序:

#include<stdio.h>
int main()
{
    printf("hhhh");
    return 0;
}

编译、复制和比较的命令:

$ gcc print.c -o a.out
$ objcopy a.out b.out
$ cmp a.out b.out

我已经编译了这个程序并创建了一个可执行文件。然后,我使用 objcopy 命令来制作可执行文件的副本。但是,当我比较这些文件时,我得到了这个:

files differ: byte 41, line 1

我如何知道缺少哪些内容?
任何帮助或指示将不胜感激。谢谢!

最佳答案

How can I know what contents are missing?

是什么让您相信缺少任何内容?

objcopy 的工作方式是:

  1. 将输入文件的内容解析为内部表示。
  2. 按照选项的指示将原始文件的部分内容复制到输出文件

objdump 无法保证当给出“复制整个文件”时,结果将是位相同的。

特别是,不可加载的部分可以通过其他方式重新排序或更改。

The difference is EntSize of .init_array section is 0 bytes in a.out file and it is 8 bytes in the b.out

EntSize 0 对于非空部分没有意义。如果您的 a.out 中确实有这样的部分,则您的链接器可能存在错误。

关于c - 可执行文件之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48399445/

相关文章:

linux - 使用 $ORIGIN 指定 ELF 二进制文件中的解释器不起作用

c - ELF 文件生成命令和选项

c - 在 Windows 上的 ReadFile 之前查看 USB HID 设备

c - C 中的 X509_NAME 宏无法编译

linux - 从 glibc 源代码生成 libc6-dbg 包

c - 在 C 中访问 ELF 符号表

c - select() 如何等待常规文件描述符(非套接字)?

C Treenode 指针用全局变量改变值

linux - 无法调试联编文件。生成文件 :9: *** missing separator. 停止

linux - 一个未安装的应用程序怎么可能仍然在 Linux 中运行?