共享库 – Linux ELF文件:如何获取属于导入函数的共享对象

共享库 – Linux ELF文件:如何获取属于导入函数的共享对象,第1张

概述给定动态链接的ELF二进制文件,例如/ bin / less. 在二进制文件中,有一个对共享库提供的函数的调用,例如strcpy() 如何找出获取strcp函数的共享库/共享对象? 换句话说,我想获得对func_name / shared_obj_name.so. 回答this post,Michael Slade写道: ELF files don’t specify which symbols 给定动态链接的ELF二进制文件,例如/ bin / less.

在二进制文件中,有一个对共享库提供的函数的调用,例如strcpy()

如何找出获取strcp函数的共享库/共享对象?
换句话说,我想获得对func_name / shared_obj_name.so.

回答this post,Michael Slade写道:

ELF files don’t specify which symbols come from which librarIEs; it
just adds a List of shared librarIEs to link to into the ELF binary,
and lets the linker find the symbols in the librarIEs.

然而,必须有一种方法来收集所需的信息(使用链接器).在我的情况下,执行二进制文件并对其进行跟踪不是一个选项.到目前为止我尝试了什么:

我试过objdump -T / bin / less | grep strcpy给了我:

0000000000000000      DF *UND*  0000000000000000  GliBC_2.2.5 strcpy0000000000000000      DF *UND*  0000000000000000  GliBC_2.3.4 __strcpy_chk

这既不明确也不给我一个.so文件的名称.

运行ldd / bin / less,返回:

linux-vdso.so.1 =>  (0x00007ffe8b7fa000)libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f92c23a5000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92c1fe0000)/lib64/ld-linux-x86-64.so.2 (0x00007f92c25ec000))

让我认为“GliBC_2.2.5”对应于libc.so.6

如何以编程方式查找相应的共享对象(.so文件)到(导入)函数?

解决方法

How can I find out from which shared library/shared object the strcp function is obtained?

通常,您不能:该库可以在运行时更改.例如,如果我编译以下源代码:

int strcpy(char *a,const char *src) { abort(); }$gcc -fPIC -shared -o foo.so foo.c

然后像这样运行你的程序:

LD_PRELOAD=./foo.so /bin/less

然后获取strcpy的库是foo.so.使用LD_PRELOAD这种方式称为库插入,在各种circumstances中都很有用.

除了LD_PRELOAD之外,还有其他方法可以将不同的库注入到进程中.

如果您没有使用任何此类机制,并且正在使用GliBC,那么您可以要求动态加载程序为您回答该问题.这是一种方式:

LD_DEBUG=bindings ldd -r /bin/less < /dev/null |& egrep '\Wstrcpy\W'     26623: binding file /bin/bash [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GliBC_2.2.5]     26633: binding file /lib/x86_64-linux-gnu/libtinfo.so.5 [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GliBC_2.2.5]     26633: binding file /bin/less [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: normal symbol `strcpy' [GliBC_2.2.5]

上面你可以看到ldd调用bash而不是单独的进程,并且它们都绑定到libc.so.6这个特定的符号.

How can I programmatically find the corresponding shared object (.so file) to an (imported) function?

如果您使用的是GliBC,请使用dladdr“询问”动态链接器.返回的“info”参数将告诉您文件名.

总结

以上是内存溢出为你收集整理的共享库 – Linux ELF文件:如何获取属于导入函数的共享对象全部内容,希望文章能够帮你解决共享库 – Linux ELF文件:如何获取属于导入函数的共享对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1018155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存