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