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.

[参考译文] 编译器/OMAP-L138:库,文件和符号的固定链接顺序为完全相同的版本。

Guru**** 2609285 points
Other Parts Discussed in Thread: OMAP-L138

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/635136/compiler-omap-l138-fixed-link-order-for-libraries-files-and-symbols-to-be-bit-identical-builds

部件号:OMAP-L138

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

 修复 库,文件和符号的链接顺序使其成为完全相同的版本的最佳方法是什么?

我知道这不是一项简单的任务,需要对链接和引用进行严格控制。

 

对于具有多个库的RTSC项目,我想修复链接顺序,因为工作站之间的分配差异。

主项目控制库和文件的链接顺序,但这会导致函数/符号的差异。

以下是一个示例,链接顺序A由一个站点构建生成,链接顺序B由另一个站点构建生成。

从TI工具和文件夹 开始,工作站完全相同。

分配差异是以不同顺序显示的单个函数“EDMA_DRV_ioctl”,以红色突出显示,它会移动某些函数。

 

用户定义的链接程序命令文件可以控制其他项目。

库,文件和.text部分与字符串匹配,但与各个函数不匹配。

链接器报告#1.0068万-D no matching节警告。

只有EDMA3_dv_Adv.obj显式地列在MAP文件的.text部分中,因此可能各个函数在外部不可见?

但所有这些函数都列在符号图中。

 

是否有归档文件的编译选项允许主项目链接程序查看/匹配OS_Utils_arm's emda3_drv_Adv.obj中的函数?

—gen_func_subsections,-ms 将把每个函数放在单独的子节中。

              这不是一个大的效率,它确实显示了一些功能 ,但不是所有的功能。

 

user-defined-linker.cmd (按项目链接顺序排列)

章节

   

   {

           os_Utils_arm_edma_output_section_1:

           {

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_linkChannel)     /*与-ms */匹配

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_unlinkChannel)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_chainChannel)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_unchainChannel)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_setQdmaTrigWord)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_setPARAM)      /*与-ms */匹配

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getPaRAM)      /*与-ms */匹配

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getPaRAMEntry)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_setPaRAMField)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getPaRAMField)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_setEvtQPriority

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_mapChToEvtQ)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getMapChToEvtQ)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_setCCRegister)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getCCRegister)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_waitAndClearTcc)

                -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_checkAndClearTcc)

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_getPaRAMPhyAddr)/*与-ms */匹配

                 -los_utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_*octl)

           }

   }加载> DDR

}

 

主要地图

...

文本

                 ca354a7.8万   0000.3114万    OS_Utils_arm.lib:EDMA3_drv_Adv.obj (.text)

 

 

链接顺序A

 

链路顺序B

CA354A78

EDMA3_DRV_linkChannel

 

CA354A78

EDMA3_DRV_ioctl

CA354D38

EDMA3_DRV_UNlinkChannel

 

CA354B94

EDMA3_DRV_linkChannel

CA354EA8.

EDMA3_DRV_chainChannel

 

CA354E54

EDMA3_DRV_UNlinkChannel

CA35.5168万

EDMA3_DRV_UNchainChannel

 

CA354FC4

EDMA3_DRV_chainChannel

CA3552E8.

EDMA3_DRV_setQdmaTrigWord

 

CA35.5284万

EDMA3_DRV_UNchainChannel

CA35.5454万

EDMA3_DRV_setPaRAM

 

CA35.5404万

EDMA3_DRV_setQdmaTrigWord

CA3555B8.

EDMA3_DRV_getPaRAM

 

CA35.557万

EDMA3_DRV_setPaRAM

CA3.5571万C

EDMA3_DRV_setPaRAM结束

 

CA3556D4

EDMA3_DRV_getPaRAM

CA3558C

EDMA3_DRV_getPaRAM结束

 

CA35.5838万

EDMA3_DRV_setPaRAM结束

CA355A28

EDMA3_DRV_setPaRAMField

 

CA3559A8

EDMA3_DRV_getPaRAM结束

CA355F9C

EDMA3_DRV_getPaRAMField

 

CA355B44

EDMA3_DRV_setPaRAMField

CA35.639万

EDMA3_DRV_setEvtQPriority

 

CA3560B8.

EDMA3_DRV_getPaRAMField

CA35.6534万

EDMA3_DRV_mapChToEvtQ

 

CA3564AC

EDMA3_DRV_setEvtQPriority

CA35.6788万

EDMA3_DRV_getMapChToEvtQ

 

CA35.665万

EDMA3_DRV_mapChToEvtQ

CA35.692万

EDMA3_DRV_setCCRegister

 

CA3568A4

EDMA3_DRV_getMapChToEvtQ

CA356A40

EDMA3_DRV_getCCRegister

 

CA356A3C

EDMA3_DRV_setCCRegister

CA356B1C

EDMA3_DRV_waitAndClearTcc

 

CA356B5C

EDMA3_DRV_getCCRegister

CA356C94

EDMA3_DRV_checkAndClearTcc

 

CA356C38

EDMA3_DRV_waitAndClearTcc

CA356E40

EDMA3_DRV_getPaRAMPhyAddr

 

CA356DB0

EDMA3_DRV_checkAndClearTcc

CA356F98

EDMA3_DRV_ioctl

 

CA356F5C

EDMA3_DRV_getPaRAMPhyAddr

CA3570B4

EDMA3_DRV_getInstHandle

 

CA3570B4

EDMA3_DRV_getInstHandle

CA3581B0

EDMA3_DRV_registerTccCb

 

CA3571D0

EDMA3_DRV_registerTccCb

CA3.5744万.

EDMA3_DRV_UNregisterTccCb

 

CA3572抄送

EDMA3_DRV_UNregisterTccCb

CA35.7494万

EDMA3_DRV_setTcErrorInt

 

CA35.746万

EDMA3_DRV_setTcErrorInt

CA3.5766万C

EDMA3_DRV_getChannelStatus

 

CA3575B0

EDMA3_DRV_getChannelStatus

CA35.7998万

EDMA3_DRV_mapTccLinkCh

 

CA35.7788万

EDMA3_DRV_mapTccLinkCh

 

谢谢!

戴夫

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

    尝试将.text:EDMA3_DRV_loctl.obj放置在所需的特定地址。  您可以用这种方式覆盖任何对象的链接程序的位置。

    部分
    {
    os_Utils_arm*.lib<EDMA3_drv_Adv.obj>(.text:EDMA3_DRV_loctl)> 0xCA356F98
    组
    {
    [..] 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    David Livingston 说:
     如果 要将库,文件和符号的链接顺序调整为完全相同的内部版本,最好的方法是什么?[/QUOT]

    我想确切地讨论"基本相同的版本"的含义。  任何目标文件(包括可执行的.out文件)都包含加载到目标系统的原始数据和未加载的元数据的组合。  元数据包括时间戳,符号表,调试信息等。 在其他相同的版本之间,某些元数据可以合法地不同。  这就是为什么对象文件的简单二进制比较无效的原因。  相反,请使用 cG_xml包中的objdiff实用程序。  默认情况下,它仅比较原始数据,而忽略元数据。

    David Livingston 说:
    我知道这不是一项简单的任务,需要对链接和引用进行严格控制。

    正确。  但是,您可以依赖链接程序来预测。  给定相同的输入,以相同的顺序,它将生成相同的输出(忽略元数据中的预期差异)。

    我担心进入链接的目标文件可能不同。  考虑使用此技术来比较函数的大小。  查找 代码大小增加源一文 并不是关于检查所有函数是否都是相同大小。  但它所描述的方法很容易调整到这一目的。  检查所有函数大小差异是否为零,而不是查找更改大小最多的函数。

    我仍然不清楚您的具体构建方式。  但我认为您可以准确捕获链接器在每个构建中的调用方式。  比较这些调用。  确保所有输入都相同,并按相同顺序提供。   

    谢谢,此致,

    -George

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

    在我们的案例中,"完全相同"意味着我可以获取用于加载的最终文件,并将其与5年后在不同机器上完成的版本进行"比较",没有任何差异。  这是客户的要求。

    大多数问题与元数据有关。  我们确实开始指定一个完整的路径,它处理了一些问题。  我们确实将以下内容添加到了cfg中:

    text.isLoded =假;
    Defaults.common$.namedModule =假;

    请参阅“RTOS/OMAP-L138:如何在配置管理问题的二进制文件中删除路径/日期/时间信息?” 对于该线程...

    EDMA函数似乎有点奇怪,因为它是一个代码,似乎根据我们构建的机器而跳转。  我们未能缩小造成它移动的原因。  它要么是在EDMA功能的开头,要么是在我们构建的机器的最终基础上。  同一台机器,它最终在同一个位置。

    我们还广泛使用了日志功能。  我们正在#定义它们以了解其作用。

    在最终版本中,我们似乎仍有日期/时间信息,这正使我们感到死亡。

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

    Mike Geppert 说:
    在我们的案例中,"完全相同"意味着我可以获取用于加载的最终文件,并将其与5年后在不同机器上完成的版本进行"比较",没有差异。  这是客户的要求。[/QUOT]

    objdiff是否足够用于此目的?  如果不是,如何比较文件?

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们想要一些超级简单的东西,比如"CMP file1 file2"。
    这只适用于将来的版本。
    在过去的版本中,我们正在接受审核,因为我们使用了任何可以亲自动手解释的内容,以解释差异。objdump,NM等。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mike Geppert 说:
    我们希望使用像"CMP file1 file2"这样的超简单的文件。[/QUOT]

    objdiff几乎就是这么简单。  请参阅 此帖子 以了解其概述。

    Mike Geppert 说:
    在过去的版本中,我们正在接受审核,因为我们使用了任何可以亲自动手解释差异的方法。objdump,NM等...

    我看不出有什么理由不能将objdiff视作另一个实用程序,如objdump,NM等

    谢谢,此致,

    -George