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.

[参考译文] Compiler/SECDEVTOOL-OMAPL138C6748:仍存在未解析的符号

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/571758/compiler-secdevtool-omapl138c6748-unresolved-symbols-remain

部件号:SECDEVTOOL-OMAPL138C6748
主题:OMAPL138中讨论的其它部件

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

您好,

  我无法解决链接器"未解析的符号仍然存在"问题。 该项目是正确生成和运行的项目的副本。 我将复制的项目更改为使用TI-COFF而不是ELF。 我有一些没有源代码的旧库,它们是用COFF构建的。 我想尝试使用较旧的库。 我从TI starterware中的源文件重建system_config.lib。 这似乎奏效了。 我尝试过对路径和下划线,双下划线进行各种更改,但仍然遇到相同的错误。

  我正在使用startup.c文件,其中包含start_boot(void)函数 ,并在链接程序cmd文件中加载init.obj。 执行这些步骤的原因是在保持主管模式时调用main()。 我需要在启动时执行许多初始化操作,并且希望在C中执行这些操作,而不是在ASM或GEL文件中执行这些操作。

 我认为我的问题在于指定正确的路径,名称转换问题或ELF和COFF格式之间的某些差异。

以下是构建列表的最后一部分:

'构建目标:DP770_COFF.OUT '
'调用:ARM链接器'
c:/ti/ccsv6/tools/compiler/arm_DP.8/bin/armcl" 5.2 -mv5e --code_state=32 --abi=ti_ARM9_ABI -me -g --define=omapl138 --define=omap_arm_arm_arm_ar_arib_core-def_lit_en_ad_insp-dip-dip_dip_di_dip_dip-dip_-di_di_crk/diag-dip_dip_dip-dip_-dip_-dip_dip-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_-di_-dip_-dip_-dip_-dip-dip-dip/ip-dip_-dip-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_-dip_- 5.2 5.2   
链接>
  未定义的第一个引用
 文件中的符号        
 -------------------  --------
 start_boot ./init.obj    
错误#1.0234万-D:仍存在未解析的符号
警告#1.0063万-D:指定了"_c_int00"以外的入口点符号: "entry"
错误#1.001万:链接时出错;“DP770_COFF.OUT”未构建

下面是我认为重要的代码部分。

链接程序cmd文件的一部分:

章节

  .init:{
         init.obj (.text)
         }加载> 0xC108万
  text  :LOAD > DDR_MEM        /*代码                */
  数据  :LOAD > DDR_MEM
  .bss  :LOAD > DDR_MEM        /*全局和静态VARS        */
         run_start (bss_start),
         运行结束(BSS_END)
 init.asm文件的组成部分:

全局  条目
全局  启动启动
.global  __TI_auto_init

.ref  __stack
.ref  __stack_end
.ref  bss_start
.ref  bss_end
.ref  start_boot

;输入start_boot函数。 在系统模式下仍执行
     LDR R10,_start_boot   ;获取start_boot的地址
     MOV LR,PC              很棒的一次体验  
     BX  R10                ;分支到start_boot
     子 PC,PC,#0x08      ;循环
;     MSR CPSR_c,#MODE_SVC|I_F_bit   ;更改为SVC模式
;     BX LR

stackptr (_stackptr):        word __stack_end
_BSS_START:.      Word BSS_START
_BSS_结束:       Word BSS_END
启动启动:      word start_boot
_data_auto_init: .word __TI_auto_init

startup.c文件的一部分
/**
 *\brief Boot strap函数,用于启用PLL和PSC的基本功能
 *      模块
 *
 *\param none
 *
 *\\n无返回 。
 *  
 *此函数是系统中需要调用的第一个函数。
 *如果加载,则应将其设置为链接程序脚本中的入口点
 * elf二进制文件,通过调试器,在目标上。 此函数从不返回,但是
 *控制应用程序入口点
 **/
未签名的int start_boot(void)
  /*为SYSCFG模块的寄存器启用写保护。 */
  SysCfgRegisterLock();
  /*禁用SYSCFG模块寄存器的写保护。 */
  SysCfgRegisterUnlock();
  PSCModuleControl (SOC_PSC_1_regs,HW_PSC_UART2,0,PSC_MDCTL_NEXT _ENABLE);
  PSCModuleControl (SOC_PSC_0_regs,HW_PSC_AINTC,0,PSC_MDCTL_NEWS_ENABLE);
  /*使用操作码*/初始化矢量表
  CopyVectorTable();
  /*呼叫主*/
  主要();
  同时(1);
}
startup.c和init.asm已包含在项目中,并且生成时没有错误。 它在ELF模式下工作正常,并且项目是复制的,而不是从新创建的。
如有任何帮助,我们将不胜感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请记住,在COFF模式下,所有C函数都有额外的前缀下划线,因此C函数start_boot的链接名是_start_boot。 您需要将现有的变量_START_BOOT重命名为其他变量,如下所示:
    my_start_boot:.word _start_boot;注意_start_boot上的下划线
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还不错! 这是可行的。

    在引用C函数时添加下划线

    全局  _start_boot

    .ref      _START_BOOT

    并在ASM文件中更改变量的名称

    my_start_boot:  .word _start_boot  ; <-使用加了强调的名称

    然后在指令中使用新命名的变量

         LDR R10,my_start_boot        ;获取start_boot的地址

    我尝试了添加下划线和重命名,但我认为我没有同时尝试这两种方法:-P

    非常感谢。 编译,链接和运行。