裸机程序常识1 _start程序入口标号 -Ttext链接地址作用,如何使用uboot中的函数
2017-09-02 21:31
471 查看
_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文件内容
//定义函数指针
#makefile
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_instruction c3e00024 t _software_interrupt c3e00028 t _prefetch_abort c3e0002c t _data_abort c3e00030 t _not_used c3e00034 t _irq c3e00038 t _fiq c3e00040 t _TEXT_BASE c3e00044 T _armboot_start c3e00048 T _bss_start c3e0004c T _bss_end c3e00050 T IRQ_STACK_START c3e00054 T FIQ_STACK_START c3e00058 t start_code ……… c3e11ad0 T printf
//定义函数指针
static int (*printf)(const char *format,...) = (int (*)(const char *format,...))0xc3e11ad0 void _start() { printf("hello"); }
#makefile
TGT := boot.o OBJC := test.o CROSS_COMPILER := arm-linux- CC := $(CROSS_COMPILER)gcc OBJCOPY := $(CROSS_COMPILER)objcopy CFLAGS := -ffreestandi 4000 ng LDFLAGS : -static -nostartfiles -Ttext=0x40000000 all: $(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)
相关文章推荐
- [转]php中使用ignore_user_abort()函数后,如何停止后台运行的程序?
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- C如何使用固定地址来访问函数
- 【ios】论自定义的控件如何在xib中使用,自定义控件在xib中的初始化入口函数
- 如何使用Visual Studio2008从命令行编译链接最基本的程序——“Hello World”
- 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
- 程序如何使用cmake链接至libcaffe.so库文件
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性
- x86代码移植到x64下,如何访问虚表和虚函数指针,使用地址调用虚函数
- 如何让 Qt 的程序使用 Sleep(主线程没有Sleep函数,但线程可用自带的保护函数Sleep)
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- uboot下载配置事项,使用uboot下载裸机程序,并运行
- 如何使用Visual Studio2008从命令行编译链接程序
- 如何获得RVA(相对虚地址)的值,从而得到一个程序的入口点
- 查看正在运行的动态链接的程序中,某个动态库中函数的虚拟地址
- 如何为WPF添加Main()函数 程序入口点的修改
- 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)