自己动手搭建 Linux 0.12 编译环境 — 编译

自己动手搭建 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


你可能感兴趣的:(自己动手搭建 Linux 0.12 编译环境 — 编译)