uboot的编译及连接过程
来源:互联网 发布:aframe.js下载 编辑:程序博客网 时间:2024/06/05 10:30
前言
想读懂uboot的链接脚本,以及了解链接脚本的使用方法,需要掌握以下基本知识。
1、gcc程序段介绍
一个可执行程序主要包含text段(代码),data段(初始化的全局变量),以及bss段(未初始化的全局变量)。局部变量是在运行过程中分配的,不占用可执行程序的大小。下面举一个例子说明
#include <stdio.h>#include <string.h>int a = 0; //全局未初始化变量,系统默认赋值成0,bss段,4个字节int b = 5, c = 6; //全局已初始化变量, data段,8个字节int main(){ int i = 0; //局部变量 i++; a++; printf("i = %d, a = %d\n", i, a); return 0;}
将上面代码保存成main.c,并将其编译成.o文件:arm-fsl-linux-gnueabi-gcc -c main.c
,-c参数说明只进行编译不进行链接。然后使用以下命令查看各种段的大小
root@silent:/home/lianxi/test# arm-fsl-linux-gnueabi-size main.o text data bss dec hex filename 120 8 4 132 84 main.oroot@silent:/home/lianxi/test#
可以看到代码段大小120个字节,data段大小8个字节(变量b和c的大小),bss段的大小4个字节(变量a的大小),可执行程序的总大小为120+8+4=132。局部变量i,是在代码运行的时候分配的,不影响bin文件的大小!
2、链接脚本的使用
为了说明uboot的编译及链接过程,这里写两个简单的汇编源文件,然后使用自己写的链接脚本将它们链接起来。两个源文件分别是mystart.s,mylowlevel_init.s,链接脚本是myboot.lds,其内容及注释如下。
mystart.s汇编文件内容如下:
b resetb resetb resetb resetb resetb resetb resetb resetreset: mov r0, r1 bl mytest /*在另一个文件中定义*/ mov r1, r2 mov r2, r3 mov r3, r4loop: b loop
mylowlevel_init.s汇编文件内容如下:
.global mytestmytest: mov r0, r1 mov r1, r2 mov pc, lr
myboot.lds链接脚本内容如下:
SECTIONS{ /******************************************** *编译地址从0地址开始, *这个地址可以使用连接器的-Ttext参数重新修改, *在uboot里面是重新定位到了TEXT_BASE这个内存地址。 ********************************************/ . = 0x00000000; /****************************************** *代码段,把mystart.o放在最前面,其他.o的顺序 *不管,使用* (.text)通配! ******************************************/ .text : { mystart.o * (.text) } /***************************************** *已经初始化的全局变量 ****************************************** .data : { * (.data) } /**************************************** *未初始化全局变量,这里放两个标号bss_start *和bss_end,在程序中可以引用,比如可以用来 *计算整个二进制文件的大小。 ****************************************/ .bss_start = .; .bss : { * (.bss) } .bss_end = .;}
然后使用如下命令就可以对以上两个源文件进行编译和链接:
root@silent:/home/lianxi/uboot_lds# arm-fsl-linux-gnueabi-gcc -c mystart.sroot@silent:/home/lianxi/uboot_lds# arm-fsl-linux-gnueabi-gcc -c mylowlevel_init.sroot@silent:/home/lianxi/uboot_lds# arm-fsl-linux-gnueabi-ld -Tmyboot.lds -o myboot mylowlevel_init.o mystart.o //使用链接脚本进行链接root@silent:/home/lianxi/uboot_lds# lsmyboot myboot.bin myboot.lds mylowlevel_init.o mylowlevel_init.s mystart.o mystart.sroot@silent:/home/lianxi/uboot_lds#
链接完成后生成myboot文件,该文件格式为ELF,需要使用如下命令将其转换成bin文件
arm-fsl-linux-gnueabi-objcopy -O binary myboot myboot.bin
可以使用hexdump命令查看myboot.bin和其他.o文件的内容,如:hexdump -C myboot.bin
,对比链接前后的差异。如果想在开发板上跑起来,还需要根据具体的cpu,将myboot.bin制作成相应的格式(一般在前面加个一个头),cpu的类型千千万万种,这里不说了,具体格式应该查看该cpu的datasheet。
- uboot的编译及连接过程
- uboot的编译过程
- uboot的编译链接过程
- UBoot的配置编译过程
- GCC编译及连接过程
- uboot的编译过程分析---Makefile分析
- 编译连接的过程
- Uboot 编译过程
- uboot编译过程
- Uboot 编译过程
- uboot编译过程
- uboot 编译过程
- uboot 编译过程
- uboot 编译过程
- uboot编译链接过程
- uboot编译过程
- Uboot编译过程分析
- uboot 的启动过程及工作原理
- Java设计模式17——模板方法模式
- Java性能调优-JPS、jmap、jconsole等
- tomcat服务器https配置及证书生成(笔记)
- OpenGL缓冲区对象之EBO
- Java 异步回调
- uboot的编译及连接过程
- webpack工作流程分析
- algorithm 1.4.19 Local minimum of a matrix
- appium FAQ
- Eclipse NEON.1 安装最新的CDT插件
- 01UI-day6-160104
- 东软ACM题目的点点滴滴
- w3school之HTML002
- 使用sqlite在unity中创建数据库