调用由编译器或链接器处理的约定吗?

当我们在函数原型中放入_stdcall(调用者不需要清除堆栈)时,是由编译器还是链接器来处理?调用由编译器或链接器处理的约定吗?

回答:

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

回答:

调用约定是如何调用函数(参数编制具体的机器代码,并清理CTACK)和链接涉及功能(功能在其地址)来调用。

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

回答:

在某些系统上,目标文件只是一堆数据,符号和补丁点。目标文件将告诉链接器链接代码的第574字节应该被修补以包含符号Foo和Bar之间差别的MSB,并且链接器将这样做,但链接器没有超出要执行的计算。

在其他一些系统上,链接器可能更多地涉及代码生成。例如,一些ARM处理器可以运行使用16位或32位指令集编码的代码。某些类型的代码只能使用32位指令集有效运行;一些将充分运行,但使用16位集更加紧凑。 ARM链接器知道使用每个指令集编写哪些例程,如果使用一个指令集编写的代码尝试调用使用另一个指令集编写的函数,链接器将生成一个名为“veneer”的包装器方法,并具有第一个函数调用。单板将执行调用其他方法所需的操作。即使单板是“代码”,它完全由链接器生成。

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

以上是 调用由编译器或链接器处理的约定吗? 的全部内容, 来源链接: utcz.com/qa/258727.html

回到顶部