如何从链接器命令文件中定义的符号获取18位代码地址

时间:2013-11-07 00:51:17

标签: linker-scripts bare-metal code-composer

在Code Composer中,您只需在链接器命令文件中定义新符号:

_Addr_start = 0x5C00;
_AppLength  = 0x4C000;

在内存映射和节分配之前。这是在TI的引导加载程序示例中完成的。

然后,您可以在c代码中引用地址(作为整数)

extern uint32_t _Addr_start; // note that uint32_t is fake. 
extern uint32_t _AppLength;  // there is no uint32_t object allocated

printf("start = %X len= %X\r\n", (uint32_t)&_Addr_start, (uint32_t)&_AppLength);

问题是如果你使用'小'内存模型,后一个符号(在0x45C00)会给出链接器警告,因为它试图将它转换为16位指针。

"C:/lakata/hardware-platform/CommonSW/otap.c", line 78: warning #17003-D: 
relocation from function "OtapGetExternal_CRC_Calc" to symbol "_AppLength"
overflowed; the 18-bit relocated address 0x3f7fc is too large to encode in
the 16-bit field (type = 'R_MSP_REL16' (161), file = "./otap.obj", offset =
0x00000002, section = ".text:OtapGetExternal_CRC_Calc")

我尝试使用明确的far指针,但代码编写器无法理解关键字far。我试图使虚拟符号成为一个函数指针,欺骗编译器认为解除引用它会....指针指向代码空间,代码空间模型是“大”而数据空间模型是“小”

1 个答案:

答案 0 :(得分:0)

在我输入问题之前我已经弄明白了!

而不是将符号声明为

extern uint32_t _AppLength; // pretend it is a dummy data

将其声明为

void _AppLength(void); // pretend it is a dummy function

然后指针转换正常,因为&_AppLength现在被假定为far。 (当它声明为整数时,&_AppLength被假定为near并且链接器失败。)