程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了什么时候/ Linux如何将共享库加载到地址空间?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决什么时候/ Linux如何将共享库加载到地址空间??

开发过程中遇到什么时候/ Linux如何将共享库加载到地址空间?的问题如何解决?下面主要结合日常开发的经验,给出你关于什么时候/ Linux如何将共享库加载到地址空间?的解决方法建议,希望对你解决什么时候/ Linux如何将共享库加载到地址空间?有所启发或帮助;

库由加载ld.so(动态连接器或运行时链接又名rtld,ld-linux.so.2ld- linux.so.*在linux中的情况下;的glibc的一部分)。它被声明为.interp所有动态链接的ELF二进制文件的“解释器”(INTERP;部分)。因此,当您启动程序时,linux将启动一个ld.so(加载到内存中并跳转到其入口点),然后ld.so将您的程序加载到内存中,准备并运行它。您也可以使用以下命令启动动态程序

 /lib/ld-linux.so.2 ./your_program your_prog_params

ld.so执行实际的open和@H_882_3@mmap所有需要的ELF文件,包括程序的ELF文件和所有需要的库的ELF文件。同样,它填充GOT和plt表并进行重定位解析(它将函数的地址从库写入调用站点,在许多情况下是间接调用)。

您可以通过ldd实用程序获得的某些库的典型加载地址。它实际上是一个bash脚本,它设置ld.so的调试环境变量(实际上LD_TRACE_LOADED_OBjeCTS=1在glibc的rtld情况下)并启动程序。您甚至还可以自己执行此操作而无需脚本,例如使用bash轻松更改环境变量以进行单次运行:

 LD_TRACE_LOADED_OBjeCTS=1 /bin/echo

ld.so会看到这个变量,将解决所有需要的库,并打印出来的加载地址。但是设置了此变量后,ld.so实际上将不会启动程序(不确定程序或库的静态构造函数)。如果禁用了ASLR功能,则加载地址将与大多数时间相同。现代linux经常启用了ASLR,因此要禁用它,请使用echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

您可以system在binutils中的libc.sowith nm实用工具中找到函数的偏移量。我认为,您应该使用nm -D /lib/libc.soor objdump -T /lib/libc.so和grep输出。

解决方法

我的问题如下:

程序中何时指定共享对象的地址?在链接期间?载入中?如果我想在程序system内部找到命令的内存地址,libc可以在中轻松找到它gdb,但是如果我不想将程序带入调试器怎么办?

此地址可以在运行之间更改吗?是否有其他静态分析工具可让您查看在运行时将库或函数加载到该程序的内存空间中的位置?

编辑:我想在程序之外的信息(即使用实用程序objdump来收集信息)

大佬总结

以上是大佬教程为你收集整理的什么时候/ Linux如何将共享库加载到地址空间?全部内容,希望文章能够帮你解决什么时候/ Linux如何将共享库加载到地址空间?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。