将符号从C文件导入链接描述文件
我在我的C文件中创建了一个名为.co_stack的部分,并有一个名为pulStack的数组来定义该区域.
#define STACK_SIZE 0x00003000 /*!< Stack size (in Words) */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE]; 我定义堆栈部分的gcc链接器脚本如下所示 .co_stack : { _fstackptr = ORIGIN(ram) + LENGTH(ram) - 4; _fstacksize = 0x00003000 * 4; . = (_fstackptr - _fstacksize); *(.co_stack .co_stack.*) } 如您所见,我最终在2个位置定义堆栈大小. 我怎样才能在一个地方定义它? 对于例如 const unsigned long pulStackSize = sizeof(pulStack); 我想在.ld文件中定义_fstacksize为 _fstacksize = STACK_SIZE * 4; 如果我这样做,我得到一个错误,说堆栈溢出48K字节. 如何将.c中的符号导入我的.ld文件? 解决方法
一些解决方案(对于更一般的问题“如何在C和LD脚本之间共享值?”):
1)(注意:对于这个解决方案,我假设您使用的是最新版本的GNU ld,文档在这里:http://www.math.utah.edu/docs/info/ld_3.html) 您可以通过在部分化合物之外定义它(例如,在脚本的最开头)将绝对值与脚本内的符号相关联.您可以通过将其定义为extern来导入C中的符号.请注意,C中您需要的值是符号的地址: 脚本: StackSize = 0x00003000 * 4; /* the size */ .co_stack : { _fstackptr = ORIGIN(ram) + LENGTH(ram) - 4; _fstacksize = StackSize; . = (_fstackptr - _fstacksize); *(.co_stack .co_stack.*) } C: extern long StackSize; #define STACK_SIZE (((size_t)&StackSize)/sizeof(long)) 该解决方案可能对使用所获得的值施加限制,例如,大多数编译器都不接受这样的行: long my_stack[STACK_SIZE]; 但是你不再需要了它,因为你可以在脚本中定义符号“my_stack”并将其导入为“extern long my_stack [];”.无论如何,我认为这是一个可接受的限制. 2)另一种方法是在脚本中定义两个位于开头和该部分的符号,并将它们作为“extern char”导入C中.该部分的大小(以字节为单位)是两个地址的差异.该解决方案具有与(1)相同的限制 3)如果你的链接器不够智能,你可以使用C预处理器在编译时通过像C中那样扩展宏STACK_SIZE来生成合适的脚本.你必须 a)创建包含的文件“stacksize.h” #define STACK_SIZE 0x3000 b)在脚本开头添加#include“stacksize.h”行,并在需要时使用STACK_SIZE.将脚本保存为“ldscript.c”. c)在makefile(或等效的编译过程)中调用预处理器.如果你有GCC,命令是: gcc -P -E ldscript.c -o ldscript.ld 请注意,某些gcc版本对输入文件的扩展名具有特殊含义.所以我建议使用“.c”,这是最安全的方式. d)使用C预处理器生成的文件“ldscript.ld”作为链接脚本 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |