【问题标题】:Why gcc produce different assembly result for user and kernel level code为什么 gcc 为用户和内核级代码产生不同的汇编结果
【发布时间】:2019-07-24 13:51:11
【问题描述】:

我正在尝试学习 arm 架构中的函数调用语法,并且我为用户模式应用程序和可加载内核模块编译了相同的代码。在附图中,您可以看到两种不同模式下相同功能的反汇编结果。我很好奇造成这种差异的原因。

【问题讨论】:

  • 那些不能是等价的指令序列;一个调用了另一个没有的函数 (__gnu_mcount_nc)。如果它们是从相同的代码编译的,则表明差异是由于条件包含或其他预处理器效果,或者可能是依赖于使用预处理器符号的表达式的编译时优化。您应该提供minimal reproducible example,包括已编译的源代码、编译器的名称和版本、使用的确切编译器命令行(带有所有开关)以及编译器的汇编输出(而不是反汇编)。

标签: c function gcc arm


【解决方案1】:

您已使用完全不同的选项编译代码。第一个是 ARM(仅限 32 位),第二个是 Thumb2(混合 16/32 位);请参阅侧面的十六进制操作码。 Thumb2 以紧凑的方式(16 位编码)使用前 8 个寄存器,因此调用接口不同。即,fp 是 r7 与 r12。这就是为什么您会看到相同代码的不同调用序列。

此外,第一个启用了分析(为什么插入 __gnu_mcount_nc)。

这实际上与“内核”与“用户”代码无关。可以使用与内核使用类似的选项来编译用户代码。有许多 gcc 命令行选项会影响“调用接口”(搜索 AAPCS 以获取更多信息和 gcc ARM 选项帮助)。

相关:ARM Link and frame pointer

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2022-01-24
    • 2016-11-13
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多