摘要:本文简要介绍了案例汇编过程中涉及的步骤和产品,并简要分析了影响成功的预处理和汇编的一些因素。
本文简要介绍了一些clang和llvm的汇编命令。
我们可以在命令中打印出clang支持的步骤,如下所示:
根据上述简介,可以根据每个部分的结果(不包括上述步骤)将其分为5个步骤:预处理器,编译器,后端,汇编器,链接器等。
专门针对Clang中每个步骤中生成的结果文件。我们可以使用以下示意图表示:
注意:上面的示意图以clang编译C文件为示例,以介绍clang汇编过程中涉及的中间文件类型:
(1)test.c是输入的源代码(对应步骤0);
(2)test.i是预处理文件(对应于步骤1的输出,在CPP输出中,CPP不参考C ++语言,而是C PPP的缩写);
(3)test.bc是比特码文件,它是clang的中间表示(相应步骤2的输出);
(4)test.ll是可以打开的文本的中间表示(对应于步骤2的输出,该输出以与.bc相同的中间体表示。
(5)测试是组装结果(相应步骤3的输出);
(6)test.o是由单个文件生成的二进制文件(相应步骤4的输出);
(7)图像是可执行文件(相应步骤5的输出)。
注意:示意图未完成,如下:
(1)箭头中提到的方向表明可以从某种文件类型生成从文件类型中引用的文件类型;
(2)例如,图中的箭头未完成,例如,您可以从test.c中生成test.s,test.o等。箭头,只要可以连接节点,就可以用作转换;
(3)图中的真线和虚线仅表示我关心的clang编译器中的内容没有其他含义。本文仅介绍图中实际行部分的内容。没有引入虚线部分的内容。
以下介绍了上述步骤中涉及的转换命令:
上面的列表列在不同文件的直接转换的命令中(匹配示意图第1部分的序列编号,或者只是关心前部部分)。这只是将多个BC合并到BC中的命令文件。
我们可以通过以下命令查看源代码的源代码:
打印的AST信息实际上是预处理后扩展的源代码信息,源代码的AST内容是打印内容的底部。
作为以下代码:
AST的打印部分(仅当前文件的内容匹配部分)如下:
头部的标题文件引用已经开始,不,但是以下主要功能定义显示在上述函数decl中,并在代码中给出了位置。没有详细的对AST结构的分析,并且易于使用理解写一些例子。
目前,许多静态代码分析工具使用clang和llvm作为开发静态代码分析工具的基础。成功地使用Clang和LLVM分析C/C ++代码,您需要考虑如何成功使用Clang和LLVM来编译C/C ++代码。可以认为,成功生成BC文件是基本操作静态代码分析。
预处理过程(与名称相同的角色)不能用作编译的步骤,而是进行了预处理操作,我们说它更简单,实际上,我们已经完成了更换的工作文本,即处理C/C ++代码中的预处理说明。PRECROCESSing指令很简单,例如#include,#define等。/docs.microsoft.com/en-s/cpp/preprocessor-directives?view = msvc-170-170-170or,在Google下,许多介绍)。
如果程序中没有预处理指令,即使我们随便编写代码,预处理通常也不会出现问题。以下代码(main.c):
我们仍然可以正确获得预处理结果:
为了成功地实施预处理执行,很容易理解,即可以处理程序中的预处理指令。例如:例如:
(1)#include,依靠标头文件,我们可以成功找到此标头文件;
(2)#define,定义一个宏,在定义程序中的宏时,我们可以准确地找到宏(查找,必须是准确的);
(3)其他说明。
此步骤是为上一步中生成的预处理指令执行分析操作。这是最关键的。最终分析,我们需要保证一个点:使叮当编译器正确地识别代码中的语法结构表示形式,并接受这种语法结构!
以一些简单的例子:
(1)-STD用于指定支持支持的C/C ++标准。如果我们没有指定,那么我们将使用Clang的默认标准进行编译,这可能会导致语法不兼容。
(2)-werror =*,其他参数可用于使一些可识别的语法变成错误的用法;
(3)其他部分,语法识别的参数;
(4)语法也有一部分。也许Clang从头到尾都没有得到改编。必须考虑修改源代码。
在实际汇编中,如果链接存在问题,它将失败,但是在静态代码分析中,链接失败(解锁)或错误(与链接无关),可以通过更多分析来进一步分析。报告通常不会导致分析失败。这种问题会影响中间体的产生,但分析结果(影响文件间分析的过程,影响内置的建模功能等)。
通常,捕获链接命令,目标信息配置等将影响此部分的能力。当然,它也与您实现的工具有关(如果您实现了工具,则无法交叉文件,而且这部分内容没有效果)。
作者:Maijun。