简单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 >
相关文章推荐
- 73.笔记 MySQL学习——C编写MySQL程序六交互式语句执行
- 75.笔记 MySQL学习——C编写MySQL程序八一次执行多条SQL
- 用Python3.4.2+cx_Freeze4.3.3(cxfreeze)编写、打包Linux可执行程序
- 孙鑫VC学习笔记:第十六讲 (三) 用异步套接字编写聊天程序
- 孙鑫vc++ 第七课 笔记 对话框用户界面程序的编写
- ABAP--编写应用服务器执行外部命令的程序示例
- 一个简单的 C 程序文件,经过 0、编写,1、预处理,2、编译,3、链接,终于生成了一个可执行文件
- linux下C程序从编写到执行完整过程
- Python学习笔记02 变量和程序的编写
- 我的QT学习笔记-01-HelloWorld纯代码编写程序
- 《Linux内核分析》第七周笔记 可执行程序的装载
- 编写高质量代码:改善Java程序的151个建议-学习笔记(1-4章)
- 编写一个将输入复制到输出的程序 ,并将其中连续的多个空格用一个空格代替 //学习笔记 编写一个将输入复制到输出的程序 ,并将其中连续的多个空格用一个空格代替 运行环境vs2015 #includ
- 读编写高质量代码--改善java程序的151个建议笔记
- vs2015编写“windows服务”定时执行程序
- c语言编写51单片机中断程序,执行过程是怎样的?
- 程序的编写过程和执行过程
- ABAP--编写应用服务器执行外部命令的程序示例
- Python小任务 - 如何编写指定时间执行的Python小程序
- Python编程入门-第三章 编写程序 -学习笔记