This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TDA2EVM5777:链接多个对象时出现问题:"没有匹配的部分"

Guru**** 2606725 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/632420/compiler-tda2evm5777-problems-linking-multiple-obj-no-matching-section

部件号:TDA2EVM5777

工具/软件:TI C/C++编译器

您好*!

我在 使用C6000_CCS 2独立工具链(外部7.4)链接小型裸机示例时遇到问题:  

我需要构建一个名为".resource_table"的部分,因为我要为Linux remoteproc固件进程构建ELF。
使用包含的“custom_usr_table”编译main.c后,main.obj文件包含所需的部分。
然后我尝试将main.obj链接到我可以在C66x-DSP中使用的内容(使用*.cmd文件的优点!) 链接程序说:  
"没有匹配的部分"...? 使用readelf,我可以看到obj包含该部分...那么会出什么问题?  

首先:介绍小型示例项目:  

主要c


/** * main.c */ #include "custom_RSC_table_dsp.h" void main (void) { 而(1){ //不执行任何操作 。} }


Custom_RSC_table_dsp.h: 


#define ...(#定义... [未显示所需的定义...]
/*
虚拟队列的大小(以支持的缓冲区数表示,
*必须是2的幂)
*/
#define DSP_RPMSG_VQ0_SIZE 256
#define DSP_RPMSG_VQ1_SIZE 256

/*翻转位,其索引表示我们支持的功能*/
#define RPMSG_DSP_C0_features 1

/*资源表中的条目数*/
#define RSC_NUM_entries 4

结构my_resource_table {
结构resource_table base;

unsigned int offset[rsc_num_entries];/*应与实际定义中的'num'匹配*/

/* rpmsg vdev项*/
结构FW_RSC_vdev rpmsg_vdev;
结构FW_RSC_vdev_vring rpmsg_vring0;
结构FW_RSC_vdev_vring rpmsg_vring1;

/*文本离开条目*/
结构FW_RSC_Carveout text_cout;

/*数据交换条目*/
结构FW_RSC_Carveout data_cout;

/* ipcdata carveout entry */
结构FW_RSC_Carveout ipcdata_cout;

/* devmem条目*/
struct fw_rsc_devmem devmem0;
};

#pragma data_section(ti_ipc_remoteproc_ResourceTable,".resource_table")
#pragma data_align(ti_ipc_remoteproc_ResourceTable, 4096)

struct my_resource_table ti_ipc_remoteproc_ResourceTable ={
1, /*我们是第一个实现此*/的版本
RSC_NUM_entries, /*表中的条目数*/
0,0,/*保留,必须为零*/
/*条目偏移量*/
{
offsetof(struct my_resource_table,rpmsg_vdev),
offsetof(struct my_resource_table,text_cout),
offsetof(struct my_resource_table, data_cut),
offsetof(struct my_resource_table,devmem0),
},
/* rpmsg vdev项*/
{
TYPE_VDEV,virtio_ID_RPMSG,0,
RPMSG_DSP_C0_features,0,0,0,2, { 0,0},
/*无配置数据*/
},
/*两个耳环*/
{ DSP_MEM_RPMSG_VRING04096,DSP_RPMSG_VQ0_SIZE,1,0 },
{ DSP_MEM_RPMSG_VRING1, 4096,DSP_RPMSG_VQ1_SIZE,2,0 },

{
Type_CARVEOUT,
DSP_MEM_TEXT,0,
DSP_MEM_TEX_SIZE,0,0,"DSP_MEM_TEy",
},

{
Type_CARVEOUT,
DSP_MEM_DATA,0,
DSP_MEM_DATA_SIZE,0,0,"DSP_MEM_DATA",
},

{
TYPE_DEVMEM,
DSP_MEM_IPC_DATA,0,
DSP_MEM_IPC_DATA_SIZE,0,0,"DSP_MEM_IPC_DATA",
},
};




/******************************************************************************** / /* AM57xx_C66.cmd */ /*版权所有(c) 2015 Texas Instruments Incorporated * /*作者:Rafael de Souza */* */ /*说明:此文件是链接程序命令文件示例,可以是*/ /* 用于链接使用C编译器和*/*构建的程序 在*/*的C66x DSP内核上运行生成的.out文件 AM57xx设备。 */* 将其用作指南。 您将需要 */* 更改内存布局以匹配您的特定 */* 目标系统。 您可能需要更改分配*/* 根据程序的大小进行计划。 */* * ///................ / 内存 { iRAM_MEM:O *= 80万 l = 0x0.8万 /* 32kB内部SRAM/ OCMC_RAM1:O = 4030万 l = 0x8万 /* 512KB L3 OCMC SRAM1 * OCMC_RAM2:O = 4040万 l = 0x10万 /* 1 MB L3 OCMC SRAM2 */ OCMC_RAM3:O = 4050万 l = 0x10万 /* 1 MB L3 OCMC SRAM3 */ DDR0: o Sa = 8000万 l = 0x4000万 /* 1 GB 外部DDR Bank 0 */ } 节 { 文本 > iRAM_MEM 堆栈 > iRAM_MEM BSS > iRAM_MEM 首席信息官 > iRAM_MEM 。const > iRAM_MEM 数据 > iRAM_MEM 开关 > iRAM_MEM sysmem > iRAM_MEM 远 > iRAM_MEM .args > iRAM_MEM .pppinfo > iRAM_MEM .pppdata > iRAM_MEM /* COFF部分*/ 。销钉 > iRAM_MEM cinit > iRAM_MEM /* EABI部分*/ 二进制 > iRAM_MEM init_array > iRAM_MEM .neardata > iRAM_MEM fardata > iRAM_MEM .rodata > iRAM_MEM .c6xabi.exidx > iRAM_MEM .c6xabi.extab > iRAM_MEM .resource_table > iRAM_MEM { main.obj(.resource_table) }

}

信息:
显式".resource_table"stuff只是尝试在生成的固件中生成部分的其中一个尝试...如果没有这样的定义,包含
的"custom_rsc_table_dsp.h"的pragma不会创建所需的部分。

所以我尝试了这种方式,没有成功...:-(.  

编译器的调用和选项:  

cl6x --ram_model --unused_section_elimination=on --map_file=link.map --stack_size=0x1000 --abi=eabi --run_linker linker .cmd main.obj -i $(include)-o dra7-dsp1-fw.xe66

问题:  

在使用链接器之前,我可以在ob-File中看到一个名为".resource_table"的部分:

[5].resource_table PROGBITS 0万00 0010000.0001万000 0001441.44亿 00 WA 04096  

.resource_table ... 7:0万 0部分本地隐藏5

resource_table .resource_table 0.0001万44 000000004.4万00000 000000000亿00 000010000万01000 2**120.1万 2**12内容,ALLOC,加载,数据

错误消息:  

"linker.cmd",第54行:警告:没有匹配的部分

结果是:  

resource_table 0万00 000000000万00000 000000000亿00 000000000万00000 2**00万 2**0
 只读

resource_table NOBITUS 0万 000000 00 0 01 22:0万 0部分本地默认值22  

 

有什么建议会出什么问题?

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要将#pragma Retain应用于 ti_ipc_remoteproc_ResourceTable。  请在 C6000编译器手册中阅读有关它的更多信息。

    我也注意到了这点...

    [报价用户="Marco Reppenhagen "]使用7.4 2工具链

    此编译器使用了5年。  请考虑升级。  至少升级到最新的7.4 .x版本,即当前的7.4 .23。  唯一的区别是错误修复。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你乔治!
    我将尝试此操作并将编译器更新到7.4 .23。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!
    切换编译器并使用"Retain (保留)"解决了此问题。

    现在我得到了另一个线程,但最好打开另一个线程->解出。