gpt4 book ai didi

c - 如何从 elf 调用和编译函数到我的二进制文件?

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

我有一个我不写的二进制文件 (ELF),但我想使用这个二进制文件中的 1 个函数(我知道函数的地址/偏移量),该函数不是从二进制文件中导出的。

我的目标是从我编写的 C 代码中调用此函数,并在我的二进制文件中静态编译此函数(我使用 gcc 编译)。

请问我该怎么做?

最佳答案

我来回答

call to this function from my c code that I write

部分。

以下内容在某些假设下工作,例如动态链接和位置独立代码。我没有考虑太久如果它们坏了会发生什么(让我们试验/讨论,如果有兴趣的话)。

$ cat lib.c
int data = 42;
static int foo () { return data; }

gcc -fpic -shared lib.c -o lib.so

$ nm lib.so  | grep foo
00000000000010e9 t foo

以上重现具有您知道的地址。我们现在知道的地址是 0x10e9。它是 foo 重定位前的虚拟地址。我们将通过简单地添加加载 lib.so 的基地址来模拟动态加载程序手动执行的重定位。

$ cat 1.c
#define _GNU_SOURCE
#include <stdio.h>
#include <link.h>
#include <string.h>
#include <elf.h>

#define FOO_VADDR 0x10e9

typedef int(*func_t)();

int callback(struct dl_phdr_info *info, size_t size, void *data)
{
if (!(strstr(info->dlpi_name, "lib.so")))
return 0;
Elf64_Addr addr = info->dlpi_addr + FOO_VADDR;
func_t f = (func_t)addr;
int res = f();
printf("res = %d\n", res);
return 0;
}

int main()
{
void *handle = dlopen("./lib.so", RTLD_LAZY);
if (!handle) {
puts("failed to load");
return 1;
}
dl_iterate_phdr(&callback, NULL);
dlclose(handle);
return 0;
}

现在……

$ gcc 1.c -ldl  && ./a.out
res = 42

瞧——成功了!那很有趣。

来源:this很有帮助。

如果您有任何疑问,请随时阅读此人并在评论中提问。

至于

compile this function statically in my binary

我不知道。这会更棘手。你为什么要那个?此外,您是否知道该函数是否依赖于原始 ELF 文件中的某些数据(或者可能调用其他函数),如上例所示?

关于c - 如何从 elf 调用和编译函数到我的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048252/

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