自己动手搭建 Linux 0.12 编译环境
— 编译篇
作者:MTK_蛙蛙鱼
写作时间:2013年11月13日
更新时间:2013年11月18日
CentOS- 6.4版本:
Linux localhost.localdomain 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 UTC 2013i686 i686 i386 GNU/Linux
GCC版本:
Using built-in specs.
Target: i686-redhat-linux
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
一、make dep
二、make
1. static、extern和inline之间的关系理解(GCC行为)
static
1. 隐藏,如果在全局变量或函数前面加上它即可对外部文件进行隐藏。
2. 持久性,可以保持局部变量的持久性,因为它被存进了数据区段。
3. 会被初始化为0,这个是由于数据区段会被初始化为0的缘故。
extern
其实对于全局变量或函数都默认具有了extern的特性,即可以被外部文件进行引用。
inline
是针对函数设计的,即对于文件内来说它会被内联展开来编译,对于外部文件来说和一个普通的extern函数无差异。
注意,如果需要引用该内联函数的指针,那么内联函数会生成独立的汇编码。
static inline
加上static关键字后的内联函数,其实就是具有了隐藏的特性,对外部文件就是不可见的。
extern inline
加上extern关键字后的内联函数,理解上有不同,它不会产生独立的汇编码只能被内联使用,你可以当做它一个宏定义,如果出现想引用该函数指针的时候,那么必须去寻找与之同名的全局函数。
资料链接:1. static的作用 2. C语言inline详细讲解
2. warns
—— warning: conflicting types for built-in function
就是说你写的函数是GCC内建的函数导致了冲突,简单的解决办法是在编译(还没有开始链接哦~)的时候加上-fno-builtin or -fno-builtin[-function name]来表明老子不要你内建的函数。
如果想狠一点,你也可以把函数重命名也可以消除冲突。
——warning: suggest parentheses around assignment used as truth value
加上编译选项-Wno-parentheses,一些括号范围的使用限制。
——warning: assignment makes integer from pointer without a cast
赋值类型不一致。
——warning: function definition has qualified void return type
可以不用理睬,因为在ISO C的标准中对于这样的情况是必须会提示的,即使使用-Wignored-qualifiers也无法避免,下面是gcc manual的说明:
-Wignored-qualifiers (C and C++ only)
Warn if the return type of a function has a type qualifier such as
"const". For ISO C such a type qualifier has no effect, since the
value returned by a function is not an lvalue. For C++, the
warning is only emitted for scalar types or "void". ISO C
prohibits qualified "void" return types on function definitions, so
such return types always receive a warning even without this
option.
This warning is also enabled by -Wextra.
——warning: 'xxx' may be used uninitialized in this function
man gcc,-Wuninitialized,自动变量被使用却首先没有初始化,就是个提醒而已,你可以认为自己写的code很good,可以去掉该提醒-Wno-uninitialized。
——warning: indirect call without '*'
汇编中call和jmp指令在操作数前加‘*’表示绝对地址,反之则是相对地址。
——warning: cannot find entry symbol _start; defaulting to 00000000080480a0
这个提醒属于制作system的问题,我们需要去学习链接相关的知识。
3. errors
【略】
end