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.

[参考译文] 编译器:黑客动态重新加载

Guru**** 2595770 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/618697/compiler-hack-dynamic-reloading

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

您好,

我们了解如何为嵌入式目标实现运行时加载。 假设我们修改了一个. c文件,然后将其编译为.obj,我们是否可以快速地将其内容重新加载到运行的设备上,而无需重新链接并重新加载整个. out文件? 其目的仅用于一些快速和肮脏的黑客攻击,我们知道符号文件,调试信息等未同步,并且CCS调试器可能存在问题,无法找到正确的符号/代码行。

1.我们知道,函数是连续放置在.text部分中的。 我们可以使用"code_section"指令来处理此问题,为我们可能会像上述那样"黑客"攻击"的函数分配大插槽,以便重新加载不会覆盖其他函数的空间。 此外,请建议我们使用任何更好的链接器指令,因为使用“code_section”方法,我们可能需要创建许多不同的段名称。

2.客户是否可以向TI提交请求,以获取编译器和链接器的至少部分源代码? 我们寻求一些灵活的黑客技术来促进开发,就像使用Clang/GCC开放源代码工具链一样。 TI的ofd xml工具和DSS很好,但当我们需要更深层次的功能时,它们会变得越来越受限制。

3.更好的是,如(1)中所述,在这种情况下,是否有办法更新调试符号,代码行等? 我们希望像GNU GDB那样运行CCS调试环境。 您能否建议如何将TI的c/CPP符号与食脂CDT连接? 是最初的CDT版本还是由TI修改?

4.对于对象格式,它是ELF/COFF标准符合还是添加了批次TI自己的规范? 我的意思是,TI工具链中有许多指令(pragma,pack,code_section等)。 在链之后,最终的.ELF/COFF文件是否符合标准,比如说 www.eclipse.org的vanilla CDT工具是否可以理解它, 或者TI是否对代码进行了大量修改?

此致,

戴夫

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

    Dave Smith62 说:
    假设我们修改了一个.c文件并将其编译为.OBJ,我们能否快速将其内容重新加载到正在运行的设备,而无需重新链接并重新加载整个.out文件?[/QUOT]

    此功能的一般行业术语是动态加载。  TI编译器工具仅支持C6000器件系列的动态加载。  即使如此,也只有在C6000系统运行Linux时。  如果您的系统具有运行Linux的ARM设备,则可以考虑ARM GCC编译器的动态加载功能。

    Dave Smith62 说:
    另外,请告知我们任何更好的链接器指令,因为使用"code_section"方法,我们可能需要创建许多不同的部分名称。

    大多数TI编译器都具有build开关--gen_func_Subsections,这使得每个函数都被放置在名为.text:name_of_function的部分中。

    Dave Smith62 说:
    客户是否可以向TI提交文件请求以获取编译器和链接器的至少部分源代码?[/QUOT]

    有效答案是否定的  更全面的回答... 可以购买源代码许可证。  但是,这种情况很少发生,因此我们没有处理交易的标准方法。  我有一个模糊的概念,它要求律师,公司官员签署的法律协议和大笔钱。

    Dave Smith62 说:
    对于对象格式,它是ELF/COFF标准符合还是添加了LOTTI自己的规范?[/QUOT]

    请参阅文章 A Brief History of TI Object File Formats(TI对象文件格式的简要历史)。

    谢谢,此致,

    -George

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

    当CCS中有一个“加载程序”时,加载程序可执行文件是什么? 它是TI的计划还是从eclipse中获得的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在名称空间"com.ti.debug.engine.scripting.Symbol"中,有

    void load(Java.lang.String sFileName)只将指定的.out文件中的符号加载到当前目标/CPU。

    void loadWithOffset(Java.lang.String filename, Long codeStart, Long dataStart)将指定程序的符号加载到调试器的符号管理器中。

    void loadWithRelativeOffset(JAVA.lang.String文件名,长代码偏移,长数据偏移)
    将指定程序的符号添加到调试器的符号管理器中。

    正如TI目标文件链接的简要历史一样,.out格式在大多数情况下都可以通过GNU工具理解。 上述三个Java函数位于DSS帮助中。

    (1)在使用CCS调试GUI时,我们有时注意到符号管理器中存在一些小问题,例如,全局变量变量"var1"可能会覆盖本地"var1",这只是调试器符号问题,而不是加载程序/编译器程序。 如果我们可以访问符号管理器/调试器代码库,我们就可以避免这些问题。 对于加载器可执行文件和负责“可变”“表达式”视图的符号管理器,它们中有多少来自TI或eclipse? 如果它们是色食或标准符合性,我们可能会通过Java/DSS对它们进行精细控制。 是吗?

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

    Dave,您好!

    在CCS中"加载程序"时,加载程序可执行文件是什么? 是TI的计划还是从eclipse中获得?[/QUOT]

    如果您要询问处理将调试符号加载到调试器和将代码加载到目标的调试器组件,则所有这些都来自TI

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

    [报价用户="Dave Smith62"]

    在名称空间"com.ti.debug.engine.scripting.Symbol"中,有

    void load(Java.lang.String sFileName)只将指定的.out文件中的符号加载到当前目标/CPU。

    void loadWithOffset(Java.lang.String filename, Long codeStart, Long dataStart)将指定程序的符号加载到调试器的符号管理器中。

    void loadWithRelativeOffset(JAVA.lang.String文件名,长代码偏移,长数据偏移)
    将指定程序的符号添加到调试器的符号管理器中。

    [/引述]

    请注意,这些API将首先删除现有加载的符号,然后加载指定的符号。 我怀疑用于添加符号的API是您更感兴趣的,因为您想将新符号添加到现有加载的符号中:

    void   add(JAVA.lang.String文件名)将给定文件中的所有符号添加到调试器的符号管理器中。
    void   addWithOffset(Java.lang.String filename, Long codeStart, Long dataStart)将指定程序的符号添加到调试器的符号管理器中。
    void   addWithRelativeOffset(Java.lang.String文件名,Long codeOffset,Long dataOffset)将指定程序的符号添加到调试器的符号管理器中。

    但是,由于修改后的c文件的旧信息和新信息仍然存在,因此您可能会遇到符号信息冲突的问题。 您不能仅删除修改后的c文件的旧符号,因为删除符号API将删除加载文件(*。out)的所有符号,而不是仅删除指定部分(但如果它是单独的模块, 然后可以使用API删除已加载的对象)。 可以使用hideSection API来隐藏这些符号。

    对于加载器可执行文件和负责“可变”“表达式”视图的符号管理器,它们中有多少来自TI或eclipse? 如果它们是色食或标准符合性,我们可能会通过Java/DSS对它们进行精细控制。 是吗?[/QUOT]

    变量/表达式视图来自Eclipse。 处理符号加载/管理以及将代码实际加载到目标的组件都来自TI。 但是,您当然可以使用DSS API来加载/添加/删除/显示/隐藏符号,并将程序加载到目标

    谢谢

    KI