ZHCU947E June 2015 – January 2023
此示例链接了名为 demo.c.obj、filter.c.obj、tables.c.obj 和 lex.c.obj 的三个目标文件,并创建了名为 demo.out 的程序。
假定目标存储器具有以下程序存储器配置:
地址范围 | 内容 | ||
---|---|---|---|
0x0080 至 0x7000 | 片上 RAM_PG | ||
0xC000 至 0xFF80 | 片上 ROM |
地址范围 | 内容 | ||
---|---|---|---|
0x0080 至 0x0FFF | RAM 块 ONCHIP | ||
0x0060 至 0xFFFF | 映射的外部地址 EXT |
地址范围 | 内容 | ||
---|---|---|---|
0x00000020 至 0x00210000 | PMEM | ||
0x00400000 至 0x01400000 | EXT0 | ||
0x01400000 至 0x01800000 | EXT1 | ||
0x02000000 至 0x03000000 | EXT2 | ||
0x03000000 至 0x04000000 | EXT3 | ||
0x80000000 至 0x82000000 | BMEM |
输出段的构造方式如下:
链接器命令文件 mylnk.cmd 展示了此示例的链接器命令文件。输出映射文件,demo.map 展示了映射文件。
/****************************************************************************/
/*** 指定链接器选项 ***/
/****************************************************************************/
-c
--heap 0x3000
--stack 0x6000
--args 0x1000
--output_file=demo.out /* 命名输出文件 */
--map_file=demo.map /* 创建输出映射文件 */
-u filter_table_A
-u filter_table_B
/****************************************************************************/
/*** 指定输入文件 ***/
/****************************************************************************/
demo.c.obj
tables.c.obj
filter.c.obj
lex.c.obj
/****************************************************************************/
/*** 指定要链接的运行时支持库 ***/
/****************************************************************************/
-l libc.a
/****************************************************************************/
/*** 指定存储器配置 ***/
/****************************************************************************/
MEMORY
{
PMEM: o = 00000020h l = 0020ffe0h
EXT0: o = 00400000h l = 01000000h
EXT1: o = 01400000h l = 00400000h
EXT2: o = 02000000h l = 01000000h
EXT3: o = 03000000h l = 01000000h
BMEM: o = 80000000h l = 02000000h
}
/****************************************************************************/
/* 指定输出段 ***/
/****************************************************************************/
SECTIONS
{
.text : > PMEM
UNION
{
.tableA: { tables.c.obj(.tableA) } load > BMEM, table(tableA_cpy)
.tableB: { tables.c.obj(.tableB) } load > BMEM, table(tableB_cpy)
} RUN = EXT1, RUN_START(filter_matrix)
GROUP
{
.neardata:
.rodata:
.bss:
} > EXT2
.stack: > BMEM
.args : > BMEM
.cinit: > BMEM
.cio: > BMEM
.const: > BMEM
.data: > BMEM
.switch: > BMEM
.sysmem: > BMEM
.far: > BMEM
.fardata: > BMEM
.ppinfo: > BMEM
}
/****************************************************************************/
/*** 命令文件结束 ***/
/****************************************************************************/
输入以下命令来调用链接器:
cl6x --run_linker mylnk.cmd
这会创建一个如输出映射文件,demo.map 中所示的映射文件,以及一个名为 demo.out 的输出文件,可以在 TMS320C6000 上运行。
OUTPUT FILE NAME: <demo.out>
EENTRY POINT SYMBOL: "_c_int00" address: 00007a00
MEMORY CONFIGURATION
name origin length used unused attr fill
---------------------- -------- --------- -------- -------- ---- --------
PMEM 00000020 0020ffe0 00008080 00207f60 RWIX
EXT0 00400000 01000000 00000000 01000000 RWIX
EXT1 01400000 00400000 00000030 003fffd0 RWIX
EXT2 02000000 01000000 0000001c 00ffffe4 RWIX
EXT3 03000000 01000000 00000000 01000000 RWIX
BMEM 80000000 02000000 0000a9d4 01ff562c RWIX
SEGMENT ALLOCATION MAP
run origin load origin length init length attrs members
---------- ----------- ---------- ----------- ----- -------
00000020 00000020 00008080 00008080 r-x
00000020 00000020 00008060 00008060 r-x .text
00008080 00008080 00000020 00000020 r-- .ovly
01400000 8000a8c0 00000030 00000030 rw-
01400000 8000a8c0 00000030 00000030 rw- .tableA
01400000 8000a8f0 00000030 00000030 rw-
01400000 8000a8f0 00000030 00000030 rw- .tableB
02000000 02000000 0000001c 00000000 rw-
02000000 02000000 0000001c 00000000 rw- .neardata
80000000 80000000 00009000 00000000 rw-
80000000 80000000 00006000 00000000 rw- .stack
80006000 80006000 00003000 00000000 rw- .sysmem
80009000 80009000 00001398 00001000 rw-
80009000 80009000 00001000 00001000 rw- .args
8000a000 8000a000 00000398 00000000 rw- .fardata
8000a398 8000a398 00000288 00000288 r--
8000a398 8000a398 00000288 00000288 r-- .const
8000a620 8000a620 00000268 00000000 rw-
8000a620 8000a620 00000148 00000000 rw- .far
8000a768 8000a768 00000120 00000000 rw- .cio
8000a888 8000a888 00000038 00000038 r--
8000a888 8000a888 00000038 00000038 r-- .switch
8000a920 8000a920 000000b4 000000b4 r--
8000a920 8000a920 000000b4 000000b4 r-- .cinit
SECTION ALLOCATION MAP
output attributes/
section page origin length input sections
-------- ---- ---------- ---------- ----------------
.text 0 00000020 00008060
00000020 000005c0 rts6740_elf.lib : divd.c.obj (.text:__c6xabi_divd)
000005e0 000005c0 : _printfi.c.obj (.text:_getarg_diouxp)
00000ba0 000005a0 : _printfi.c.obj (.text:_setfield)
00001140 00000460 : _printfi.c.obj (.text:__TI_printfi)
000015a0 00000380 : fputs.c.obj (.text:fputs)
...
.neardata
* 0 02000000 0000001c UNINITIALIZED
02000000 0000001c lex.c.obj (.neardata)
.rodata 0 0200001c 00000000 UNINITIALIZED
.bss 0 0200001c 00000000 UNINITIALIZED
.stack 0 80000000 00006000 UNINITIALIZED
80000000 00000008 rts6740_elf.lib : boot.c.obj (.stack)
80000008 00005ff8 --HOLE--
.sysmem 0 80006000 00003000 UNINITIALIZED
80006000 00000008 rts6740_elf.lib : memory.c.obj (.sysmem)
80006008 00002ff8 --HOLE--
.args 0 80009000 00001000
80009000 00001000 --HOLE-- [fill = 0]
...
.tableA 0 8000a8c0 00000030 RUN ADDR = 01400000
8000a8c0 00000030 tables.c.obj (.tableA)
.tableB 0 8000a8f0 00000030 RUN ADDR = 01400000
8000a8f0 00000030 tables.c.obj (.tableB)
...
LINKER GENERATED COPY TABLES
tableA_cpy @ 00008080 records: 1, size/record: 12, table size: 16
.tableA: load addr=8000a8c0, load size=00000030, run addr=01400000,
run size=00000030, compression=none
tableB_cpy @ 00008090 records: 1, size/record: 12, table size: 16
.tableB: load addr=8000a8f0, load size=00000030, run addr=01400000,
run size=00000030, compression=none
__TI_cinit_table @ 8000a9bc records: 3, size/record: 8, table size: 24
.fardata: load addr=8000a920, load size=00000072 bytes, run addr=8000a000,
run size=00000398 bytes, compression=rle
.neardata: load addr=8000a994, load size=00000014 bytes, run addr=02000000,
run size=0000001c bytes, compression=rle
.far: load addr=8000a9b4, load size=00000008 bytes, run addr=8000a620,
run size=00000148 bytes, compression=zero_init
LINKER GENERATED HANDLER TABLE
__TI_handler_table @ 8000a9a8 records: 3, size/record: 4, table size: 12
index: 0, handler: __TI_decompress_rle24
index: 1, handler: __TI_decompress_none
index: 2, handler: __TI_zero_init
GLOBAL SYMBOLS: SORTED ALPHABETICALLY BY Name
address name
------- ----
00007fc0 C$$EXIT
00007700 C$$IO$$
000071c0 HOSTclose
00005d20 HOSTlseek
...
00008080 __TI_table_tableA_cpy
00008090 __TI_table_tableB_cpy
...
[121 symbols]