【问题标题】:Which compiler, compiled this file?哪个编译器编译了这个文件?
【发布时间】:2013-03-03 07:45:23
【问题描述】:

我正在使用 gnu gcc 和 armcc 编译一些 C 文件。如何获取有关哪个编译器编译了哪个文件的信息?

例如:test.cpp 正在由 armcc 或 gnu gcc 编译。

makefile 非常复杂,我正在寻找一个命令,通过它我可以检查哪个编译器编译了哪个文件。

有什么想法吗?

【问题讨论】:

  • 您是否有权访问不确定的目标文件?
  • 也许目标文件格式能给你一些线索
  • 是的,我可以访问 .o 文件

标签: c gcc gnu gnu-make armcc


【解决方案1】:

一些编译器将编译器名称和版本嵌入到二进制文件中,但不是全部。我们还可以将我们想要的任何信息嵌入到二进制文件中。

gcc -DCOMPILER_DETAILS='"gcc 4.3.3"' temp.c

temp.c 中,在任何地方使用宏COMPILER_DETAILS,就像在printf 中使用它一样。这样这个字符串文字就会被嵌入到生成的二进制文件中。不要将此字符串分配给未使用的变量,编译器不会因为优化而嵌入。

【讨论】:

    【解决方案2】:

    我不确定是否有更简单的方法,但您可以使用 gcc 将它嵌入到二进制文件中(至少在我的平台上):

    $ hexdump -C foo | grep -A2 GCC
    
    00001030  00 00 00 00 00 00 00 00  47 43 43 3a 20 28 55 62  |........GCC: (Ub|
    00001040  75 6e 74 75 2f 4c 69 6e  61 72 6f 20 34 2e 37 2e  |untu/Linaro 4.7.|
    00001050  32 2d 32 32 75 62 75 6e  74 75 33 29 20 34 2e 37  |2-22ubuntu3) 4.7|
    

    【讨论】:

    • 这不适用于此处使用 gcc 编译的可执行文件(或 .o 文件)(OS X 上的 gcc)。这似乎与平台有关。
    • @RandyHoward- 虽然实际上这可能是因为它在幕后叮当响?
    • gcc --version i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00)> 无论如何,他的问题是关于多个编译器的。我不确定这种方法是否有效。
    • 是的 - llvm 位。我认为这只是 llvm 的 gcc 前端,但我不确定。
    【解决方案3】:

    有时您可以使用十六进制编辑器查看文件,并判断编译器是否将其名称写入文件。

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多