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.

[参考译文] TMS320F28379D:链接器添加了未使用的代码

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1081615/tms320f28379d-linker-adds-unused-code

部件号:TMS320F28379D

您好,

我有一个项目导入一个包含许多不同内容的文件夹。  该项目使用这些东西的子集。  在最近的一个版本中,链接器在闪存中用完了空间。  经过调查,我意识到没有使用的代码正在被添加到输出中。  我已经查找了一个阻止此操作的链接器选项,但我找不到任何内容。  请您将我引导至正确的设置吗?

谢谢你,

ED

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

    好的。  这是一个编译器开关,可以将所有内容放在单独的小节中。  但这只是问题的一部分。  我发现,通过将未使用的部件从内部组件中排除,我可以获得更多的空间。  这是因为即使没有使用对象中的其他内容,构造函数和析构函数仍会被添加吗?

    谢谢你,

    ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="366241" url="~/support/icros/C2000 -微控制器组/CC2000 /f/C2000 -微控制器-论坛/1081615/tms320f28379d-linker - adds-未使用的代码/4003530#4003530"]通过从构建中排除未使用的部件,我获得了更大的空间。

    假设您有一个名为 never _used.cpp 的源文件。  它包含类的某些成员函数的实现。  主程序永远不会创建此类的实例。  因此,这些职能都没有被称为。  即便如此,您构建 never_used.cpp 并在最终链接中包括永不使用的.obj 这一事实意味着这些成员函数将出现在程序中,占用了内存。  我无法再现这种行为。   

    我猜你在做类似的事情,但有一两个不同。  其中一个差异可能是原因所在。  您做了哪些不同的事情?

    谢谢,此致,

    乔治

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

    你好,乔治,

    首先,从地图文件中,我记下了可用闪存的大小。

    接下来,在“项目属性”中,在“生成”->“C2000编译器”->“高级选项”->“运行时模型选项”下,我将“将每个函数放在单独的小节(-gen_func_subsection,-mo)中”更改为“打开”。  该项目已经完成,并检查了地图文件。  never_used.cpp 中的函数消失了,免费闪存的数量也增加了。

    最后,在项目资源管理器中,我导航到“从不使用.cpp”,右键单击,并选择“从生成中排除”。  该项目已重新构建,并检查了地图文件。  自由闪光量再次增加。  这让我 想到 ,这些建筑和破坏者已经被拆除。  我忽略了检查地图文件的这一部分。

    因此,我再次重复了它,但文件未被排除,我确实看到它反映在.cinit 和.Pinit 两个部分以及.text 区域的一些代码中。  当我再次排除该文件时,该文件在地图文件中没有位置。

    所以我认为我已经回答了我自己的问题。  同意吗?

    谢谢你,

    ED

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

    我可以向大家展示一个可能发生的事情的例子。

    假设您定义了一个具有非普通构造函数的类...

    /* These lines typically in header file */
    class ntc {
       ntc(/* arguments here */);
    };
    
    /* These lines typically in a C++ file */
    ntc::ntc(/* arguments here */)
    {
        /* non-trivial code here */
    }

    而且,您可以定义此类的全局实例...

    ntc global_instance(/* arguments here */);

    假设您的程序的主要部分从不引用 global_instance,也不以任何方式使用此类。

    如果生成包含定义此构造函数和 global_instance 的 C++源文件,则会导致此处显示的所有代码和数据成为生成的一部分。  如果从内部版本中排除这些相同的 C++源文件,则该代码和数据不属于内部版本。

    我怀疑您的代码在这些方面有所作用。

    谢谢,此致,

    乔治

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

    此类在全局实例化。  但它的意义不同,它有一个基类,没有参数或代码。  也就是说,基类构造函数执行一些赋值。

    NTC::NTC ()
    :NTC_BASE 类()

    //无代码。
    }

    谢谢,

    ED