《编译与链接的知识》word版

《编译与链接的知识》word版

ID:30379218

大小:88.38 KB

页数:15页

时间:2018-12-29

《编译与链接的知识》word版_第1页
《编译与链接的知识》word版_第2页
《编译与链接的知识》word版_第3页
《编译与链接的知识》word版_第4页
《编译与链接的知识》word版_第5页
资源描述:

《《编译与链接的知识》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、编译与链接的知识编译与链接的知识2010-07-0523:52linux下编译hello.c程序,使用gcchello.c,然后./a.out就可以运行;在这个简单的命令后面隐藏了许多复杂的过程,这个过程包括了下面的步骤宏定义展开,所有的#define在这个阶段都会被展开预编译命令的处理,包括#if#ifdef一类的命令展开#include的文件,像上面helloworld中的stdio.h,把stdio.h中的所有代码合并到hello.c中去掉注释gcc的预编译采用的是预编译器cpp,我们可以通过-E参数来看预编译的结果,如:gcc-E

2、hello.c-ohello.i生成的hello.i就是经过了预编译的结果在预编译的过程中不会太多的检查与预编译无关的语法(#ifdef之类的还是需要检查,#include文件路径需要检查),但是对于一些诸如;漏掉的语法错误,在这个阶段都是看不出来的。写过makefile的人都知道,我们需要加上-Ipath一系列的参数来标示gcc对头文件的查找路径小提示:1.在一些程序中由于宏的原因导致编译错误,可以通过-E把宏展开再检查错误,这个在编写PHP扩展,python扩展这些大量需要使用宏的地方对于查错误很有帮助。2.如果在头文件中,#incl

3、ude的时候带上路径在这个阶段有时候是可以省不少事情,比如#includepublic/connectpool/connectpool.h,这样在gcc的-I参数只需要指定一个路径,不会由于不小心导致,文件名正好相同出现冲突的麻烦事情.带路径的方式要多写一些代码,也是麻烦的事情,路径由外部指定相对也会灵活一些.编译这个过程才是进行语法分析和词法分析的地方,他们将我们的C/C++代码翻译成为汇编代码,这也是一个编译器最复杂的地方使用命令gcc-Shello.i-ohello.s可以看到gcc编译出来的汇编代码,现代gcc编译器一般是把预编译

4、和编译合在一起,使用cc1的程序来完成这个过程,编译大文件的时候可以用top命令看一个cc1的进程一直在占用时间,这个时候就是程序在执行编译过程.后面提到的编译过程都是指cc1的处理包括了预编译与编译.汇编现在C/C++代码已经成为汇编代码了,直接使用汇编代码的编译器把汇编变成机器码(注意还不是可执行的).gcc-chello.c-ohello.o这里的hello.o就是最后的机器码,如果作为一个静态库到这里可以所已经完成了,不需要后面的过程.对于静态库,比如ullib,COM提供的是libullib.a,这里的.a文件其实是多个.o通过

5、ar命令打包起来的,仅仅是为了方便使用,抛开.a直接使用.o也是一样的小提示:1.gcc采用as进行汇编的处理过程,as由于接收的是gcc生成的标准汇编,在语法检查上存在不少缺陷,如果是我们自己写的汇编代码给as去处理,经常会出现很多莫名奇妙的错误.链接的过程,本质上来说是一个把所有的机器码文件组合成一个可执行的文件上面汇编的结果得到一个.o文件,但是这个.o要生成二执行文件只靠它自己是不行的,它还需要一堆辅助的机器码,帮它处理与系统底层打交道的事情.gcc-ohellohello.o这样就把一个.o文件链接成为了一个二进制可执行文件.这

6、个地方也是本文讨论的重点,在后面会有更详细的说明小提示:有些程序在编译的时候会出现"linkerinputfileunusedbecauselinkingnotdone"的提示(虽然gcc不认为是错误,这个提示还是会出现的),这里就是把编译和链接使用的参数搞混了,比如g++-ctest.cpp-I././ullib/include-L././ullib/lib/-lullib这样的写法就会导致上面的提示,因为在编译的过程中是不需要链接的,它们两个过程其实是独立的静态链接链接的过程这里先介绍一下,链接器所做的工作其实链接做的工作分两块:符号

7、解析和重定位符号解析符号包括了我们的程序中的被定义和引用的函数和变量信息在命令行上使用nm./testtest是用户的二进制程序,包括可以把在二进制目标文件中符号表输出00000000005009b8A__bss_start00000000004004cctcall_gmon_start00000000005009b8bcompleted.10000000000500788d__CTOR_END__0000000000500780d__CTOR_LIST__00000000005009a0D__data_start000000000050

8、09a0Wdata_start0000000000400630t__do_global_ctors_aux00000000004004f0t__do_global_dtors_aux00000

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。