程序中什么时候指定共享对象的地址?链接期间?加载中?如果我想找到的内存地址system
里面的命令libc
在我的程序中我可以轻松找到它gdb
,但是如果我不想将程序带入调试器怎么办?
这个地址在不同的运行中会改变吗?是否有任何其他静态分析工具可以查看运行时库或函数将加载到该程序的内存空间中的位置?
我想要程序之外的信息(即使用诸如objdump
收集信息)
库的加载方式为ld.so(动态链接器或运行时链接器又名 rtld,ld-linux.so.2
or ld-linux.so.*
如果是 Linux; glibc 的一部分)。它被声明为“解释器”(INTERP;.interp
所有动态链接的 ELF 二进制文件的部分)。所以,当你启动程序时,Linux会启动一个ld.so
(加载到内存并跳转到其入口点),然后ld.so
会将您的程序加载到内存中,准备它然后运行它。您还可以启动动态程序
/lib/ld-linux.so.2 ./your_program your_prog_params
ld.so
做一个实际的open
and 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
The ld.so
将看到此变量并将解析所有需要的库并打印它们的加载地址。但通过这个变量设置,ld.so
不会实际启动程序(不确定程序或库的静态构造函数)。如果ASLR功能禁用时,加载地址大多数时候都是相同的。现代 Linux 通常启用 ASLR,因此要禁用它,请使用echo 0 | sudo tee /proc/sys/kernel/randomize_va_space.
你可以找到偏移量system
里面的函数libc.so
with nm
binutils 中的实用程序。我认为,你应该使用nm -D /lib/libc.so
or objdump -T /lib/libc.so
和 grep 输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)