【问题标题】:GCC -T link option issueGCC -T 链接选项问题
【发布时间】:2020-03-19 01:34:51
【问题描述】:

我已经用 arm-none-eabi-gcc 将项目编译为使用命令的对象

arm-none-eabi-gcc --specs=nosys.specs -mcpu=cortex-m7 -mtune=cortex-m7 -Os -g -gdwarf-2  -c $< -o $(@)

当前,当我尝试将其与对象文件夹中的命令链接时,我得到了对象文件

arm-none-eabi-gcc --specs=nosys.specs -mcpu=cortex-m7 -mtune=cortex-m7  -g -gdwarf-2  -nostartfiles -T ..\project.ld  -o target *

但是我遇到了一些奇怪的错误

arm-none-eabi/bin/ld.exe: error: no memory region specified for loadable section `.text.memcmp'

我了解当我使用 -T 选项时,将使用链接脚本文件而不是默认链接脚本。似乎缺少某些内置函数的部分定义。我试图修复那个放

.text.memcmp : {*(.text.memcmp)}

在我的 ld 文件中,这部分似乎已修复,但是我遇到了另一个错误:

arm-none-eabi/bin/ld.exe: error: no memory region specified for loadable section `.text.memset'

所以我不认为将 .text.memset 放入 LD 文件是正确的解决方法,因为在我将 `.text.memset' 放入 ld 文件后,我又遇到了另一个错误:

arm-none-eabi/bin/ld.exe: error: no memory region specified for loadable section `.text._snprintf_r'

我想我错过了 GCC 中为内置函数创建这些默认部分的一些选项

此问题的根本原因是什么以及如何解决?非常感谢!

更新:在下面添加 LD 文件:

MEMORY {
  INIT_SRAM                : ORIGIN = 0x34400000, LENGTH = 0x1FB000
  INIT_SRAM_NO_CACHEABLE   : ORIGIN = 0x3460A000, LENGTH = 0x1DF00
  INIT_SRAM_STACK          : ORIGIN = 0x34628000, LENGTH = 0x15000
  RAM_RSVD               : ORIGIN = .,          LENGTH = 0
  BOOT_TEST           : ORIGIN = 0x43840000  LENGTH = 0x50    
}
SECTIONS 
{
.boot_test                                         : {*(.boot_test)}> BOOT_TEST 
.exception_table                             ALIGN(4)   : > {*(.exception_table)}>INIT_SRAM
.startup                                     ALIGN(4)   : {*(.startup)}
.ramcode                                    ALIGN(4) : > {*(.ramcode)} 
.text ALIGN(4) : { *(.text) }
.ramcode                                     ALIGN(4) : { *(.ramcode) }
.rodata                                     ALIGN(4)    : { *(.rodata) }
.data                                     ALIGN(4)      : { *(.data) }
.bss                                 ALIGN(16)  : { *(.bss) }

_TEST_SESSION_START = .;
.TEST_SESSION :{*(.TEST_SESSION)}
_TEST_SESSION_END = (. - 1);  

_Stack_start                       = .;
__STACK_SIZE                     = SIZEOF(INIT_SRAM_STACK);
__RAM_NO_CACHEABLE_START      = ADDR(INIT_SRAM_NO_CACHEABLE);

} 

【问题讨论】:

  • 我建议您提供链接器脚本的全部内容 - 恕我直言,否则很难回答您的问题。
  • @Frant 我会更新帖子,非常感谢!
  • 谢谢 - 你能提供一个非常、非常小的 C 程序来触发你这边的问题吗?

标签: gcc linker arm ld


【解决方案1】:

将 .text ALIGN(4) : { *(.text) } 更改为 .text ALIGN(4) : { *(.text) (.text.) } 可以修复这个 .text .xxx 缺失问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多