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**** 2540720 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/577977/compiler-linker-loader-and-initialized-memory

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

您好,

如果我正在定义链接程序命令文件中映射到其中一个已定义存储器的部分,加载程序(或图像本身中的链接程序)在什么情况下会将该区域初始化为零或其他值?

我需要知道 的是,如果我有一个程序将一些数据写入特定部分, 然后加载另一个定义了相同部分的程序,将会加载第二个程序删除第一个程序写入的内容(如果未使用NoLoad关键字)? 如果是,防止这种情况的唯一方法是使用NoLoad还是有其他方法?

谢谢

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

    Guy Mardiks 说:
     如果我有一个程序将某些数据写入特定部分,然后加载另一个定义了相同部分的程序,那么加载第二个程序将擦除第一个程序写入的内容(如果未使用NoLoad关键字)? [/引述]

    首先,我们来澄清一些术语。  请使用 Wiki文章 链接器命令文件入门中的术语表部分中的术语。  在这种情况下,重要的区别在于您所说的"部分"称为"内存范围"。  因此,再次提出您的问题:第一个程序将数据写入内存范围。  然后加载第二个程序,该程序将初始化的值放在同一内存范围内。  会发生什么?  我想我说的都是正确的。

    我认为我不理解一些更基本的东西。  无论如何实施,您希望发生什么?  因为,如果第二个程序使用相同的内存范围,我看不出有什么方法可以避免覆盖第一个程序中的数据。  这让我得出结论,我误解了您想要做什么。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    很抱歉我不够清楚,我将尝试再澄清一点。
    对于C程序,C平台初始化例程将.BSS初始化为零。
    我想确定,如果我正在定义链接程序命令文件中映射到特定内存区域(从内存部分)的某些新部分(在部分部分),并且我在两个程序中有相同的链接程序配置,其中一个加载另一个程序。
    现在,第一个程序具有分配给该部分的一些代码(和/或数据)(使用pragma关键字) 因此,它是由第一个程序初始化的。第二个程序不为该部分分配任何内容,它只存在于其链接程序文件中,因此它将知道它在内存中的位置(它可以引用第一个程序初始化的相同位置) (和看到的)由于第二个程序不分配任何内容,它的内容应该保持不变,并包含第一个程序在那里写的内容。我只是想确保这确实是我可以依赖的,或者如果这不是保证的话 (即,出于某种原因,可能总是会对这些部分进行某些初始化-可能类似于C init对.bss部分所做的操作)

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

    我认为这样的东西会对你很有效...

    #pragma location_shared_variable, 0x1000)
    #ifdef prog2 /* PROG2仅在构建第二个程序时定义*/
    #pragma NOINIT(shared_variable)
    #endif
    int shared_variable;
    

    这会出现在两个程序中都使用的源文件中。  预处理程序符号PROG2在命令行上与-DPROG2一起定义,仅在生成第二个程序时定义。  

    阅读 ARM编译器手册中有关位置和NOINIT pragma的更多信息。  位置pragma表示共享变量在两个程序中位于同一位置。  NOINIT pragma表示第二个程序不会初始化它。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    非常感谢您的建议。
    当然,如果我在第二个程序的链接程序命令文件中定义了该部分,但第二个程序没有在该部分中分配任何内容,则只通过指针来读取该区域, 第二个程序没有理由对这个领域进行某种初始化-对吗? (我的问题涉及代码和数据部分)

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

    我建议的解决方案的粒度为一个C变量。  注意此变量可以是一个整数,如图所示。  或任何其他C类型,包括结构,数组,结构数组等。  此解决方案不能应用于函数,即代码。

    谢谢,此致,

    -George