使用GCC工具链有那么久了,对其也有所了解了。主要用它来编译ARM平台的一些代码。下面是使用时的一些总结:
1.GCC工具链对文件 命是区分大小的。这个可能与它有关的系统有关,像UINX/LINUX这类系统,文件命是区分大小的。HELLO.C Hello.C hello.c是三个不同的文件。我们可能不会在同一个项目中使用这样三个文件,但如果我们在命名文件命是把如后缀命写错了就可能出问题了。
.C 和.c是不一样的,.C会被认为是C++语言文件,.c是C语言文件
.S 和.s: .S是支持预出来的汇编文件(即支持C语言中的宏),而.s则是纯汇编文件。
其实不只是GCC工具链,有些工具链也是这样,像ARM的ADS工具链也会。这个我在使用WINDOWS下的GCC就碰到过这样的问题。
2.ARM GCC4.0以上使用的是EABI接口来定义函数的调用和参数传递的。在编译Linux应用时要特别注意,要记得内核里面一定要选上支持EABI。编译busybox时就碰到了,发现其跑不起来,出现异常。
3. 使用ARM GCC工具链进行连接时,一定要传递-march=XXX参数,如-march=armv4tl,这个主要告诉链接器去找哪个库,因为你使用的工具链可能 为各种ARM体系编译了标准库,如果没有指定将使用默认的库,有可能与你使用的体系不一样,这个时候就等着郁闷吧
4.编写链接脚本时要特别注意,如果模块之间有依赖而已它们在同一个段节里面,一定要将必须先初始化的模块放在最先,否则会出现异常。像如果你把linux内核各个模块的链接顺序打乱,是会出kernel panic的。不过一般很少碰到这样的情况。