gpt4 book ai didi

c - 从内存中打开?

转载 作者:太空狗 更新时间:2023-10-29 16:23:29 32 4
gpt4 key购买 nike

我正在寻找一种直接从内存中加载生成的目标代码的方法。

我明白如果我把它写入一个文件,我可以调用 dlopen 来动态加载它的符号并链接它们。然而,考虑到它从内存开始,写入磁盘,然后由 dlopen 重新加载到内存,这似乎有点迂回。我想知道是否有某种方法可以动态链接内存中存在的目标代码。据我所知,可能有几种不同的方法可以做到这一点:

  1. 让 dlopen 认为您的内存位置是一个文件,即使它永远不会离开内存。

  2. 找到一些其他的系统调用来完成我正在寻找的事情(我认为这不存在)。

  3. 找到一些可以直接在内存中链接代码的动态链接库。显然,这个有点难以用谷歌搜索,因为“动态链接库”会提供有关如何动态链接库的信息,而不是有关执行动态链接任务的库的信息。

  4. 从链接器中提取一些 API,并在其代码库中创建一个新库。 (显然,这对我来说是最不可取的选择)。

那么其中哪些是可能的呢?可行的?你能指出我假设存在的任何事物吗?还有其他我什至没有想到的方法吗?

最佳答案

我需要一个解决方案,因为我有一个没有文件系统(使用数据库中的 blob)的可编写脚本的系统,并且需要加载二进制插件以支持某些脚本。这是我想出的解决方案,它适用于 FreeBSD,但可能不可移植。

void *dlblob(const void *blob, size_t len) {
/* Create shared-memory file descriptor */
int fd = shm_open(SHM_ANON, O_RDWR, 0);
ftruncate(fd, len);
/* MemMap file descriptor, and load data */
void *mem = mmap(NULL, len, PROT_WRITE, MAP_SHARED, fd, 0);
memcpy(mem, blob, len);
munmap(mem, len);
/* Open Dynamic Library from SHM file descriptor */
void *so = fdlopen(fd,RTLD_LAZY);
close(fd);
return so;
}

显然代码缺少任何类型的错误检查等,但这是核心功能。

ETA:我最初认为 fdlopen 是 POSIX 的假设是错误的,这似乎是 FreeBSD 主义。

关于c - 从内存中打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5053664/

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