问题已经自己解决。
把方法贴上来,希望对需要的朋友们有用。
在使用分散加载文件后,如果用__at指定某一函数或者某一变量的存放地址是无效的,即使能编译通过也起不到作用。
要定位函数或变量的地址,可以通过下面几种方法:
要将函数或变量放在特定地址中,必须将其放在自己的节中。 可以使用几种方法来执行此操作:
将函数或数据项放在其自己的源文件中。
◆使用 --split_sections 编译器选项可为源文件中的每个函数分别生成一个 ELF 节。 请参阅《编译器参考指南》中第 2-103 页的--split_sections。
对于一些函数,此选项将稍微增大代码的大小,因为它减小了函数之间共享地址、数据和字符串文字的可能性。 但是,通过指定 armlink --remove 以允许链接器删除未使用的函数,这有助于减小最终映像的总大小。
◆使用 __attribute__((section(”name”))) 可创建多个命名节。请参阅《编译器参考指南》中第 4-45 页的__attribute__((section))。
◆使用汇编语言中的 AREA 指令。 在汇编代码中,最小的可定位单元是 AREA。 有关详细信息,请参阅《汇编器指南》。
◆使用 __attribute__((section(”name”))) 可创建多个命名节。请参阅《编译器参考指南》中第 4-45 页的__attribute__((section))。
我是采用上面这种方法来实现函数定位的,具体操作如下:
1、先为需要定位的函数设置节名,这里我以main主函数为例:
void __attribute__ ((section ("mymain-这里随便定义英文名,我以mymain为名"))) main (void)
2、在分散加载文件中设定main存放地址:
APP_LOAD 0x00050000 OVERLAY
{
MAIN_EXE +0
{
app.o(mymain) ;;app.o就是我的main主函数所在的C文件模块app.c
;;mymain就是刚才定义的一个节其实就是代表main主函数
;;这里可以看到mymain的节(也就是main函数)
;;被放在地址0x00050000处,这样就完成了函数地址定位的功能
}
APP_EXE +0
{
*(+RO)
}
}
|