加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C编译涉及哪些内部流程?

发布时间:2020-12-16 09:30:10 所属栏目:百科 来源:网络整理
导读:我有一组* .C文件(嵌入相关).任何人都可以向我详细说明编译时涉及的步骤/进程(内部信息),然后链接以创建最终的可执行文件(我需要有关预处理程序/编译器通常对C src代码执行的操作的信息/步骤) 另外,我只是想了解最终可执行文件的一般结构(例如:标题后跟符号
我有一组* .C文件(嵌入相关).任何人都可以向我详细说明编译时涉及的步骤/进程(内部信息),然后链接以创建最终的可执行文件(我需要有关预处理程序/编译器通常对C src代码执行的操作的信息/步骤)

另外,我只是想了解最终可执行文件的一般结构(例如:标题后跟符号表等等.)

如果有人之前已经讨论过同一主题,请通知我.

__Kanu

解决方法

以 gcc为例,我认为使用的选项是-save-temps.

大致上,步骤是对文件进行传递以提取所有包含并基本上创建要解析的单个文件.如今很多工具都使用一组运行在一组规则(bison,yacc,flex等)上的解析器,目的是解析ascii,将程序变成一种非常宽泛的汇编语言,因为缺少一个更好的术语.

a = a + 1;

可以变成

Load variable named a,size of blah,type unsigned foo
load immediate 1,size blah,unsigned
add
store result a

然后有可能发生的优化,编译器中间语言可能有一个增量函数,并确定增量优于1和add的负载.最终这些优化完成,并且此中间代码通过后端到目标指令集.这通常作为程序集输出,并被送入汇编程序,将其转换为目标文件,并且可以进行目标特定的优化.然后将目标文件提供给链接器,链接器将它们链接在一起.一个程序中的一个函数可能是调用一个不在名为bob的目标文件中的函数,目标文件没有地址或偏移量到达bob它会留下一个洞来插入地址,并且链接器作业是连接所有其中,决定函数bob将在二进制文件中的位置(为其分配一个地址),然后找到调用bob的所有位置以及何时将它们放入内存中插入允许调用bob所需的指令或地址,以便最终结果是可执行的二进制文件.

llvm已经是gcc的竞争对手,可以很好地了解这个过程.你可以把C代码编译成一个中级.从我们的bob功能开始

unsigned int bob ( unsigned int a )
{
    return(a+1);
}

编译成bitcode

clang -c -o bob.bc -emit-llvm bob.c

将bitcode拆解为人类可读的形式

llvm-dis bob.bc

这导致bob.ll

define i32 @bob(i32 %a) nounwind {
entry:
  %a.addr = alloca i32,align 4
  store i32 %a,i32* %a.addr,align 4
  %tmp = load i32* %a.addr,align 4
  %add = add i32 %tmp,1
  ret i32 %add
}

优化代码通常是喜欢从内存中存储和获取的代码,并且当传递到经常存储并从堆栈中提取的函数时.

除了轻松让你看到幕后,llvm还不错,因为你可以在任何级别进行优化,组合对象并在整个程序级别进行优化,gcc将限制你只限制文件或功能级别.所以我们可以优化这个bitcode.

opt -std-compile-opts bob.bc -o bob_opt.bc
llvm-dis bob_opt.bc

而那些额外的商店和货物已经消失,功能的肉仍然存在.

define i32 @bob(i32 %a) nounwind readnone {
entry:
  %add = add i32 %a,1
  ret i32 %add
}

然后使用llc将其转换为所需目标的汇编程序

llc -march=arm bob.bc
cat bob.s
...
bob:                                    @ @bob
@ BB#0:                                 @ %entry
    str r0,[sp,#-4]!
    add r0,r0,#1
    add sp,sp,#4
    bx  lr
...
llc -march=arm bob_opt.bc
cat bob_opt.s
...
bob:                                    @ @bob
@ BB#0:                                 @ %entry
    add r0,#1
    bx  lr
...

是的,那里有很多书.还有许多编译器等.除了llvm,Fabrice Bellard(是qemu人),有一个超级简单,几乎没有编译器生成一个中间文件,你可以检查http://bellard.org/fbcc/埋藏,这是几乎不知道,有趣如果你只是进入编译器的胆量,看看.此外还有一个更好的,已知的,tcc http://bellard.org/tcc/这个特别没有经过汇编程序的后端,操作码直接生成速度和实时(重新)编译.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读