2

构建完成后,我在映射文件中找到了 (i.function name) 部分。

==================================================== ====

前任)

[foo1.h] // 内联函数定义和声明

__forceinline UINT32 func1(VOID) { ... }

[foo2.cpp] // 使用的内联函数

#include "foo1.h"

UINT32 func2(VOID) { ... func1(); // 编译时非内联 }

[地图文件]

foo2.o(.text) 指的是 foo2.o(i.func1) 的 func1

==================================================== ====

映射文件中的典型部分如下所示:(.text)、(.ARM.exidx)、(.data)、(.constdata)、(.bss)、(USER Defined Section Name)、...

经过几次构建测试后,我猜 (i.function name) 部分出现在定义内联但编译器不应用内联的函数使目标文件中的 AREA 符号成为行外版本时。而这样的函数位于 (i.function name) 部分。如果所有内联函数都是内联的,则没有符号或(i.function name)部分。

为什么非内联应用的内联函数位于该部分?(不是.text?)

(i.function name) 部分的确切含义是什么?

我查阅了以下文档,但无法得到我想要的关于内容的答案。

  • ARM 编译器用户指南、ARM 编译器参考指南、ARM Link 用户指南、ARMCC 用户指南、用于 ARM 架构的 ELF
4

1 回答 1

0

当包含标志时,编译器将为每个函数生成一个节--split_sections参见此处),作为节的指定名称i.functionName

请注意,由于缺少与共享资源相关的潜在优化,此标志可能会增加代码的大小。

另一方面,inline将(来自维基百科):

如果需要,发出一个在翻译单元之间共享的函数,通常通过将其放入需要它的目标文件的公共部分

因此,两者在没有任何控制(或彼此限制)的情况下可能最终导致调用错误的段。

于 2020-05-12T09:54:00.073 回答