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

[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 >  

你可能感兴趣的:(function,Integer,application,Go,hex,编译器)