在C中模拟thiscall以实现struct函数而无需自引用

kri*_*ous 8 c compiler-construction oop assembly

这与一系列面向对象的C贴片有关,但不同之处在于我不想要所有的功能,只有一个:

能够做到这一点:

struct foo { 
  int (*bar)(void);
  char baz;
};
Run Code Online (Sandbox Code Playgroud)

然后有一个反向引用.C有一个名为cdecl的调用约定; 基本上将参数推送到堆栈,有一个返回指针,然后跳转到某个地址.该地址的代码从堆栈中弹出参数并继续它的快乐方式.

thiscall约定略有不同,因为它隐式地添加了一个额外的参数,一个"this"指针.

既然你可以开始用C执行任意字节码很容易,因为GCC支持内嵌汇编模板,这听起来像你可能只是做一些宏,以便你可以喜欢做一些事情:

int bar(void) {
  GETTHIS;
  cThis->baz = 0;
}

int createFoo(struct Foo*pFoo) {
  ASSIGN(pFoo, bar);
} 
Run Code Online (Sandbox Code Playgroud)

基本上什么ASSIGN会做的是在好歹台阶CDECL来模拟thiscall风格公约,那么什么获得OS 3.0会做的是会计把戏的另一边.

我想知道是否:

  • 解决方案存在和
  • 如果没有,如果有一个原因导致无法完成

只有这一点; 真正的"我们所有人都同意成年人"风格的会员功能,简直太棒了.谢谢!

笔记:

  • 我只是在谈论x86,linux,gcc ......我知道世界是一个广阔而奇怪的地方.
  • 纯粹出于好奇.

kri*_*ous 5

我的朋友最终得到了它:https : //gist.github.com/1516195 ... 需要指定函数参数并且仅限于 x86_64 ... 但是是的,这是一个非常好的折衷方案,使事情变得非常不引人注目。