不同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