Compilation 编译多个调用约定

Compilation 编译多个调用约定,compilation,calling-convention,Compilation,Calling Convention,我正在看英特尔编译器中的一些Linux代码。看起来正在同时为2个调用约定编译函数。映射文件有很多函数名对,如下所示: 0x0000000008000000 __foo 0x0000000008000008 __foo. __foo: mov eax, [esp+4] mov edx, [esp+8] __foo.: push ebp ... 函数对之间的偏移量为4、8或12字节。这些指令中的每一条都对应于1、2或3条mov指令,这些指令将堆栈参数移动到如下寄存器

我正在看英特尔编译器中的一些Linux代码。看起来正在同时为2个调用约定编译函数。映射文件有很多函数名对,如下所示:

0x0000000008000000   __foo
0x0000000008000008   __foo.
__foo:
mov     eax, [esp+4]
mov     edx, [esp+8]
__foo.:
push    ebp
...
函数对之间的偏移量为4、8或12字节。这些指令中的每一条都对应于1、2或3条mov指令,这些指令将堆栈参数移动到如下寄存器:

0x0000000008000000   __foo
0x0000000008000008   __foo.
__foo:
mov     eax, [esp+4]
mov     edx, [esp+8]
__foo.:
push    ebp
...
在这些指令之后,看起来像是一个使用regparm约定的函数启动了


英特尔编译器是否使用两种不同的调用约定生成函数,然后使用给定调用方的正确输入地址?

事实上,我想你已经回答了这个问题:

英特尔编译器是否使用两种不同的调用生成函数 约定,然后使用正确的条目地址 给你打电话


foo函数似乎是用_regcall属性声明的。我的猜测是,您可能必须使用调试配置文件编译程序,因为基于堆栈帧的调用约定允许更容易获得一些信息。

您使用什么选项编译代码?我不知道。客户正在提供此代码。我正试图弄明白如何告诉他们在不确切知道构建设置的情况下更改构建设置。