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

时间:2014-05-26 19:37:45

标签: c linux gcc

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

2 个答案:

答案 0 :(得分:0)

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

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

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

对于构建的exectutable,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也不容置疑。

答案 1 :(得分:-1)

这是一个简单的解决方案(解决方法)。您需要将以下内容添加到源代码中:

#ifdef __cplusplus
extern "C" { int __compiled_using_cplusplus; }
#endif

只有在使用g ++:

编译源代码时,才能在目标文件中找到__compiled_using_cplusplus符号
alexander@ubuntu:tmp4$ nm test-g++.o 
0000000000000000 B __compiled_using_cplusplus

alexander@ubuntu:tmp4$ nm test-gcc.o

alexander@ubuntu:tmp4$ nm test-g++.o | grep -q '__compiled_using_cplusplus' && echo "c++ compiler"
c++ compiler

alexander@ubuntu:tmp4$ nm test-gcc.o | grep -q '__compiled_using_cplusplus' && echo "c++ compiler"