栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

库由加载

ld.so
(动态连接器或运行时链接又名rtld,
ld-linux.so.2
ld-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
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,因此要禁用它,请使用
echo0 | sudo tee/proc/sys/kernel/randomize_va_space

您可以

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号