很容易找到如何使用 dlsym()和来自这个家族的其他函数,但是如何在内部工作呢?是否可以编写自己的、易于实现的dlsym()?
我想知道是否有可能实现类似的行为,但是没有链接到-ldl (让我们说我做不到)。
发布于 2016-07-05 03:50:51
它是如何内部工作的?
正如这个答案所解释的,在GLIBC中,第一个参数实际上是指向struct link_map的指针,它包含足够的信息来定位共享库的动态符号表。一旦找到符号表和DT_HASH或DT_GNU_HASH,dlsym将使用一个或另一个哈希表查找给定的符号名。
是否可以编写自己的、易于实现的dlsym()?
是。如果您不关心查找的速度,只需对动态符号表进行线性搜索即可。这样做的代码非常简单,特别是如果共享库有(可选的)节头:只需在内存中查找.dynsym和.dynstr节的位置,然后(假设您正在寻找符号"foo")。
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进行解码,这要复杂一些。你可以启动这里。
https://stackoverflow.com/questions/38191776
复制相似问题