【问题标题】:Is there a way to prevent an added .o file section of being removed from gnu linker garbage collection?有没有办法防止从 gnu 链接器垃圾收集中删除添加的 .o 文件部分?
【发布时间】:2019-11-27 04:54:26
【问题描述】:

我有一个非对称双核 (ARM) 控制器(A5 核和 M4 核)。 我想创建一个二进制文件,我可以将其写入控制器的 RAM/ROM,然后为两个内核执行代码。 我将 M4 代码作为 .o 文件包含在 A5 链接器 ld 中。由于选项--gc-sections,该部分被垃圾收集。有什么方法可以保留此部分,但仍对所有其他部分使用选项 --gc-sections

更详细:

我构建了 m4 代码并从二进制输出中创建了一个 .o 文件。

COMMAND arm-none-eabi-objcopy.exe -O binary --gap-fill 0xff m4_tester.elf m4_tester.bin
COMMAND arm-none-eabi-objcopy.exe -I binary -O elf32-littlearm -B arm m4_tester.bin m4_tester.o

我将这个文件作为一个部分包含在 A5 项目链接器 .ld 文件中:

    SECTIONS
    {  
      .m4stuff : { 
        . = ALIGN(4);
        m4_tester.o
        KEEP(*(.m4stuff))
        . = ALIGN(4);
        } > m4code

    ...
    }

到目前为止,一切正常,在地图文件中看起来像这样:

.m4stuff        0x3f4e0000      0xd68
                0x3f4e0000                . = ALIGN (0x4)
 m4_tester.o()
 .data          0x3f4e0000      0xd68 m4_tester.o
                0x3f4e0000                _binary_m4_tester_bin_start
                0x3f4e0d68                _binary_m4_tester_bin_end
 *(.m4stuff)
                0x3f4e0d68                . = ALIGN (0x4)

现在我还想使用链接器选项--gc-sections。根据它的定义,m4stuff 部分现在是垃圾收集:

.m4stuff        0x3f4e0000        0x0
                0x3f4e0000                . = ALIGN (0x4)
 m4_tester.o()
 *(.m4stuff)
                0x3f4e0000                . = ALIGN (0x4)

有什么方法可以保留此部分,但仍对所有其他部分使用选项 --gc-sections

【问题讨论】:

  • 这个Include binary in ld script 问题有一些其他方法可以做到这一点,可以避免“保持”并且更适合用例(对于可能会看这里的海报或其他人)。

标签: c++ linker arm gnu ld


【解决方案1】:

原则上,您的命令文件中的 KEEP 命令应该这样做。

来自GNU ld manual

3.6.4.4 输入部分和垃圾回收

当使用链接时垃圾收集('--gc-sections')时,标记通常很有用 不应删除的部分。这是通过 用 KEEP() 包围输入部分的通配符条目,如 KEEP((.init)) 或 KEEP(SORT_BY_NAME()(.ctors))。

This SO answer 包含一个使用 KEEP 的示例,可能会有所帮助。

【讨论】:

  • 我现在发现当我添加 KEEP(*(.data)) 而不是 KEEP(*(.m4stuff)) 时它可以工作
【解决方案2】:

在 Jeremy 正确地说 KEEP 命令应该按照我的要求执行后,我检查了我如何错误地使用了 KEEP。

我意识到m4_tester.o 中的数据实际上标记为.data 部分,这是由arm-none-eabi-objcopy.exe 完成的。

通过使用KEEP(*(.data)) 而不是KEEP(*(.m4stuff)) 它可以工作:

    SECTIONS
    {  
      .m4stuff : { 
        . = ALIGN(4);
        m4_tester.o
        KEEP(*(.data))
        . = ALIGN(4);
        } > m4code

    ...
    }

我还发现我可以使用选项 --rename-sectionarm-none-eabi-objcopy.exe 重命名该部分

有了这个,我可以将该部分重命名为一个更独特的名称:

COMMAND arm-none-eabi-objcopy.exe -I binary -O elf32-littlearm -B arm --rename-section .data=.m4data m4_tester.bin m4_tester.o

现在我可以在链接器文件中使用它了:

    SECTIONS
    {  
      .m4stuff : { 
        . = ALIGN(4);
        m4_tester.o
        KEEP(*(.m4data))
        . = ALIGN(4);
        } > m4code

    ...
    }

然后地图文件显示:

.m4stuff        0x3f4e0000     0x8000
                0x3f4e0000                . = ALIGN (0x4)
 m4_tester.o()
 .m4data        0x3f4e0000     0x8000 m4_tester.o
                0x3f4e0000                _binary_m4_tester_bin_start
                0x3f4e8000                _binary_m4_tester_bin_end
 *(.m4data)
                0x3f4e8000                . = ALIGN (0x4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 2018-11-28
    • 2013-03-19
    • 2019-08-05
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多