可执行文件复制到内存后,动态链接器是否修改引用?
does the dynamic linker modify the reference after executable is copied to memory?
假设我们有以下代码:
main.c
extern void some_function();
int main()
{
some_function();
return 0;
}
mylib.c
void some_function()
{
...
}
并且我已经创建了一个共享库 mylib.so
并且 link 我要执行 table 目标文件 prog
linux> gcc -shared -fpic -o mylib.so mylib.c
linux> gcc -o prog main.c ./mylib.so
假设下图是prog
的executable对象格式
通过动态linking,我们知道mylib.so中的代码或数据部分的none此时实际上被复制到executable prog2l中。相反,linker 复制了一些重定位和符号 table 信息,这些信息将允许在加载时解析对 mylib.so 中代码和数据的引用。
我只是想仔细检查一下我的理解是否正确:
当prog
被加载器加载到内存中时如下图所示
那么动态linker会修改内存中prog
的.data
段,这样就可以linked/relocated到[=19=的指令地址了] 在 mylib.so
的 .text
部分。
我的理解正确吗?
相当接近。动态链接器将修改数据段中的某些内容,而不是特定的 .data
部分 - 段是 coarser-grained 对应于文件如何映射到内存而不是原始语义分解的东西。实际部分通常称为 .got
或 .got.plt
但可能因平台而异。修改不是“将其重定位到指令地址”,而是解析对函数名的重定位引用以获取其加载的地址,并将该地址填入。
假设我们有以下代码:
main.c
extern void some_function();
int main()
{
some_function();
return 0;
}
mylib.c
void some_function()
{
...
}
并且我已经创建了一个共享库 mylib.so
并且 link 我要执行 table 目标文件 prog
linux> gcc -shared -fpic -o mylib.so mylib.c
linux> gcc -o prog main.c ./mylib.so
假设下图是prog
通过动态linking,我们知道mylib.so中的代码或数据部分的none此时实际上被复制到executable prog2l中。相反,linker 复制了一些重定位和符号 table 信息,这些信息将允许在加载时解析对 mylib.so 中代码和数据的引用。
我只是想仔细检查一下我的理解是否正确:
当prog
被加载器加载到内存中时如下图所示
那么动态linker会修改内存中prog
的.data
段,这样就可以linked/relocated到[=19=的指令地址了] 在 mylib.so
的 .text
部分。
我的理解正确吗?
相当接近。动态链接器将修改数据段中的某些内容,而不是特定的 .data
部分 - 段是 coarser-grained 对应于文件如何映射到内存而不是原始语义分解的东西。实际部分通常称为 .got
或 .got.plt
但可能因平台而异。修改不是“将其重定位到指令地址”,而是解析对函数名的重定位引用以获取其加载的地址,并将该地址填入。