Compiler construction 你能找出哪个编译器被用来编译一个程序吗?

Compiler construction 你能找出哪个编译器被用来编译一个程序吗?,compiler-construction,identification,Compiler Construction,Identification,给定一个从C编译并在Solaris上运行的可执行文件,是否可以确定使用哪个编译器编译关联的不完整可执行文件 当使用字符串或file命令时,我看不到任何东西,而且magic似乎没有包含任何特定的内容 编译器通常会在其可执行输出文件中添加指纹吗 干杯,是的,艾达很适合这个。它使用了一种叫做Visual Studio和GCC的技术,通常遵循不同的启动例程(调用main)。这也许是个暗示。但我不知道其他人。对于DLL,我想不出类似的东西。就可以了。它通常工作得很好。显然,PEID是一个windows工具

给定一个从C编译并在Solaris上运行的可执行文件,是否可以确定使用哪个编译器编译关联的不完整可执行文件

当使用字符串或file命令时,我看不到任何东西,而且magic似乎没有包含任何特定的内容

编译器通常会在其可执行输出文件中添加指纹吗


干杯,

是的,艾达很适合这个。它使用了一种叫做Visual Studio和GCC的技术,通常遵循不同的启动例程(调用main)。这也许是个暗示。但我不知道其他人。对于DLL,我想不出类似的东西。

就可以了。它通常工作得很好。显然,PEID是一个windows工具,但它不重要,应该向编译器显示(有时甚至是特定的版本信息)

使用您试图识别的每个编译器构建小型测试应用程序。然后在十六进制编辑器中查看结果,并尝试查找模式。这可能是非常明显的——例如,来自微软链接器的签名。

编译器通常在编译文件中以明文形式添加自己的个人“签名”。您可以使用诸如字符串之类的工具将明文输出。

如果未剥离可执行文件,请尝试/usr/ccs/bin mcs-p 这通常会显示编译器、链接器和所有使用的头文件(未剥离):

$cc-O你好

$file a.out

a、 输出:ELF 32位MSB可执行文件SPARC32PLUS版本1,需要V8+版本,动态链接,未剥离

$strings-a.out | grep cc

/opt/solaristudio12.3/prod/bin/cc-O hello.c

$dwarfdump-i a.out | grep compile_o

DW_AT_SUN_compile_options Xa;O;R=Sun C 5.12 SunOS_sparc补丁148917-072013/10/18;后端;未经加工的cd

剥夺:

美元脱衣

$file a.out

a、 输出:ELF 32位MSB可执行文件SPARC32PLUS版本1,需要V8+版本,动态链接,剥离

$strings-a.out | grep cc


(无)

问得好。我假设存在差异(即使在版本和编译器设置之间),但检测编译器并不是一项简单的任务。有趣的问题。你在想什么操作系统?这还取决于你需要使用多少操作系统。例如,gcc创建的o文件与cc不同。如果您有一个静态程序或一个可动态加载的程序,您还可以看到使用了哪些库。换句话说,您的指纹是逻辑而不是字符串。仅适用于PE文件。Solaris是ELF或可能是a.out