1

当我们把_stdcall(调用者不需要清栈)放入函数原型时,是编译器还是链接器处理的?

4

3 回答 3

2

调用约定是如何调用函数(用于参数准备和清理 ctack 的特定机器代码)和链接器处理要调用的函数(函数在哪个地址)

因此,通常编译器会生成正确的代码并为确切的函数地址留下“占位符”,然后链接器将实际地址放在那里。也就是说,有所谓的链接时代码生成,两者都由链接器完成。

于 2011-05-05T14:23:16.767 回答
1

调用约定会影响代码生成,因此处理它的是编译器。链接器不需要知道这一点。

于 2011-05-05T14:21:53.780 回答
0

在某些系统上,目标文件只是一堆数据、符号和补丁点。目标文件会告诉链接器应该修补链接代码的字节 574 以包含符号 Foo 和 Bar 之间差异的 MSB,链接器会这样做,但链接器除了列表之外没有含义概念要执行的计算。

在其他一些系统上,链接器可能更多地涉及代码生成。例如,一些 ARM 处理器可以运行使用 16 位或 32 位指令集编码的代码。某些类型的代码只能使用 32 位指令集才能有效运行;使用 16 位集,有些会运行得很好,但更紧凑。ARM 链接器知道使用每个指令集编写了哪些例程,并且如果使用一个指令集编写的代码试图调用使用另一个指令集编写的函数,则链接器将生成一个称为“单板”的包装器方法,并让第一个函数调用. 然后,胶合板将执行调用其他方法所需的操作。即使单板是“代码”,它也完全由链接器生成。

编译器和链接器之间确实没有固定的分工。我见过一些系统,其中“编译器”将程序转换为“中间”形式,链接器完成所有真正的代码生成,并根据事物在内存中的位置进行优化。如前所述,在其他一些地方,链接器只不过是一个“修补处理器”。可能这些极端之间的每一个可以想象的分工都可能存在于某个系统的某个地方。

于 2013-12-06T17:05:37.337 回答