gpt4 book ai didi

c - dlsym -- 获取覆盖的符号

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

我有一个动态加载库的应用程序,它动态加载库...

在 Windows 中,我能够遍历所有加载的模块以查找我感兴趣的符号。不知道如何在 Unix/Linux 环境中执行此操作。我知道我可以对前两个符号使用 dlsym(dlopen(0, flag))dlsym(RTLD_DEFAULT/RTLD_NEXT) 并且知道要搜索的模块的顺序 - - 我怎样才能更深入地了解给定符号的所有定义?

最佳答案

要在分片对象中查找符号,请使用 dlopen 打开它。

 void* foobar = dlopen ("/usr/local/lib/foobar.so", RTLD_NOW);
void* mysymbol = dlsym (foobar, "mysymbol");

更新 这是一个迭代所有名为“foo”的符号的程序。这不是 POSIX,而是 GNU 库。我几乎可以肯定 POSIX 不提供此类功能。

#define _GNU_SOURCE 
#include <link.h>
#include <dlfcn.h>
#include <stdio.h>

void doit (const char* s)
{
void* obj = dlopen (s, RTLD_LAZY);
void* fcn = dlsym (obj, "foo");
if (fcn)
printf ("Object %s has 'foo' at addr %p\n", *s ? s : "(exe)", fcn);
}
int cb (struct dl_phdr_info *info, size_t size, void *data)
{
doit (info->dlpi_name);
return 0;
}
int main ()
{
dl_iterate_phdr (cb, 0);
return 0;
}

这是输出:

Object (exe) has 'foo' at addr 0xb76f8418
Object (exe) has 'foo' at addr 0xb76f8418
Object /tmp/libfoo.so has 'foo' at addr 0xb76f8418
Object /tmp/libfoo1.so has 'foo' at addr 0xb76f5418
Object /tmp/libfoo2.so has 'foo' at addr 0xb76f2418

有一些重复,但这是一个小问题。

关于c - dlsym -- 获取覆盖的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328249/

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