首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dlsym是如何工作的?

dlsym是如何工作的?
EN

Stack Overflow用户
提问于 2016-07-04 20:24:01
回答 1查看 2.4K关注 0票数 6

很容易找到如何使用 dlsym()和来自这个家族的其他函数,但是如何在内部工作呢?是否可以编写自己的、易于实现的dlsym()?

我想知道是否有可能实现类似的行为,但是没有链接到-ldl (让我们说我做不到)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-05 03:50:51

它是如何内部工作的?

正如这个答案所解释的,在GLIBC中,第一个参数实际上是指向struct link_map的指针,它包含足够的信息来定位共享库的动态符号表。一旦找到符号表和DT_HASHDT_GNU_HASHdlsym将使用一个或另一个哈希表查找给定的符号名。

是否可以编写自己的、易于实现的dlsym()?

是。如果您不关心查找的速度,只需对动态符号表进行线性搜索即可。这样做的代码非常简单,特别是如果共享库有(可选的)节头:只需在内存中查找.dynsym.dynstr节的位置,然后(假设您正在寻找符号"foo")。

代码语言:javascript
复制
const char *strtab = ... /* locate .dynstr */
const ElfW(Sym) *sym = ... /* locate .dynsym */

for (; sym < end_of_dynsym; ++sym) {
  if (strcmp(strtab + sym->st_name, "foo") == 0) {
    /* found it */
    return load_address + sym->st_value;
  }
}
/* symbol not found */
return NULL;

如果您确实关心查找速度(dlsym当然关心),则需要对.hash.gnu_hash进行解码,这要复杂一些。你可以启动这里

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38191776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档