c - 如何验证目标文件是由 g++ 而不是 gcc 生成的

标签 c linux gcc

在我的 linux box (ubuntu) 上,有什么方法可以验证目标文件是使用 g++ 而不是通过 gcc 从我的 c 源代码创建的? 使用 readelf,我能够读取用于创建目标文件的 gcc 版本。不幸的是,它没有说明是否使用了 g++ 或 gcc。也许有一个调试选项可以将该信息以某种方式放在评论中?

最佳答案

您可以在 makefile 或 GCC 命令行(无论是 gcc 还是 g++)中设置预处理器宏,在每个目标文件中设置静态常量字符串,以记录构建方式和源文件版本(如果您关心现场维护和支持) ).复制源代码控制系统信息在某些 FOSS 程序中的存储方式。

然后您可以使用字符串(1) 来检查保存的信息。

GCC,提供驱动程序 gcc 和 g++,编译和/或链接 C 和 C++,设置适当的默认值,但选项意味着 C++ 可以使用 gcc 编译,以及 C(通常)是 C++ 的有效输入编译器。可以通过某些目标上的编译器开关 -frecord-gcc-switches 或调试选项 -grecord-gcc-switches 记录选项,但比较编译器的精简和速度他们的输出是,所以你必须明确地询问这样的“膨胀”,它甚至可能不关心使用哪个命令来调用编译器。

对于构建的可执行文件,ldd 可能很有用,nm 用于对象,如评论中所建议的

ldd ./sob
    linux-vdso.so.1 (0x00007fffc37fe000)
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f7e99378000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f7e99075000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7e98e5e000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f7e98aaf000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7e99680000)

    nm ./sob.o
                 U __cxa_atexit
                 U __dso_handle
..
                 U _ZSt4cerr
                 U _ZSt4cout
                 U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
0000000000000008 b _ZStL8__ioinit
                 U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
nm ./mallocstats.o
                 U fprintf
                 U mallinfo
0000000000000000 T mallocstats
                 U stderr

libstdc++.so.6 表明 ./sob 是 C++,这是正确的。困惑的名称和诸如 cerr/cout 和 basic_ostream 之类的东西确实表明是 C++。 mallocstats.o 的 C-ness 也是毋庸置疑的。

关于c - 如何验证目标文件是由 g++ 而不是 gcc 生成的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23876696/

相关文章:

c - ncurses:警告:取消引用 ‘void *’ 指针

c - 在 VSCode 中使用 gcc 编译 C 程序时出错

linux - 如何仅在文件中的一行中查找两个单词,它们之间存在特定数量的随机单词

c++ - Xlib 这个(去掉窗饰)是怎么工作的?

c++ - 获取窗口窗口在X-window系统中的位置?

c - OS X 上的 Pthread 和 gcc 编译问题

c - Ubuntu 11 上 GCC 的链接问题

c - 是否有计算 printf 格式字符串的参数数量的函数?

c - 将单个字符写入具有 8MHz AVR 的 LCD 16x2 显示器需要多长时间

无法转发声明 typedef?