keil armcc6 Undefined symbol __bss_end
时间: 2024-02-27 11:56:07 浏览: 95
在Keil uVision中使用armcc编译器时,出现 "Undefined symbol __bss_end" 的错误,通常是由于编译器没有找到 __bss_end 符号的定义。
解决这个问题的方法是在代码中添加一个链接器脚本文件,以明确告诉编译器 __bss_end 符号的定义。
以下是一个示例链接器脚本文件的内容:
```c
LR_IROM1 0x08000000 0x08040000 { ; load region size_region
ER_IROM1 0x08000000 0x08040000 ; load address = execution address
RW_IRAM1 0x20000000 0x20008000 ; RW data
RW_IRAM2 0x20008000 0x20010000 ; RW data
RW_IRAM3 0x10000000 0x10000800 ; RW data
RW_IRAM4 0x10000800 0x10001000 ; RW data
RW_IRAM5 0x10001000 0x10002000 ; RW data
RW_IRAM6 0x10002000 0x10004000 ; RW data
RW_IRAM7 0x10004000 0x10008000 ; RW data
RW_IRAM8 0x10008000 0x10010000 ; RW data
RW_IRAM9 0x10010000 0x10020000 ; RW data
RW_IRAM10 0x10020000 0x10040000 ; RW data
RW_IRAM11 0x20000000 0x20008000 ; RW data
RW_IRAM12 0x20008000 0x20010000 ; RW data
RW_IRAM13 0x20010000 0x20020000 ; RW data
RW_IRAM14 0x20020000 0x20040000 ; RW data
}
SECTIONS {
.text : {
*(.text)
*(.text.*)
}
.rodata : {
*(.rodata)
}
.data : {
*(.data)
*(.data.*)
}
.bss : {
__bss_start = .;
*(.bss)
*(.bss.*)
*(COMMON)
__bss_end = .;
}
__heap_start = ORIGIN(RAM) + LENGTH(RAM);
__heap_end = __heap_start + 0x1000;
.heap : {
__heap_start = .;
*(.heap)
__heap_end = .;
}
/DISCARD/ : {
*(.comment)
}
}
```
其中,关键部分是在 .bss 段中添加了 __bss_start 和 __bss_end 符号的定义,以明确告诉编译器和链接器 __bss_end 符号的位置。
在Keil uVision中,你可以将这个链接器脚本文件添加到你的项目中,方法是:
1. 在项目根目录下创建一个名为 xxx.scf 的文件,将上述链接器脚本内容复制到该文件中。
2. 在Keil uVision中打开 "Options for Target" 对话框,在 "Linker" 选项卡下的 "Scatter File" 中选择刚才创建的 xxx.scf 文件。
3. 重新编译项目,此时应该不再出现 "Undefined symbol __bss_end" 的错误。
希望这个方法能够帮助你解决问题。
阅读全文