按一般正常的顺序我们开发一个嵌入式程序需要经过,预处理, 编译, 汇编,连接四个步骤。对应的命令为:
编译: arm-linux-gcc -c xxx.c -o xxx.o
连接: arm-linux-ld -T user.lsd -o xxx xxx.o
从上面的命令中有些参数不是必须的,如: -T user.lsd ,这个表示在连接的时候应用自己写的连接脚本,不采用系统默认的连接脚本。下面一起来看看怎么自己写连接脚本:
eg: user.lds
OUTPUT_FORMAT("elf32-littlearm","elf-bigarm","elf- littlearm");
OUTPUT_ARCH("arm");
ENTRY("_start");
SECTIONS
{
. = 0x30000000
.text : { *(.text);}
. = ALGIN(4);
.data : { *(.data); }
. = ALGIN(4)
.rodata : {*(.rodate);}
. = ALGIN(4)
__user_sigment_start = .;
.user_sigment : {*(.user_sigment);}
__user_sigment_end = .;
. = ALGIN(4)
__bass_start = .;
.bss : {*(.bass);}
__bass_end = .;
}
从这边配置文件你可以看出,我们定义了自己的段 user_sigment. 当使用自己编写的连接的脚本后,我们就可以定义一些段。非常方便。有的时候你可能要在没有操作系统上调试一些程序,这半个时候连接的程序是不能运行的,因为使用 arm-linux-gcc 编译 和使用arm-linux-ld 连接的后的可执行文件是 ELF 格式。这个是Linux 系统下可执行文件格式,可是我们现在还没有系统,你想能运行吗?所以还要进行相应的去ELF 头工作:
一般我们用:
arm-linux-objcopy xxxx -O binary xxxx.bin
这个时候 xxxx.bin才是我们arm 能运行的格式。我们可以通过u-boot 的 tftp功能下载到我们内存中运行。
eg : tftp 0x30000000 xxxx.bin
go 0x30000000