|
摘段mdk的一个做法,希望有所帮助.
程序的入口点在 C 库中的__main 处,在该点,库代码执行以下操作:
1. 将非根运行区(只读和读写)从其载入地址复制到运行地址。同如果任何区被压缩,将它们从载入地址解压到运行地址。更多
信息,请参阅链接器用户指南 。
2. 清零 ZI 区域。
3. 跳转到 __rt_entry。
库函数__rt_entry() 运行程序步骤如下:
1. 调用 __rt_stackheap_init() 建立栈和堆。
2. 调用 __rt_lib_init() 初始化引用的库函数、初始化语言环境 (locale),如果必要,还将为main()函数建立argc 和 argv。对于
C++,为任何顶级对象调用构造函数。
对于C++,为任何顶级对象调用构造函数作为 __cpp_initialize__aeabi_。更多信息,请参阅 C++ 初始化,建立和销毁 。
3. 调用 main()函数 ———— 应用程序的用户级根。
从main()函数中,应用程序除了调用其他函数,还可调用库函数。有关详细信息,请参阅从 main()函数中调用库函数。从main
()函数中调用库函数。
4. 使用main()函数返回的值调用exit()。
__rt_entry
符号 __rt_entry 是使用ARM C库的程序起始点。在所有分散加载区重定位到其运行地址后,控制将传递到 __rt_entry。
实现
__rt_entry 的默认实现:
1. 建立堆和栈。
2. 通过调用__rt_lib_init初始化 C 库。
3. 调用 main()函数。
4. 通过调用__rt_lib_shutdown关闭 C 库。
5. 退出。
__rt_entry 必须通过调用下列函数之一结束:
exit()
调用atexit()- 注册函数并关闭库。
__rt_exit()
关闭库但不调用atexit()函数。
_sys_exit()
直接退出到运行环境。它不关闭库并且不调用 atexit() 函数。请参阅 _sys_exit()。
|
|