裸机程序常识1 _start程序入口标号 -Ttext链接地址作用,如何使用uboot中的函数
来源:互联网 发布:网络电视机和′夏新 编辑:程序博客网 时间:2024/05/21 19:45
_start程序入口标号
1:我们的逻辑程序是直接运行在UBOOT之上的,
2:裸机程序是没有任何库函数的,包括printf
3:裸机程序时直接操作寄存器的
4:裸机程序的入口是_start()函数
连接器会检查是否有_start函数存在,而编译器和连接器是按照函数定义的
顺序来排列代码,所以_start函数作为整个bin文件的入口,类似于main函数,必须定义在所有
其他函数的前面
void _start()
{
}
-Ttext连接地址作用
裸机程序未加链接地址时,只能使用text代码段,如果裸机程序中使用出现了跨端操作(使用text端段以外的段:rodata,data,bss段),必须在链接时手工指定连接地址为实际的运行地址,及uboot命令中go命令运行裸机程序的地址#go 40000000
加了连接地址-Ttext以后才可以跨端操作,可以使用text代码段还可以使用text以外段
如何使用uboot中的函数
1:首先你的uboot必须编译连接了,已经烧写到开发板了
2:这样你的uboot代码里就会生成一个函数连接地址System.map文件,获得uboot中所有函数虚拟地址,由arm-linux-nm命令重定向导出的符号表。
System.map文件内容
c3e00000 T _start 都是虚拟地址,映射后的地址,对应0x43e00000地址c3e00020 t _undefined_instructionc3e00024 t _software_interruptc3e00028 t _prefetch_abortc3e0002c t _data_abortc3e00030 t _not_usedc3e00034 t _irqc3e00038 t _fiqc3e00040 t _TEXT_BASEc3e00044 T _armboot_startc3e00048 T _bss_startc3e0004c T _bss_endc3e00050 T IRQ_STACK_STARTc3e00054 T FIQ_STACK_STARTc3e00058 t start_code………c3e11ad0 T printf
//定义函数指针
static int (*printf)(const char *format,...) = (int (*)(const char *format,...))0xc3e11ad0void _start(){ printf("hello");}
#makefile
TGT := boot.oOBJC := test.oCROSS_COMPILER := arm-linux-CC := $(CROSS_COMPILER)gccOBJCOPY := $(CROSS_COMPILER)objcopyCFLAGS := -ffreestandingLDFLAGS : -static -nostartfiles -Ttext=0x40000000all: $(CC) $(CFLAGS) -c $(OBJC:.o=.c)#替换后缀,编译生成a.out $(CC) $(LDFLAGS) $(OBJC) $(OBJCOPY) -O binary a.out $(TGT:.o=.bin)clean: $(RM) a.out $(OBJC) $(TGT:.o=.bin)
阅读全文
0 0
- 裸机程序常识1 _start程序入口标号 -Ttext链接地址作用,如何使用uboot中的函数
- OK6410裸机hello,world程序,利用uboot中的printf函数。
- tiny6410裸机程序之四、链接地址
- 14.3.1 _start标号
- 如何更改程序入口函数
- 改程序入口地址
- 获取程序入口地址
- gcc如何设置程序的入口函数
- uboot下载配置事项,使用uboot下载裸机程序,并运行
- windows程序入口函数
- Win32程序入口函数
- Win32程序入口函数
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- 使用 NOR Flash 中的supervivi 下载裸机程序到NandFlash
- ARM裸机程序研究 - 编译和链接
- ARM裸机程序研究 - 编译和链接
- ARM裸机程序研究 - 编译和链接
- 使用reaver傻瓜式破解wifi
- JQuery中有关first的选择器
- APUE之格式化time_t得到文件时间信息
- spring boot druid mybatis 多数据源 配置
- 使用weave管理docker网络
- 裸机程序常识1 _start程序入口标号 -Ttext链接地址作用,如何使用uboot中的函数
- 暑期项目实训之健康宝APP(三)
- docker底层实现概览
- Java反射机制之获得构造函数的方法
- 数组指针和指针数组的区别
- Linux上构建Jenkins环境
- Oracle 分组统计函数
- 判断IE浏览器版本
- C++ 二级指针、函数指针与数组复合类型的问题分析