【发布时间】:2021-07-13 14:47:42
【问题描述】:
极简主义示例:
void someFunction(){
std::cout << "Hello World" << std::endl;
}
void (*functionPointer)();
functionPointer = someFunction;
int main(){
__asm__("call *%P0"::"m"(functionPointer):);
return 0;
}
在 gcc 10.3.0 中,这会导致以下错误:
重定位被截断以适应:R_X86_64_32S 针对 `.bss'
collect2.exe:错误:ld 返回 1 个退出状态
有什么想法吗?
【问题讨论】:
-
您为我编译的示例(如此处 godbolt.org/z/1zPKqKq38 )。您是否尝试过以下问题的答案:stackoverflow.com/questions/10486116/…?
-
在什么操作系统上,以及什么编译/链接选项?
-
请注意,从内联 asm 调用函数需要安全完成更多工作。该函数可能会破坏您尚未声明的寄存器。在使用 SysV ABI 的系统上,由于红色区域,这要困难得多。
-
@Renat:你将
functionPointer设为本地内部 main,所以你得到call *-8(%rsp)。 (所以"m"约束真的很傻,强制编译器进行存储而不是使用寄存器值。)
标签: pointers x86-64 inline-assembly