TI中文支持网
TI专业的中文技术问题搜集分享网站

关于TI的动态加载实现(DSBT模型的正确编译方式)

你好,我们是北京邮电大学的智能中心的技术团队,目前在TI的TMS320C6678开发板上进行RTEMS操作系统的移植。
希望RTEMS可以支持动态加载功能模块,并决定复用TI工具链提供的RIDL来实现这一模块。

我们将RTMES操作系统作为Base Image,而应用程序作为Library。根据RIDL和TI文档中关于动态链接的支持描述,我们将RTEMS链接时指定为dynamic=exe,而应用程序为dynamic=lib。由操作系统导出系统接口提供给应用程序使用。

目前我们使用RIDL提供的代码,成功加载动态链接库后可以使用库中的函数,而无法访问库中定义的全局变量。经过分析,原因是TI工具链的cl6x编译生成的代码段指令使用的是PC相关的方式,而数据段的DP需要链接器提供额外支持,保证在不同数据段相互访问是DP互不冲突。

通过阅读 C6000 Embedded Application Binary Interface Application Report的第6章Addressing Model for Dynamic Linking,我们获知TI提供了一套叫做DSBT(Data Segment Base Table)的机制(6.7节),来维护不同数据段的DP指针。

很可惜我们一直没找到在bare-metal情况下(所有代码共享同一地址空间),DSBT的正确编译方式。也就是说,选择DSBT模型编译出来的EXE应该具有保存数据段指针DP的能力,并且可以在反汇编的情况下得到确认。

使用的动态加载模块的实现代码,TI的RIDL:https://gforge.ti.com/gf/project/ridl_oss/frs/
RTEMS Base Image编译方式可简化为如下:
cl6x –abi=eabi -mv6600 -dsbt exe.c -z -dynamic=exe -o rtems.exe
(导出函数用脚本指定)
应用程序编译方式:
cl6x –abi=eabi -mv6600 -dsbt lib.c -z -dynamic=lib -o app.obj
虽然使用了dsbt模型,但是RIDL依然使用原来的DP即B14进行lib内部的全局变量访问,没有进行正确切换。
希望可以帮我们理顺TI工具链和RIDL进行配合时,到底是怎么编译出可以访问不同数据段的变量的。

Andy Yin1:

参考链接关于动态链接库的说明:https://e2e.ti.com/support/development_tools/compiler/f/343/p/322903/1124588#1124588

https://e2e.ti.com/support/development_tools/compiler/f/343/p/363516/1283966#1283966

http://processors.wiki.ti.com/index.php/C6000_Dynamic_Loader?keyMatch=DSBT&tisearch=Search-EN

http://processors.wiki.ti.com/index.php/C6000_Dynamic_Linking?keyMatch=DSBT&tisearch=Search-EN

赞(0)
未经允许不得转载:TI中文支持网 » 关于TI的动态加载实现(DSBT模型的正确编译方式)
分享到: 更多 (0)