2016-06-15 45 views
1

如果我理解当用户试图执行动态链接 可执行文件(使用execve("foo", "", ""))而不是加载“foo”文本段动态链接器加载(ld-linux.so.2)并执行。它必须加载程序(“foo”)所需的 库以运行并将“foo”中的某些地址 更改并将控制权交给foo,但是如何实现此目的?动态链接程序如何更改进程的文本段?

怎样(什么系统调用它使用),并在那里 确实在内存中动态加载器加载库和“富” S代码和数据(我猜它不能简单地用 的malloc或MMAP,然后跳转到的代码,因为这应该是不可能的, 对吗?它似乎不太可能会创建临时文件完整的 可执行文件(如staticlly链接的一个),并再次调用excel。)。

+0

“因为那应该是不可能的,对吧?”错误。 –

+1

奇怪的是,不可能在我的桌面和其他电脑上运行,包括手机。你可能想自己做一些关于动态链接的研究,以及如何在Linux(和其他现代操作系统)上初始化程序。 – Olaf

回答

0

实际的实现非常复杂,因为它构建在ELF之上,这很复杂,因为它试图适应多种场景,但从概念上讲它非常简单。

基本上(库依赖关系被定位并且open ED之后)它是几个MMAP S,则mprotect S,一些修改通过结合符号(可以推迟)实现的连接,然后跳转到代码。

在理想情况下,链接的共享库将与-fpic/-fPIC这将允许连接器到所述过程中的地址空间的任何地方放置它们,而无需编写到库的.text部分(=可执行代码)编译。 这样的库/可执行文件将通过一个可修改的表格调用其他库中的函数,链接器将会修正(可能是延迟)指向它加载相关库的实际位置。 访问从一个共享库到另一个共享库的变量同样是间接的。

尽可能限制修改库数据/代码允许将标记代码段标记为只读(通过MMU/mprotect系统调用)并映射到所有使用该特定库的进程之间共享的内存中。


要获得在系统调用层面发生了什么想法,你可以尝试一下如:

strace /bin/echo hello world 

,所有的系统调用高达约sbrk包括(=设置堆/ .data段)应该是动态链接器的做法。


malloc是到链接器确实不可用作为malloc是C库的系统中的功能,而不是。malloc约为生长和管理堆部分和潜在mmap平其他独立的块和管理这些以及作为可写的“堆”,而动态链接器并不关心过程映像的这些部分,主要是它的可写间接表以及映射库的位置)。