在C加main函数就是使程序从__main中开始运行,再调用main函数
__main 作用 :1。copy RW (linux 的data段)
2. zero ZI ( bss段)
3. init LIB(初始化库)
__main就干了两件事初始化C/C++所需的资源,调用main函数。
__main可以看成使程序符合C的环境;如C中初始化的全局变量放到data段;而
未初始化的全局变量放到bss段并且默认为0;
这时就可以用__main的作用来解释,初始化的全局变量值被从代码存储位置拷到rw(data)执行位置;
而bss段被清零,所有的值被赋成0;
ADS 中设置了ro-base 和rw-base 及image entry-point对程序的影响
在ADS 的debugRel setting ->ARM linker中设置这三个
三个的作用
ro-base 指代码段在内存中的执行地址
rw-base 指数据段在内存中的执行地址
entry-point 调试时程序入口 所以entry-point只影响axf文件不影响bin文件
下到板子上就没区别了;
下边代码在AXD中调试时
int j = 100;
int main(void)
{
if(j == 100)
printf("j == 100 ok");
return 0;
}
当ro 为0
rw = 10000
entry-point = main时
执行不到printf函数
在存储时ro一般在0地址(和硬件有关),rw在ro后边,当rw设置了之后,__main会
将rw的全局变量值搬移到设置的位置。而entry-point为main跳过__main则rw设置的
位置上没全局变量的值,执行时j自然就不是100了
若rw不设 而entry-point是main的话,rw的执行地址就默认为其存储地址(即在ro后边)
这时执行时j为100,但可能print用到的库没被初始化(__main的作用之一),也用不了;
参考:http://blog.csdn.net/norains/archive/2010/12/03/6052029.aspx