有没有办法防止从gnu链接器垃圾回收中删除添加的.o文件部分?

时间:2019-07-18 09:32:28

标签: c++ linker arm gnu ld

我有一个非对称双核(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用于所有其他部分?

2 个答案:

答案 0 :(得分:1)

原则上,命令文件中的KEEP命令应该执行此操作。

来自GNU ld manual

  

3.6.4.4输入节和垃圾回收

     

在使用链接时垃圾收集(“ --gc-sections”)时,标记   不应删除的部分。这是通过完成   用KEEP()包围输入部分的通配符条目,如   KEEP((。init))或KEEP(SORT_BY_NAME()(。ctors))。

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

答案 1 :(得分:0)

在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-section的选项arm-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)