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.

[参考译文] 编译器:CCS 5.1x、CGT 7.3.22:自动创建的 STI 构造函数 ASM 在构建之间略有变化。

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/646907/compiler-ccs-5-1x-cgt-7-3-22-automatically-created-sti-constructor-asm-changes-slightly-between-builds

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

我正在尝试使用 hex6x 工具来分离二进制映像(这已经在工作)。  我在细小细节中详细介绍了我要创建的4个二进制文件与单个*。out 文件之间的区别。  

问:我有一个带有两个函数的残桩 CPP 文件;funcA、funcB 带有一些 volatile 来保留它们; 问题是、当我更改与 funcA/funcB 完全没有"可见"关系的不同库输入文件时、我仍然看到自动生成的构造函数的反汇编中有无法解释的更改。

文本段.image4_text (大端字节序)、0xE0xx_xxxx 处的0xE0字节。  

e0xx_x100:                 __STI_19_filename_CPP_fa5f8b8c:

(笑声)

(笑声)

(笑声)

b __cxa_guare_acquire。

(笑声)

b __cxa_guare_release

MVK.L2 0、B4

MV.L1 A10、A4

MVK.S1 0x4064、A3       <<< 这一个会发生变化。     在之前的构建中、当我从不同的输入库中更改代码时、STI 略有变化。  之前的版本是0x4024、A3。

感谢您的任何帮助。

谢谢!

将会

处理器:C6457

CCS 5.1x

CGT 7.3.22

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

    我对这种情况有一个模糊的记忆。 但我无法在我们的错误数据库中找到它。   

    [引用 user="ixworks "] CGT 7.3.22

    这是一个相当旧的编译器版本。  仅出于测试目的进行升级是否可行?  如果您尝试使用最新的编译器版本(目前为8.2.2)查看是否已修复、我将不胜感激。  文章 Compiler Release 提供了有关获取较新编译器的详细信息。

    谢谢、此致、

    乔治

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

    遗憾的是、这不是我想要的可行方法;我的更改存在于封闭系统中、几个月后、由于工艺系统无法测试软件的新版本。 如果存在我们可以指向的错误和修复的版本、这确实会更容易。

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

    不允许内联的是 memset 问题吗? 在对 memset 调用进行拆分时、我没有看到直接的符号引用。  此外, 它不是派生类; 它看起来像是自动生成的,因为我的文件名具有 CPP 扩展名。  
     
    SDSCM00042199 -"编译器在派生类构造函数中生成意外的 memset 调用(影响性能)"

    "在某些情况下、编译器在使用--abi=eabi (ELF 模式)进行编译时、不必要地为某些 C++构造函数调用生成对 memset 的调用。 这可以抑制简单构造函数的内联。 "

    缺陷发生在:

    C6000编译器版本:7.2.0B1 - 7.2.6、7.3.0B1 - 7.3.1

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

    我非常怀疑它是 SDSCM00042199。   

    让我们回到...

    [引用 USER="ixworks ]MVK.S1 0x4064、A3       <<< 这一项更改。     在之前的构建中、当我从不同的输入库中更改代码时、STI 略有变化。  之前的版本为0x4024、A3。

    最好查看编译器在此处生成的汇编代码。  使用--src_interlist 进行编译、并在生成的汇编文件中找到相应的语句。  您将看到这是否真的是一个符号引用(我怀疑是这样)。  如果是、符号是什么?  符号是否更改或地址?  周围的汇编代码中可能有一些线索、其中将包括一些编译器生成的注释。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当函数返回结构时、编译器通过为结构创建空间并在 A3中传递其地址来实现这一点、而 A3不是参数寄存器之一。 0x4064是否可能是附近函数将要返回的结构(对象、也许是对象)地址的一部分? 如果是这样、当一些其他(可能不相关)对象或函数更改大小时、该地址可能会略微更改。 请向我们展示更多相关的汇编代码。 此 MVK 实际上是否位于调用_cxa_guar_release 的5个延迟时隙中的一个? 它是纯分支还是受保护分支? 这将有助于查看确切的反汇编。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    考古学家,我已经部分回答了你的要求。
    -添加了显示 A3汇编语言的代码。
    我感到困惑的是,自动创建的构造函数会引用另一个构造函数的内存空间。

    Lib1 位于0xE026_xxxx (从0x0偏移开始)

    Lib2位于0xE027_xxxx 中(从0x0偏移开始)
     
    文本段.image4_text (大端字节序)、0xE0xx_xxxx 处的0xE0字节。

    e0xx_x100:__STI_19_filename_CPP_fa5f8b8c:

    (笑声)

    b __cxa_guare_acquire。

    (笑声)

    [A0] b __cxa_guare_release


    0xE0260xx MVK.L2 0、B4
    0xE0260xx MV.L1 A10、A4
    //新添加到回答问题
    0xE0260xx.fphead
    0xE0260xx MVK.S1 0x3dc4、A3 //此处是 A3参考
    0xE026080 mkkh.S1 0xE0270000、A3 //它正在引用另一个库的存储器空间

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

    这使我有一个更广泛的问题:
    我必须将 image4 的.far 段移动 到主映像中、因为上面的 char_stitnesniages4引用位于.far 中、对于 image4是单独加载的映像、而不是将启动的主映像。  我对此感到困惑、但     如果缺少编译器/链接器设置、我愿意详细介绍具体细节。
     

    但是、我已经运行了更多的符号: Maklocstr、 Sentry_baseD1Ev、LocaleD1Ev。这些符号 无法删除、因为我具有字符串处理(sprintfs)。  iostream 已删除、但 localeD1Ev 仍在其中。


     如何更新链接器命令文件以将这些特定函数移动到一个组中?

    例如
     
    组(MAIN_LOADOUT)

    .text (-l=Lib4.lib (.text:_ZSt10_Maklocstr)}  //这会将 lib4 的 char 填充移到主映像中。  

     
     
     
    谢谢、

    将会

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您说"Lib1生活在0xE026_xxxx"时、这相当不精确。 一个库有很多段、包括.text 和.data 段、这些段可能分散在内存中。 请生成链接器映射文件(链接器选项--map_file=) .map)并查看 Lib1及其段的所有实例。 您可能会发现、Lib1和 Lib2的数据段是相互交织的、以利用 C6000 DP 相对寻址模式。

    全局对象构造函数可以为在其他模块中定义的对象调用构造函数;这不是问题。 实际上、iostream 子系统具有许多此类跨文件可靠性。

    ".fphead"指令的存在告诉我您正在使用 C64+压缩代码。 此代码可能处于受保护或不受保护模式。 这由附近的.fphead 指令的编码控制。 为了正确解读此代码序列中发生的情况、我们需要查看与写入 A3相关的指令的完全版、包括附近.fphead 指令的操作码位。 最简单的做法是、只让编译器保留汇编代码(--keep_asm)、并将相关的整个 STI 函数剪切粘贴到论坛中。 它将包含汇编注释、告诉我们发生了什么。

    出于某种原因、我无法还原您显示的段名称、但它显然是一个涉及 C++标准模板类 num_put 的数据段、可能是模板 语言环境::id num_put <_CharT, _OutputIterator>::id,这是一个深入的实现细节。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    sprintf 是一个 C 语言功能、不需要像 std:locale 这样的 C++支持功能。  程序中必须有一些其他 C++功能、该功能在 iostream 支持中拖动。

    没有链接器选项可将所有 C++支持函数和数据作为一个整体移动、并且由于 iostream 支持的大部分是 C++模板、因此这些内容通常最终会在用户代码中定义、这会使问题复杂化。

    您可能可以首先将所有名为.text:_Z*的.text 段从任何库移动到特定区域:

    .text (*。lib (.text:_Z*)}