gpt4 book ai didi

c - 使用动态库获取结构中成员的地址

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:47 24 4
gpt4 key购买 nike

通过查看这个答案:https://stackoverflow.com/a/4671482/1770034 我可以使用 dlsym 在 C 中获取全局变量。是否有可能从结构中获取成员。

我猜如果我在共享对象中有以下代码:

标题.h

struct myStruct
{
int a;
int b;
};

imp.c

struct myStruct structure = { 123, 456 };

我可以包含相同的 header.h 文件并将整个指针转换为 struct myStruct*。 struct myStruct * capturedStructure = (struct myStruct*) dlsym(handle, "structure");

但是,有没有办法直接获取成员的地址。我猜我无法做类似的事情:int* c = (int*) dlsym(handle, "structure.b");

由于 dlsym 允许一个人自己获取一个函数或全局(没有标题),我希望我也可以在不需要标题的情况下获取一个成员。

最佳答案

the address to member directly

正常的方式是这样的:

struct myStruct *pnt = (struct myStruct*) dlsym(handle, "structure");
int *b = &pnt->b;

现在让我们替换 s/pnt/((struct myStruct*) dlsym(handle, "structure"))/。那是:

int *b = &((struct myStruct*) dlsym(handle, "structure"))->b;

without the compiler having the structure defined? (from comments)

这可能有点棘手,但我们可以做到。您需要导出另一个符号:

const size_t offsetof_member_b_in_myStruct = offset(struct myStruct, b);

然后在客户端代码中:

int *b = (int*)(
(uintptr_t)dlsym(handle, "structure") +
*(size_t*)dlsym(handle, "offsetof_member_b_in_myStruct")
);

我想这样的 API 应该是一致的,但感觉很糟糕。将结构导出到客户端代码更简单。也许在一般情况下,最好创建一个标准,指定您与客户端代码交换的结构的内存布局(因此您将责任推给客户端以提供适当的抽象)。

关于c - 使用动态库获取结构中成员的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014666/

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