我有一个非对称双核(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
用于所有其他部分?
答案 0 :(得分:1)
原则上,命令文件中的KEEP命令应该执行此操作。
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)