我的问题如下:
程序中何时指定共享对象的地址?在链接期间?载入中?如果我想在程序system
内部找到命令的内存地址,libc
可以在中轻松找到它gdb
,但是如果我不想将程序带入调试器怎么办?
此地址可以在运行之间更改吗?是否有其他静态分析工具可让您查看在运行时将库或函数加载到该程序的内存空间中的位置?
编辑:我想在程序之外的信息(即使用实用程序objdump
来收集信息)
库由加载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,因此要禁用它,请使用echo 0 | 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输出。
问题内容: 在研究共享库时,我读了一条声明 尽管共享库的代码在多个进程之间共享,但其变量却不是。使用该库的每个进程都有其在库中定义的全局变量和静态变量的副本。 我对此几乎没有疑问。 每个进程的代码部分是否在单独的地址空间中? 共享库代码部分是否在某些全局(唯一)地址空间中。 我只是一个初学者,所以请帮助我理解。 谢谢! 问题答案: 通过将文件内存映射到进程的地址空间的某些部分,可以将共享库加载到进
问题内容: 我正在做centos。我在系统上安装了1.45.0 Boost版本。程序已正确编译,但是每当我键入命令以查看输出时,就会出现以下错误: ./a.out:加载共享库时出错:libboost_thread.so.1.45.0:无法打开共享库文件:没有此类文件或目录 问题答案: 您是如何安装Boost库的? 您可能遇到的问题是链接器找不到库,并且在构建程序时,必须手动指定其他库路径来搜索库。
我有一个CMACE项目,它的下一个结构是: 输出树为: 如果我在linux下编译程序,所有的工作都很完美,但是当我在Windows下做的时候,编译很好,但是app.exe不执行;我得到下一个错误: 我怀疑不要链接internal.cpp,因为当我将它的过程移到internal.h中时,就可以很好地工作。 有什么需要帮忙的吗? 以下是文件:root::cmakelists.txt app::cmak
问题内容: Debian不再为gTest提供任何预编译的软件包。他们建议您将框架集成到项目的makefile中。但是我想保持我的makefile干净。如何像以前的版本(<1.6.0)一样设置gTest,以便可以链接到库? 问题答案: 开始之前,请确保您已阅读并理解 Google的注释! 1.获取googletest框架 或手工获取。我不会保留这小小的“操作方法”,因此,如果您偶然发现了它,并且链接
问题内容: 我正在尝试建立一个共享库。让我们说libabc.so。它使用另一个.so文件,例如lib123.so(/ usr / local / lib中的一个lib)。现在我在我的应用程序中使用共享的liblibabc.so。说我的应用程序。我想知道我应该如何链接这些二进制文件?我不想直接将我的应用程序与lib123.so链接。my- app应该仅与libabc.so链接。我怎样才能做到这一点?
问题内容: 不加载VDSO.so是使用gdb和glibc> 2.2时遇到的著名错误之一。我发现计划在gdb 7.5.1中修复它,但事实并非如此。好吧,我找到了一个工作,在这里在这里,但我不明白它,如何使用它。 操作系统:Arch Linux IDE:QT creator 3.0.82 编译器:GCC 4.8.2 NB:我不确定是否违反了包括上面链接的规则 问题答案: 不加载VDSO.so是使用gd