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


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/568577/unused-functions-and-data

您好!

我正在使用 TDA3 SOC。

在 ARM M4 CPU 上、我尝试获取所有未使用的函数和数据变量的列表(根据我看到的结果、 默认设置是编译器和链接器为每个函数生成不同的子段-我不确定数据-如何使这种情况也发生?? 链接器丢弃未使用的函数(再次不确定数据)

我还在选项上定义了一个死函数文件,但我不确定生成的文件的输出-它有一个函数列表(XML 格式),但其中列出的所有函数都与 BIOS 的内部库、XDC_runtime、...相关。 它不包含源代码中的任何函数、即使这些函数未使用、而且映射文件也不包含这些函数-因此链接器确实丢弃了它们。

您能不能帮助我了解死文件文件包含什么内容、以及如何实际获得未使用函数和数据的真实列表?

(此列表是否可以是创建的映射文件的一部分,如在 gcc 链接器中?)

谢谢

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

    假设您使用的是 TDA3 cortex M4的 TI ARM 编译器、则可以通过在链接器命令中使用--generate_dead_funcs_list 选项来生成死函数列表。
    下面是示例
    armcl --run_linker file1.obj file2.obj --generate_dead_funcs_list=feedback.txt

    更多详细信息、请参阅 www.ti.com/.../spnu151n.pdf。

    有关默认设置以及链接器如何将函数放置在内存段中的更多信息、请参阅以下文档
    processors.wiki.ti.com/.../C28x_Compiler_-_Understanding_Linking
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、如果您的编译器不同、您可以为编译器检查类似的选项。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    正如我在问题中所写的那样、我知道死函数标志并尝试使用它、但它似乎并不输出所有未使用的函数(仅来自内部 TI 库的某些函数)、并且根本不输出数据变量 (我不确定变量的标志是什么、因为我看到的所有标志都涉及代码=函数)。

    请再次查看我的问题。

    非常感谢您的帮助

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

    大家好、Guy Mardiks、

    我在 ti-cgt-arm_5.2.6上进行了尝试、并看到、除非我使用--generate_dead_funcs_list 编译链接器的输出时明确启用了--gen_func_subsections=on、否则不会生成死函数列表。 我将其设置为"on"后、便会生成 DEAD_FUNCTION 列表。

    您是否也可以在结尾处尝试此选项设置?

    示例:

    "c:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.6/bin/armcl -mv7M4 --abi=eabi -me --include_path="C:/ti/ccsv6/tools/compiler/ti-cgt-arm_5.2.6/include --include_path="./inc"-g --float_operations_allowed=all --diag_warning=225 --display_error_number --diag_fependency=off --gen_func_subsections=on -proc-prpm-preproc_preproc_preproc_preproc.mp"/src/prcmlib_pm.c。

    谢谢、此致、

    Piyali

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

    大家好、谢谢。 我还确实看到、只有在明确添加了编译器标志之后、它才会起作用(我的印象是、默认情况下、编译器标志应该是开启的)

    但我仍然找不到相同的数据标志-这里应该是标志: --gen_data_subsections,但当我尝试它时,编译器发出警告,指出它不被识别。 是否有另一个数据标志/选项(将每个全局变量置于单独的子段下并获取未使用变量的列表)? (在 GCC 中、我知道它可以正常工作、但在这里、我无法找到任何与数据一起工作的内容)

    谢谢

    家伙

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

    TI ARM CGT 5.2.6不支持--gen_data_subsections 标志。

    但是、TMS470/ARM 代码生成工具 v16.9.1.LTS 支持此功能
    下载编译器的链接如下所示
    software-dl.ti.com/.../download.htm

    有关编译器版本的一些信息如下所示:
    processors.wiki.ti.com/.../Compiler_Version_Numbers_and_What_They_Mean

    但是、这不会使用--generate_dead_funcs_list 中未使用的数据变量生成 txt 文件列表。

    为了获得链接器正在删除的全局变量列表、您可以尝试以下步骤:

    1.使用以下选项构建代码。 映射文件将包含所有全局符号的列表(链接器保留所有函数和变量)。 保留映射文件的备份。
    编译器选项:--common=off
    链接器选项:--unused_section_elimination=off
    2.使用以下选项重新编译代码(默认选项)。 将使用这些选项生成的映射文件与在步骤1中生成的映射文件进行比较。 具体查看 Map 文件的“全局符号:按名称按字母顺序排序”部分。
    编译器选项:--common=on
    链接器选项:--unused_section_elimination=on

    请告诉我这在您的最后是否有效

    谢谢、此致、
    Piyali