gpt4 book ai didi

c++ - 使用内联汇编程序从 GCC 中的共享库调用函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:58 25 4
gpt4 key购买 nike

我已经创建了共享库(将像插件一样使用)。有很多功能,比如a

extern "C" long __attribute__ ((__cdecl__)) SumAgrs(long X, long Y, long Z, long *Out)
{
*Out = X + Y + Z;
return 0;
}

我想在 C++(GCC、Linux)中调用这个库中的函数,但不是在编译时。当我使用内联汇编程序时,“push”指令损坏了局部变量,我不知道如何修复它。

typedef int (*FARPROC)();

void *dl_handle = dlopen("plugin.so", RTLD_LAZY);
FARPROC proc = (FARPROC)dlsym(dl_handle, "SumAgrs");

long result;

asm("leal %0, %%eax\n\r" \
"pushl %%eax" : : "m" (result));
asm("pushl $10");
asm("pushl $15");
asm("pushl $20");
asm("call *%0" : : "m" (proc));

结果二进制文件包含类似call *24(%esp) 的内容。所以我的 pushl 更改 %espcall 导致段错误。但是如何避免这种行为呢?

谢谢

最佳答案

看看 libffi:“一个可移植的外部函数接口(interface)库”

“libffi 库为各种调用约定提供了一个可移植的高级编程接口(interface)。这允许程序员在运行时调用调用接口(interface)描述指定的任何函数。”

http://sourceware.org/libffi/

关于c++ - 使用内联汇编程序从 GCC 中的共享库调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9401778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com