已知某高级语言源程序A经编译后得到机器C上的目标程序B,则______。
A.对B进行反编译,一股不能还原出源程序A
B.对B进行反汇编,不能得到与源程序A等价的汇编程序代码
C.对B进行反编泽,得到的是源程序A的变量声明和算法流程
D.对A和B进行交叉编译,可以产生在机器C上运行的动态链接库
参考答案:A
解析:本题考查反编译、交叉编译等相关概念。
计算机软件反向工程(Reverse Engineering)也称为“计算机软件还原工程”,指通过对他人软件的目标程序(可执行程序)进行“逆向分析和研究”推导出该软件所使用的思路、原理、结构、算法、处理过程及运行方法等设计要素,作为开发软件时的参考,或者直接用于自己的软件产品中。
高级语言源程序经过编译变成可执行文件,反编译是其逆过程。但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。反编译是一个复杂的过程,所以越是高级语言越难于反编译。
反汇编是把目标代码转为汇编代码的过程,通常利用如C及Pascal等高级语言编程,然后经过编译程序生成可以被计算机系统直接执行的文件。反汇编将这些执行文件反编译还原成汇编语言或其他高级语言,但通常反编译后的程序与源程序会存在许多不同。虽然执行效果相同,但程序代码会发生很大的变化,非编程高手很难读懂。
交叉编译简单地说是在一个平台上生成另一个平台上的可执行代码,这里所谓的平台实际上包含体系结构(Architecture)和操作系统(Operating System)两个概念。同一个体系结构可以运行不同的操作系统,同一个操作系统也可以在不同的体系结构上运行。
需要交叉编译的原因一是在项目的起始阶段,目标平台尚未建立,因此需要交叉编译以生成需要的bootloader(启动引导代码)及操作系统核心;二是当目标平台能启动之后,由于其资源的限制,所以当编译大型程序时依然可能需要用到交叉编译。
本题选项A是正确的,反编译只能转换成汇编程序,不能把可执行文件变成高级语言源代码。相应地,B和C是错误的。交叉编译在一个平台上生成另一个平台上的可执行代码,不是在源程序和目标程序之间进行,因此D是错误的。