TI ARM Clang链接器自定义段分配顺序不符预期的问题排查与解决请求
TI ARM Clang链接器自定义段分配顺序不符预期的问题排查与解决请求
问题背景
我在使用TI ARM Clang链接器配置自定义内存段时,遇到了段分配顺序完全不符合预期的问题。我原本期望.MY_SECTION_1能从0x41C00000地址开始分配,紧接着再分配.MY_SECTION_2,但实际生成的map文件显示两者的分配顺序完全相反。
我的链接器初始配置
我最初编写的链接脚本片段如下:
MEMORY { TEST_SECTION ( RWIX ) : ORIGIN = 0x41C00000 , LENGTH = 0x00007800 } --retain="*(.MY_SECTION_1)" --retain="*(.MY_SECTION_2)" .MY_SECTION_1 : {} palign(16) > TEST_SECTION .MY_SECTION_2 : {} palign(16) > TEST_SECTION
实际生成的Map文件关键内容
从map文件的段分配映射可以明确看到,.MY_SECTION_2被优先分配到了起始地址,之后才是.MY_SECTION_1:
SEGMENT ALLOCATION MAP run origin load origin length init length attrs members ---------- ----------- -------- ----------- ----- ------- 41c00000 41c00000 000006b0 00000000 rw- 41c00000 41c00000 00000380 00000000 rw- .MY_SECTION_2 41c00380 41c00380 00000330 00000000 rw- .MY_SECTION_1 .MY_SECTION_2 * 0 41c00000 00000380 UNINITIALIZED 41c00000 0000037e host.lib : testfile_Cfg.obj (.MY_SECTION_2) 41c0037e 00000002 --HOLE-- .MY_SECTION_1 * 0 41c00380 00000330 UNINITIALIZED 41c00380 00000328 host.lib : test1.obj (.MY_SECTION_1) 41c006a8 00000008 --HOLE-- ... LINKER GENERATED COPY TABLES __TI_cinit_table @ a513d14c records: 4, size/record: 8, table size: 32 .data: load addr=a513d110, load size=00000015 bytes, run addr=a513d180, run size=00001080 bytes, compression=lzss .MY_SECTION_1: load addr=a513d134, load size=00000008 bytes, run addr=41c00380, run size=00000330 bytes, compression=zero_init .bss: load addr=a513d13c, load size=00000008 bytes, run addr=a513e200, run size=00000392 bytes, compression=zero_init .MY_SECTION_2: load addr=a513d144, load size=00000008 bytes, run addr=41c00000, run size=00000380 bytes, compression=zero_init
我尝试过的解决方法及遇到的错误
为了强制指定.MY_SECTION_1的起始地址,我修改了链接脚本,尝试使用load命令固定地址:
.MY_SECTION_1 : {} palign(16) load = 0x41c00000 > TEST_SECTION .MY_SECTION_2 : {} palign(16) > TEST_SECTION
但这样操作后,链接器直接抛出了警告和错误:
warning: specific address 0x1 overrides alignment of 16 for ".MY_SECTION_1" error: errors encountered during linking;
我的疑问
- 为什么默认情况下,段的分配顺序和我在链接脚本中定义的顺序完全相反?
- 我尝试的
load命令用法哪里出现了错误? - 正确的配置方法应该是什么,能让
.MY_SECTION_1从0x41C00000开始分配,后续紧接着分配.MY_SECTION_2?
麻烦各位帮忙分析问题原因,提供可行的解决办法,非常感谢!
内容来源于stack exchange
相关产品推荐
相关产品推荐

