Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将符号从C文件导入链接器脚本_C_Gcc_Linker_Ld - Fatal编程技术网

将符号从C文件导入链接器脚本

将符号从C文件导入链接器脚本,c,gcc,linker,ld,C,Gcc,Linker,Ld,我在我的C文件中创建了一个名为.co_stack的部分,并有一个名为pulStack的数组来定义该区域 #define STACK_SIZE 0x00003000 /*!< Stack size (in Words) */ __attribute__ ((section(".co_stack"))) unsigned long pulStack[STACK_SIZE]; 如您所见,我最终在两个地方定义了堆栈大小。 一个是我的.c文件中的堆栈大小,

我在我的C文件中创建了一个名为.co_stack的部分,并有一个名为pulStack的数组来定义该区域

#define STACK_SIZE       0x00003000      /*!< Stack size (in Words)           */
__attribute__ ((section(".co_stack")))
unsigned long pulStack[STACK_SIZE];
如您所见,我最终在两个地方定义了堆栈大小。 一个是我的.c文件中的堆栈大小,另一个是我的.ld文件中的堆栈大小

我如何在一个地方定义它

例如。 我想创建一个变量pulStackSize,如下所示

const unsigned long pulStackSize = sizeof(pulStack);
我想将.ld文件中的_fstacksize定义为

_fstacksize = STACK_SIZE * 4;
如果我这样做,我会得到一个错误,说堆栈溢出了48K字节

如何将符号从.c导入.ld文件

一些解决方案(对于更一般的问题“如何在C和LD脚本之间共享值?”):

1) (注意:对于这个解决方案,我假设您使用的是最新版本的GNU ld,文档如下:)

您可以通过在复合部分外部(例如,在脚本的最开始处)定义符号,将绝对值与脚本内部的符号相关联。通过将符号定义为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:

此解决方案可能会对获取的值的使用施加限制,例如,大多数编译器不接受这样的行:

long my_stack[STACK_SIZE];
但是您不再需要它了,因为您可以在脚本中定义符号“my_stack”,并将其导入为“extern long my_stack[];”。我认为这是一个可以接受的限制

2) 另一种方法是在脚本中定义两个符号,分别位于节的开始和结束处,并将它们作为C中的“extern char”导入。节的大小(以字节为单位)是它们两个地址的差值。此解决方案具有(1)的相同限制

3) 如果您的链接器不够智能,您可以使用C预处理器在编译时通过扩展宏堆栈大小(如C中所示)来生成合适的脚本。您必须

a) 创建包含以下内容的文件“stacksize.h”

#define STACK_SIZE 0x3000
b) 在脚本开头添加行#include“stacksize.h”,并在需要时使用STACK#u SIZE。将脚本另存为“ldscript.c”

c) 在makefile(或等效编译过程)中调用预处理器。如果您有GCC,则命令为:

gcc -P -E ldscript.c -o ldscript.ld
请注意,一些gcc版本对输入文件的扩展名有特殊的意义。所以我建议使用“.c”,这是最安全的方法


d) 使用C预处理器生成的文件“ldscript.ld”作为链接脚本

堆栈大小没有符号,它是一个宏。您可以使用EXTERNThanks将答案导入到ld文件中。(1) 和(2)不适用,因为我需要在向量表中定义堆栈的最后一个地址。我不能这样做,因为你在(2)中提到的原因。我尝试执行(3),但没有生成ldscript.ld。而是显示一条消息“arm-none-eabi-gcc.exe:警告:ldsource.script:链接器输入文件未使用,因为链接未完成”。因此(3)也没有帮助。最后(4)似乎是对的。但是我发现“=\u fstackptr-SIZEOF(.co_stack);”不起作用,因为SIZEOF()只适用于输出节,而我需要输入节的大小。@dexkid-Uhm,尝试了(3)个不同的输入文件扩展名。除“.ld”(作为输入)外,所有工作正常。您的gcc版本可能将“.source”扩展解释为ld脚本!我的确实使用了“.src”和“.ld”。我建议您为输入文件选择一个不同的扩展名(例如“.c”,尽管这很奇怪)。如果你成功了,请告诉我。(3)为我使用了.c扩展名而不是.src。谢谢你的指导。好的,我会在回答中更改文件扩展名。非常感谢。
#define STACK_SIZE 0x3000
gcc -P -E ldscript.c -o ldscript.ld