ZHCUAQ1F july 2015 – april 2023
编译器将源模块转换为目标文件。它可以将所有函数放在单个代码段中,也可以创建多个代码段。多个代码段的好处是链接器可以忽略可执行文件中未使用的函数。
当链接器收集要放入可执行文件的代码时,它不能拆分代码段。如果编译器没有使用多个代码段,并且特定模块中任何函数都需要链接到可执行文件中,则该模块中的所有函数都会链接进来,即使函数没有被使用。
一个示例是包含有符号除法例程和无符号除法例程的库 *.c.obj 文件。如果应用程序只需要有符号除法,则链接只需要有符号除法例程。如果只使用了一个代码段,则有符号和无符号例程都会链接进来,因为它们存在于同一个 *.c.obj 文件中。
--gen_func_subsections 编译器选项通过将文件中的每个函数放在其自己的子段来解决这个问题。因此,只有在应用程序中引用的函数才会链接到最终的可执行文件中。这将导致整体代码大小减小。
但是,请注意,如果所有或几乎所有函数都被引用,则使用 --gen_func_subsections 编译器选项可能会导致整体代码大小增大。这是因为任何包含代码的段都必须与 32 字节边界对齐以支持 C6000 分支机制。当不使用 --gen_func_subsections 选项时,源文件中的所有函数通常都放在对齐的公共段中。当使用 --gen_func_subsections 时,源文件中定义的每个函数都放在唯一的段中。每个唯一的段都需要对齐。如果链接需要文件中的所有函数,则代码大小可能会因各个子段的额外对齐填充而增大。因此,--gen_func_subsections 编译器选项有利于与库一起使用,在这些库中,任何一个可执行文件中通常只使用文件中有限数量的函数。如果不使用 --gen_func_subsections 选项,替代方法是将每个函数放在其自己的文件中。
如果未使用此选项,则默认为“off”。如果使用了此选项但既未指定“on”也未指定“off”,则默认为“on”。