您的位置:首页 > 其它

简单uboot下可执行程序编写笔记

2010-11-16 23:01 302 查看
[leftover-crazy@leftover-crazy bootloaderprj]$ vi hellobootloader1.c


代码如下

void (*show)(char *, ...);
int main(int argc, char *argv[])
{
show = 0x33f9303c;
show("Hello u-boot!/n");
return 0;
}


*uboot下没有库函数可用 所以不可以通过调用lib库的标准printf函数实现打印输出

*变相通过uboot本身实现的printf函数 利用函数指针进行printf函数调用

*该代码仅有一个代码段为main 可用objdump -d 查看

*其中的 show = 0x33f9303c;是通过查看uboot的System.map得到的 各个版本可能不同

编译:

[leftover-crazy@leftover-crazy bootloaderprj]$ arm-2440-linux-gnueabi-gcc -c hellobootloader1.c -o hellobootloader1.o
hellobootloader1.c: In function 'main':
hellobootloader1.c:4: warning: assignment makes pointer from integer without a cas


*为了链接时指定text段 必须手动分开编译即链接过程 采用gcc -c 选项进行编译 ld链接

链接:

[leftover-crazy@leftover-crazy bootloaderprj]$ arm-2440-linux-gnueabi-ld -Ttext=0x30000000 hellobootloader1.o -o hellobootloader1
arm-2440-linux-gnueabi-ld: warning: cannot find entry symbol _start; defaulting to 30000000


*Ttext 是程序的代码段 详细了解可以参考关键字 装载域 运行域 的相关解释

*不指定代码段的话 编译器将给与自动分配代码段地址 也可以理解为运行域是未知的 可能超出寻址范围

去头:

[leftover-crazy@leftover-crazy bootloaderprj]$ arm-2440-linux-gnueabi-objcopy -I elf32-littlearm hellobootloader1 -O binary hellobootloader1.bin


*-I 是输入文件 格式是elf32 小端 -O是输出文件为binary 即二进制

*去头主要是为了去除文件格式信息 去头后文件不包含格式信息 段信息等内容 只是由机器指令的二进制编码构成

*不去头的话 采用go指令将无法执行 go以后遇到的第一条指令将是文件的格式头

tftp下载到sdram:

Fantasy >tftp 30000000 hellobootloader1.bin
ERROR: resetting DM9000 -> not responding
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.1.10; our IP address is 192.168.1.11
Filename 'hellobootloader1.bin'.
Load address: 0x30000000
Loading: #
done
Bytes transferred = 104 (68 hex)
Fantasy >


通过go执行:

Fantasy >go 30000000
## Starting application at 0x30000000 ...
Hello u-boot!
## Application terminated, rc = 0x0
Fantasy >
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐