gpt4 book ai didi

c++ - 是否可以将数组数字作为函数执行?

转载 作者:太空狗 更新时间:2023-10-29 11:38:40 27 4
gpt4 key购买 nike

长话短说,我有一个整数数组,表示具有一个函数的 ELF 二进制文件的 .text 部分。我想执行这个功能。在尝试执行命令之前,我已经运行了这个命令:

mprotect(function, sHeader.sh_size, PROT_EXEC | PROT_READ | PROT_WRITE);

认为它可能会解决权限问题,但当我尝试运行它时它仍然会出现段错误:

int (*fp)(int, int) = (int (*)(int, int))getFunc("t.o");
int a = 2;
int b = 3;
cout << fp(a, b) << "\n";

但是当我尝试运行它时它仍然会出现段错误:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000603010 in ?? ()

有什么我遗漏的吗?

我正在尝试执行的函数的 objdump:

0000000000000000 <mult>:
mult():
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 89 7d fc mov %edi,-0x4(%rbp)
7: 89 75 f8 mov %esi,-0x8(%rbp)
a: 8b 45 fc mov -0x4(%rbp),%eax
d: 0f af 45 f8 imul -0x8(%rbp),%eax
11: 5d pop %rbp
12: c3 retq

最佳答案

ELF目标文件包含 relocation信息,很可能是它的 .text部分包含要重新定位的代码,因此代码不会按原样运行。使用 objdumpreadelf命令来探索它。如果你真的想按照你的方式加载它,你应该处理重定位信息,这是复杂的、处理器特定的和乏味的。如果你真的想花几周时间做这件事,研究 x86-64 ABI .但是使用 dlopen.so然后dlsym更简单(因为 dlopen 在具有 mmap 后进行重定位 - 来自 t.so 的段),请参见下文。

x86-64 ABI 曾经在 http://x86-64.org/documentation/abi.pdf 上但是那个网站今天不工作了

什么是 getFunc ?你如何在你的内部搬迁 t.o ?你为什么不能有一个 t.so共享对象(例如使用 gcc -Wall -fPIC -O -shared t.c -o t.so 编译)然后使用 dlopen(3) 加载它和 dlsym(3)例如

typedef int functionsig_t (int, int);
void* dlh = dlopen("./t.so", RTLD_NOW);
if (!dlh) {
fprintf(stderr, "dlopen t.so failed with %s\n", dlerror());
exit(EXIT_FAILURE);
};
functionsig_t* fp = (functionsig_t*) dlsym(dlh, "myfunc");
if (!fp) {
fprintf(stderr, "dlsym myfunc failed with %s\n", dlerror());
exit(EXIT_FAILURE),
}
// now you can call fp
int res = (*fp) (1,2);

一旦fp返回且不存在使用 t.so 中的任何函数的调用堆栈帧你可以dlclose(dlh);这将 munmap来自 t.so 的片段.您可以避免调用 dlclose (这通常会造成进程地址空间的微不足道的泄漏;请参阅文件 /proc/1234/maps 以了解 pid 1234 的进程),尤其是如果您不 dlopen大量共享对象。

如果t.so插件从您的主程序调用函数,您希望该主程序与 -rdynamic 链接ld 的选项或 gcc

如果t.so已经从一些 C++ 源代码编译而来,它应该声明

 extern "C" int myfunc(int,int);

因为name manglingg++ 完成

我的 manydl.c程序显示您可以执行数十万次dlopen -s 在 Linux 进程中。它通过生成“随机”C 代码,将其编译成一些 .so 来工作。 , 和 dlopen -那个.so文件,然后重复多次。

如果你不想编译 .c 的负担或 .cc编码为 .so插件,您可以考虑使用 LLVM 在内存中即时生成代码, asmjit , libjit , GNU lightning等等……

关于c++ - 是否可以将数组数字作为函数执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291381/

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