不同CPU指令集添加编译选项

今天在处理程序在不同CPU架构,不同的指令集上编译的运行问题,其实没跨平台,算不上交叉编译,但需要将gcc按照不同cpu指令集在编译过程中提供给gcc选项,基本内容可以从gcc的man page里查找,下面是man里根据SSE4.2为标准的部分内容

core2
       Intel Core 2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 a[......]

Read more

多个目标

目前为止,Makefile都是执行一些简单的编译工作,这对于软件来说根本无法给用户使用,最终可执行程序以及目标文件都会安装到系统目录当中,这时候Makefile里仅仅只有目标文件的依赖关系和规则远远不够,至少应该还有clean和install

在初学Linux的时候,经常碰到make报错,fix了bug,修改了源代码,但是依旧编译不通过,但是make clean或者make distclean之后[……]

Read more

Makefile中的宏

假如一个Makefile需要管理的是很多个源文件构成的工程,还一个一个地列出依赖关系,库文件和源文件,估计都要吐血了,所以就需要宏了

Makefile文件中的宏用来设置编译选项,在开发阶段一般不会进行优化,而是将debug信息给添加进去;而release的时候,却正好反过来,不包含任何调试debug信息,符号表之类的,而是让可执行程序性能优化得越快越好

Linux下编译器gcc,其它类UNIX系统[……]

Read more

make

make命令内置了很多智能的机制,除此还提供一个Makefile文件,来告诉它处理流程,文件由一组依赖关系和规则组成,而每个依赖关系由一个目标和该目标的一些依赖组成,规则描述了这些依赖如何创建目标;make命令会先读取Makefile文件内容,确定目标文件,然后会创建一些中间目标,最终根据Makefile确定目标文件创建过程以及调用顺序

make命令一般有三个选项

-k:make执行时如果出错仍然[……]

Read more

目标文件

目标文件从结构上来看,已经是编译后的可执行文件格式,只是还没有经过链接过程,其中可能有些符号或者有些地址还没有被调整,其实本身就是按照可执行文件格式存储的,只是与真正的可执行文件在结构上稍有不同

现在流行的可执行文件格式(Executable)主要包括Windows下的PE(Portable Executable)和Linux下的ELF(Executable Linkable Format),都是[……]

Read more

静态链接小述拼装

一个程序被分割成很多个模块之后,这些模块之间最后如何组合形成一个单一的程序可归结为模块之间如何进行通信的问题,比如模块间的函数调用,模块间的变量访问;函数访问必须知道目标函数的地址,变量访问也必须知道目标变量的地址,所以归根结底还是模块间符号的引用;模块间依靠符号来通信

符号(Symbol)是表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的起始地址

一个复杂的程序,将每个源代码[……]

Read more

编译过程

平时用的GCC实际上是一些后台程序的包装,假如手动编译一个新版本的gcc以及它的所有依赖模块,单核估计会耗费你几十分钟的时间,安装过程中可以看到as,ld之类的可执行程序安装到系统目录下,实际上gcc就是这些程序的包装,它根据不同的参数去调用相应的程序,比如预处理编译程序cc1,汇编器as,链接器ld

编译过程是将高级语言翻译成机器语言,应该算是程序完成过程最关键的地方,结合《程序员的自我修养》,[……]

Read more

编译系统4:链接

hello.c程序当中调用了printf,它是标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.o程序中,链接器ld就是负责处理这种合并,最终得到a.out这个可执行的目标文件,它可以被加载到内存当中,由系统来执行

不过链接过程通常让人很费解,为什么汇编器不直接输出可执行文件,而是输出了一个目标文件呢[……]

Read more

编译系统3:汇编

汇编器as将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中,它是一个二进制文件,它的字节编码是机器语言指令而不是字符,所以如果文本编辑器中打开hello.o会看到一堆乱码

汇编过程将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令,所以汇编器的汇编过程相对于编译器来说相对简单,它没有复杂的语法,也没有语义,[……]

Read more