【问题标题】:Loading symbol file while linking链接时加载符号文件
【发布时间】:2015-05-05 05:13:40
【问题描述】:

我正在尝试在链接时加载符号文件。我提供了 symbol.txt 文件以及我链接的其他库。这是我尝试过的两件事。

  • 第一,我提供的符号文件与 arm-none-eabi-nm 的输出完全相同,但这在第 1 行本身返回语法错误。

  • 第二,我稍微改变了格式。我在文件开头添加了#< SYMDEFS >#,并进行了更改以遵循 ARM 的 symdef 文件格式。这给了我错误

文件无法识别:文件格式无法识别 collect2.exe:错误:ld 返回 1 个退出状态

有没有人有将符号文件加载到链接器(arm-none-eabi-ld)的经验?如果是,请帮我弄清楚我在上面遗漏了什么。

我的符号文件的前几行如下:

"##" ;这里没有",我用它来去掉标记
0x00000000 A __heap_size
0x00000000 R __vect_table
0x00000000 R __vector_table
0x00000074 A ___data_size

我知道这种格式适用于 armlink。

【问题讨论】:

  • “符号文件”是什么意思?您是指链接器脚本吗?后者是 GNU ld 的文件,其中通常包含 __heap_start etl 之类的符号。人。已定义。
  • 符号文件是指 arm-none-eabi-nm 的输出,而不是链接器脚本文件。

标签: c linker arm static-linking symbols


【解决方案1】:

如果您使用的是 GNU 链接器,只需创建一个类似这样的文件并将其包含在链接器命令行中:

__intstk_top__ = __syspage_base__ + 0x2000;
__abortstk_top__ = __syspage_base__ + 0x3000;
__undefinedstk_top__ = __syspage_base__ + 0x4000;
__svcstk_top__ = __syspage_base__ + 0x6000;
__sysstk_top__ = __syspage_base__ + 0x8000;
__boot_pgd__ = __syspage_base__ + 0x8000;
__boot_pgd_physical__ = __syspage_physical_base__ + 0x8000;
__boot_pte0__ = __syspage_base__ + 0xC000;
__boot_pte0_physical__ = __syspage_physical_base__ + 0xC000;
__boot_pte1__ = __syspage_base__ + 0xD000;
__boot_pte1_physical__ = __syspage_physical_base__ + 0xD000;
__syspage_physical_base__ = 0x48000000;
__syspage_base__ = 0x80000000;
__syspage_size__ = 0xE000;
__device_base__ = 0xC0000000;
__user_limit__ = 0x7FFFFFFF;
__virtual_offset__ = 0x80000000 - __syspage_physical_base__;
__dev_offset__ = 0xC0000000;
__mmu_enabled__ = 1;
__kernel_base__ = __syspage_base__;

如您所见,符号可以定义为常量或可以在链接时解析的简单表达式。

【讨论】:

  • 感谢您的回复。但是,这对我不起作用。我在第 2 行收到错误“文件格式无法识别;视为链接器脚本”和“语法错误 collect2.exe:错误:ld 返回 1 退出状态”。修改后的符号是这样的: __heap_size = 0x00000000 __vect_table = 0x00000000 __vector_table = 0x00000000 ___data_size = 0x00000074 __stack_size = 0x00000400
  • 你是把分号放在每一行的末尾吗?
  • 是的!有效。我上次错过了分号。谢谢理查德。感谢 vim 的强大功能,我很快就能将标准符号文件转换为您提到的格式。但这意味着我需要一个构建后脚本来将 arm-none-eabi-nm 生成的符号文件转换为这种格式。您是否知道是否有在链接时加载实用程序生成的符号文件本身的选项/技术?
  • 我有超过 1000 个需要导入的符号。而且因为这是一个实用程序生成的文件,我认为相同的格式应该适用于同一工具链下的另一个实用程序(链接器)。无论如何,多亏了你,我很高兴至少有一种方法可以做到这一点,使用这个工具链。
  • 试试这个(用你的目标文件名替换“elk”。
猜你喜欢
  • 2016-01-11
  • 2015-07-31
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多