随笔分类 - Linux系统编程
摘要:连接器的功能,是将一个可执行程序所需的目标文件和库文件最终整合为一体。一个程序通常包含传统的三个段,.test, .data, .bss段。连接器的功能就是将各个目标文件个库文件中的三个段进行合并。 重定位的概念 链接而生成的可执行程序虽然是放在文件中的,但当程序运行时需要加载到内存中。各段应该放在
阅读全文
摘要:objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。objcopy使用GNU BFD库去读或写目标文件。objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文件)。objcopy在进行目标文件的转换时,将生成一个临时文件,转
阅读全文
摘要:在嵌入式软件开发中,有时需要知道所生成的程序文件中的段信息以分析问题,或者需要查看c语言对应的汇编代码,此时,objdump工具就可以帮大忙了。obj——object dump:转储。 采用 -d选项,可以查看程序文件的汇编代码: 在使用-d进行反汇编时,另一个很有用的选项就是-S(大写),它的作用
阅读全文
摘要:gcc是“GNU Compiler Collection”的缩写,从字面意思可以知道它是一个编译器集。gcc不止可以编译器c语言,还能用于c++,java,object-C等语言程序。但是在这里,我们的嵌入式学习中,目前只去关注gcc在C语言方面的编译功能。 .什么是交叉编译器 在嵌入式系统开发中,
阅读全文
摘要:make是以从上到下的顺序读入Makefile中的内容的。然而,处理Makefile中的语句却并非完全从上到下。 大体上,make处理一个Makefile分为两个阶段。第一个阶段包含: 1.make读入Makefile,以及Makefile中所包含的其他Makefile; 2.make分析并获得变量
阅读全文
摘要:从Makefile的角度看,一个可以改善编译效率的地方与其中的隐式规则有关。为了了解make的隐式规则,我们把之前的simple项目的Makefile做一点更改,删除生成.o文件的规则(与隐式规则相对应的是,在Makefile中定义的规则称为显示规则)。 我们make一下,还是成功了,这就是make
阅读全文
摘要:现在,是时候在对应目录放入对应文件了: 执行make后报错: 这是在构建依赖文件时,gcc因为找不到foo.h而报错。那是因为foo.h和foo.c放在不同的目录中,这样需要使用gcc的 -I 选项,指定包含路径,所以,更改后的Makefile如下: 这样就完成了支持头文件目录指定
阅读全文
摘要:先手工创建几个文件目录: 接下来先创建code/foo/src目录下的Makefile: 具体和complicated项目的差别可以看书或者上篇随笔。 第一个提示没有那个目录,可以在include的时候加上'-'就可以忽略这个,因为这里对我们的项目没有实质影响,但是新手对于报错或者警告总是不放心,故
阅读全文
摘要:现在我们再对complicated项目做一些更改,增加程序文件间依赖关系的复杂度。 在之前的Makefile不做更改的情况下,我们make一下: 在这次成功编译的基础上,我们再做一些改动,注意在这之前不要执行make clean,否则不能发现新问题。 从结果看,尽管foo.c和main.c都被重新编
阅读全文
摘要:Makefile中存在一个include指令,它的作用如同C语言中的#include预处理指令。在Makefile中,可以通过include指令将自动生成的依赖关系文件包含进来,从而使得依赖关系文件中的内容成为Makefile的一部分。 在此之前,先介绍一下Makefile中的include的用法。
阅读全文
摘要:后面会介绍gcc获得源文件依赖的方法,gcc这个功能就是为make而存在的。我们采用gcc的-MM选项结合sed命令。使用sed进行替换的目的是为了在目标名前加上“objs/”前缀。gcc的-E选项,预处理。在生成依赖关系时,其实并不需要gcc编译源文件,只要预处理就可以获得依赖关系了。通过-E选项
阅读全文
摘要:在大多项目中都会合理设计目录结构来提高维护性,在编译一个项目时会产生大量中间文件,如果中间文件直接和源文件放在一起,就显得杂乱而不利于维护。在为现在这个complicated项目编写makefile之前,我们先给出目录结构需求: 1.将所有的目标文件放在objs子目录中; 2.将最终生成的可执行程序
阅读全文
摘要:通过函数能显著增强Makefile的功能。对于simple项目的Makefile,尽管使用了模式规则,但还是有一件比较麻烦的事情,就是要在Makefile中指明每一个项目源文件。下面介绍几个后期会使用到的函数,更多请参考《GUN Make》。 1.abspath函数 从命名就应该能够猜出它的作用。a
阅读全文
摘要:变量的类别有递归扩展变量和简单扩展变量。只用一个“=”符号定义的变量被称为递归扩展变量。通过下面例子观察递归扩展变量的特点。 从结果来看,递归扩展变量的引用是递归的。 CFLAGS =$(CFLAGS) -O 上面的赋值代码将会造成一个死循环,无限递归。 简单变量扩展使用“ :=”操作符来定义的。对
阅读全文
摘要:特殊变量: 在Makefile中,有两个变量特殊变量会经常用到:MAKE和MAKECMDGOALS。MAKE变量表示的是当前处理Makefile的命令名是什么。当需要在Makefile中运行另一个Makefile时,需要用到这个变量。 MAKECMDGOALS变量表示的是当前构建的目标名。 从测试结
阅读全文
摘要:让你的makefile更专业。 在上一个Makefile所在目录下通过touch命令创建一个clean文件,执行make clean,将发现make总是提示clean文件是最新的,而不是按我们期望的那样对项目文件进行清楚操作。make这样的行为,是因为它将clean当做文件来处理,在当前目录下找到了
阅读全文
摘要:编写makefile,不是一个猛子扎进去试着写一个规则并对之调试,而应该先采用面向依赖关系的思考方法勾勒出makefile要表达怎样的依赖关系,这一点尤为重要。通过不断地练习这种思考方法,才可能达到流畅地编写makefile的能力. 分别编写好两个源文件之后,执行效果如下: makefile文件为:
阅读全文
摘要:输出: 很奇怪,为什么在子进程中调用父进程的PID会是1224,而parent明明是3973啊,有点晕。 为了追踪代码进程,我在上述代码最后加了一个while(1)循环,不加还好,加了之后更晕了。 输出: 啊,为什么又对了啊,加了一个循环阻塞之后,子进程中调用父进程的PID显示和parent一样了。
阅读全文
摘要:一个进程默认打开三个文件描述符: STDIN_FILENO 0STDOUT_FILENO 1STDERR_FILENO 2 man 2 open可查看详情; open函数可以打开或者创建一个文件: #include <sys/types.h>#include <sys/stat.h>#include
阅读全文

浙公网安备 33010602011771号