Linux x64下SBDebugger成员函数this参数调用约定疑问
Linux x64平台调用LLDB C++ API的调用约定问题
我需要从非C语言编写的应用中调用Linux x64平台的LLDB函数(该问题可扩展至任意C API调用场景),因此必须明确对应的调用约定及参数传递规则。
我尝试调用的目标函数是SBDebugger::GetCommandInterpreter,其C++定义如下:
lldb::SBCommandInterpreter GetCommandInterpreter();
最初我认为,作为成员方法,它会将SBDebugger指针作为this参数传入RDI寄存器,但按此方式调用时直接触发了段错误。
查看该函数的反汇编代码:
push %r13 push %r12 mov %rsi,%r12 push %rbp push %rbx mov %rdi,%rbx
可以看到函数同时读取了RDI和RSI寄存器,但按函数定义它只需要this这一个参数。结合SBDebugger对象大小为16字节(内部包含一个shared_ptr)的情况,我推测该函数期望this按值传递而非引用——根据System V ABI规则,16字节的参数会拆分到RDI和RSI两个寄存器中,这和反汇编的行为吻合。
但这个推测存在两处不合理的地方:
- 如果
this按值传递,方法执行产生的副作用无法同步到调用方的原对象上; - System V ABI明确规定:
若C++对象拥有非平凡拷贝构造函数或析构函数,则通过隐式引用传递,而SBDebugger确实定义了自定义的析构函数和拷贝构造函数:
SBDebugger(); SBDebugger(const lldb::SBDebugger &rhs); SBDebugger(const lldb::DebuggerSP &debugger_sp); ~SBDebugger();
我尝试按值传递SBDebugger对象时,调用本身看似成功,但后续使用返回的SBCommandInterpreter时触发了段错误,推测方法返回的是无效数据。
我尚未理清该方法调用的核心逻辑,请问:应该向哪些寄存器传递什么值?背后的原因是什么?
内容的提问来源于stack exchange,提问作者Kevin Gosse
相关产品推荐
相关产品推荐

