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/619039/section-filing-algorithm

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

您好,

需要有关链接器放置顺序的说明:

指令,联合,拆分,组,内存, 等

如果我们已经有一个链接且完全重新定位的.out文件,其中有FUNA@addrA, funcB@addrB,… funy@addrY,它们位于对象文件Old_obj中。

然后我们编译一个新的funZ(),它引用了以前的一些函数,提供了必要的声明,并编译到一个未重定位的Z.obj文件。

然后,我们将Z.OBJ添加到以前的项目中,并将其与现有的Old_obj链接(不是部分链接,因为我们不会与包含重定位信息的.out文件重新链接)。 所以唯一的区别是我们添加了Z.OBJ,它只具有需要重新定位的外部引用。

然后,{addrA,…}中的任何一个 ADDRY}更改?

 

不确定这一点,因为我们没有链接器来源,并且存在怀疑:

  1. 在http://processors.wiki.ti.com/index.php/Program_Cache_Layout#--preferred_order_Option中,C6000的v7有“加权调用图(WCG)”概念,它在涉及缓存等时创建首选放置顺序
  2. 在旧版本的链接程序中,总是有“--preferred_order”选项。

在这种简单的情况下,我们不允许使用任何一种(new funz()从不更改任何呼叫计数等)

  1. 准确描述功能和符号的分配方式,何时指定所有章节/内存。 假设我们有一个以0xC0万开头的.text部分,首先从哪些函数分配obj?
  2. DSP和其他处理器之间是否有区别? DSP编译器编写者可能会考虑更多的因素,如内存层次结构与性能,因此分配算法是否已更改?
  3. 链接和符号解析是递归的,这是显而易见的。 放置是否只是简单的旧线性放置(例如0xC0万),一个接一个地进行,并且从不回绕?

 

戴夫

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    考虑到近/远距离调用,蹦床优化和相关问题,很可能是放置算法涉及的更多? 也许我不应该简单的线性假设?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上,算法是相当复杂的。  除了您注意到的问题之外,链接器还考虑了对齐,阻止,输出节拆分,不同的加载和运行地址,相位排序等 因素。但是,大多数时候,链接器的放置选择都可以通过以下基本规则来解释:

    1. 具有精确位置的书帖放在第一位,因为它们不能移动到其他任何位置
    2. 组中的各部分放在一起
    3. 较大的部分首先放置,通常位于第一个内存的最低地址,这些内存保留在其中
    4. 如果由于对齐而导致较大的部分之间存在间隙,则较小的部分可能会被挤压在它们之间

    DSP编译器和MCU编译器几乎使用相同的放置算法。  可能不同的是特定于设备的链接程序命令文件。  链接程序命令文件可能会显著影响放置。