2016-07-07 13 views
0

它是关于GNU Linker。如何通过链接器脚本在特定地址放置符号?

我有一个(让我们说)变量名为myVar。现在我想将我的变量放在内存中的某个地址处。

我使用的编译器有一个__attribute__ ((blablabla))这个技巧。不过,我决定使用链接器脚本。

因为现在我总算变量存放在特定的地址与链接脚本就像这样:

myVar = 0xDEAD; 

而且它的实际工作。问题在于链接器很愚蠢,偶尔会在我的地址上部署其他变量。在某种程度上,他们的行为就像是在union

我认为,不知何故,我需要告诉链接器,这个地址与这个长度已被占用,不应该被触及。

无论如何,我想你明白了。任何帮助?

+0

这种paraibles通常用于在OS或裸周边模块 - 金属嵌入代码。对于他们来说正确的地方是在一个包含宏的头文件中。在链接器文件中,它们占用的地址空间不适用于常规变量。所以,你的基本系统设计出了问题。看[问]并提供[mcve]。 – Olaf

+0

你是什么意思的常规变量? – Hairi

+0

由编译器和链接器管理的变量,而不是绝对地址。 – Olaf

回答

2

我会开始合并c源代码和链接器。

定义一个新的部分到连接器脚本,如:

MEMORY 
{ 
    ... 
    my_data  (rwx) : ORIGIN = your_start_addr, LENGTH = section_length 
} 

SECTIONS 
{ 
    /* ... */ 

    .myVarSection section_address : 
    { 
    KEEP(*(.mySection)) 
    } > my_data 

    /* ... */ 
} 

然后就可以在象源文件定义的变量:

uint16_t __attribute__((section (".mySection"))) myVar = 0xDEAD; 
+0

你想为每个绝对变量设置一个单独的部分吗? – Olaf

+0

@Olaf似乎OP正试图达到这样的“结束”的阈值。当然,不是我在不同的绝对地址上定义多个变量的解决方案。 – LPs

+0

这就是为什么我要求一个MCVE。这个问题不是很清楚。它有XY问题的忧郁症。 – Olaf

相关问题