以下部分资料和硬件参考于韦老师的百问网。
嵌入式linux启动流程
宏观上:
Windows:BIOS -> 启动windows-> 识别C盘 -> 运行APP
Linux:bootloader(常用u-boot) -> 启动Linux内核(内核本身+驱动程序) -> 识别根文件系统(系统必备APP+用户APP) -> 运行APP
微观上:
Reset(硬件复位) -> ROM(内部只读存储器) -> U-boot(bootloader引导程序,设置环境变量,启动kernel) -> Kernel+dtb(内核+设备树) -> Rootfs(根文件系统) -> APP(系统应用+用户应用/usr/bin/)
编译流程
一个C/C++文件需要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)、链接(linking)才能变成可执行文件。
gcc -E -o hello.i hello.c(预处理,获取文件所需要的库,展开宏定义,.c->.i)
gcc -S -o hello.s hello.i(编译,生成汇编指令,检测语法,.i->.s)
gcc -c -o hello.o hello.s(汇编,生成机器码,.s->.o)
gcc -o hello hello.o(链接生成app,.o->.elf)
下列是gcc指令常用的选项
常用选项 | 描述 |
---|---|
-E | 预处理 |
-c | 把预处理、编译、汇编都完成,但不进行链接 |
-o | 指定输出文件 |
-I(大写i) | 指定头文件目录 |
-L | 指定链接时库文件目录 |
-l(小写L) | 指定链接哪一个库文件,如-labc 链接的是libabc.so文件 |
-v | 显示编译细节 |
#include <…>:工具链所指定的目录LIBRARY_PATH下查找,可通过-I添加路径
链接库的创建使用
(一)、制作和使用动态链接库(.so,share object)
gcc -c -o