相关疑难解决方法(0)

为什么STM32 gcc链接程序脚本会自动丢弃以下标准库中的所有输入节:libc.a,libm.a,libgcc.a?

从任何自动生成的STM32CubeMx生成的链接器脚本的底部:

/* Remove information from the standard libraries */
/DISCARD/ :
{
  libc.a ( * )
  libm.a ( * )
  libgcc.a ( * )
}
Run Code Online (Sandbox Code Playgroud)

从GNU Binutils ld(链接程序脚本)手册中,3.6.7输出节丢弃

特殊输出节名称“ / DISCARD /”可用于丢弃输入节。分配给名为“ / DISCARD /”的输出节的任何输入节均不包含在输出文件中。

这3个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?

其他感兴趣的STM32链接器脚本主题:

  1. 在C中访问链接描述文件变量的“值”是否存在未定义的行为?
  2. 如何从C获取ld链接程序脚本中定义的变量的值

c linker stm32 ld binutils

5
推荐指数
1
解决办法
266
查看次数

是否在 C 中访问链接描述文件变量未定义行为的“值”?

GNU ld(链接器脚本)手册第3.5.5源代码参考有一些关于如何访问 C 源代码中的链接器脚本“变量”(实际上只是整数地址)的非常重要的信息。我用了这个信息。广泛使用链接器脚本变量,我在这里写了这个答案:How to get value of variable defined in ld linker script from C

然而,很容易做错,并尝试访问链接描述文件变量的(错误地)而不是它的地址,因为这有点深奥。手册(上面的链接)说:

这意味着,你不能访问 链接脚本定义符号的-它没有价值-所有你能做的就是访问的地址链接脚本定义的符号。

因此,当您在源代码中使用链接描述文件定义的符号时,您应该始终获取该符号的地址,并且永远不要尝试使用其 value

问题:那么,如果您确实尝试访问链接描述文件变量的value,这是“未定义的行为”吗?

快速复习:

想象一下在链接脚本(例如:STM32F103RBTx_FLASH.ld)中你有:

/* Specify the memory areas */
MEMORY
{
    FLASH (rx)      : ORIGIN = 0x8000000,  LENGTH = 128K
    RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K
}

/* Some custom variables (addresses) I intend to access …
Run Code Online (Sandbox Code Playgroud)

c linker ld linker-scripts binutils

5
推荐指数
1
解决办法
2453
查看次数

如果不使用const,则在RAM中进行不必要的分配,尽管放置在Flash绝对地址中

我正在使用GCC。我在Flash中通过.ld链接器文件创建了一个SECTION,我在其中放置了一些数据(704字节),并带有指令__attribute__((section... Data似乎在Flash中,但是如果我const在声明数据时不使用关键字,则会在RAM中分配相同的空间。

如果我不使用constRAM,则不会使用-但我注意到增加了对Flash的使用,因为它被分配了两次!

链接器文件:

FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 14K
USER_DATA_FLASH (rx)      : ORIGIN = 0x8003800, LENGTH = 2K
}

SECTIONS
{ /* placing my named section at given address: */
  .my_block 0x8003800 :
 {
  KEEP(*(.UserDataSector)) 
 } > USER_DATA_FLASH
}
Run Code Online (Sandbox Code Playgroud)

数组声明具有初始化程序:

mytab_type  __attribute__((section (".UserDataSector "))) progr16[16]=
{ 
    { {LIST1,LIST2....
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我没有使用const。假设这progr16被强制放在闪存中,并且如果在调试过程中我使用内存浏览器检查的话,它看起来确实在那里。但它似乎也占用RAM

FLASH    RAM
text     data    bss   dec     
9268     772     1948  11988    
Run Code Online (Sandbox Code Playgroud)

如果我添加const关键字:

FLASH    RAM
text     data    bss …
Run Code Online (Sandbox Code Playgroud)

c attributes gcc const stm32

5
推荐指数
1
解决办法
125
查看次数

标签 统计

c ×3

binutils ×2

ld ×2

linker ×2

stm32 ×2

attributes ×1

const ×1

gcc ×1

linker-scripts ×1