sun博客

记录点滴!

可执行文件加载时,会从可执行文件中找到.dynamic表,将所需要的动态链接库加载。link.so加载动态链接库时,会先解析符号表,通过符号表和动态链接库文件中的.rel表,生成重定位表。例如使用010editor打开libencrypt.so时,其.rel表中只有偏移地址和type,并没有其它信息,但readelf -s libencrypt.so查看重定位表时,结果却显示的有符号名和符号值。可见这里是有对应关系的。对应关系如下:69f00是指偏移,后面的16是类型,02是相对于符号表中的偏移,以此来建立对应关系。

当可执行文件调用动态链接库中函数时,会进入.plt表,.plt表属于代码段,存储的是跳转指令,它将从.got表中获取函数的地址。如果此时.got中还没有填充这个地址,那么就要根据函数符号名(因为重定位表中只有符号名)去所有依赖的动态链接库中的重定位表中去找这个 函数符号名,找到了就返回地址,link.so会把函数的地址更新到可执行文件的.got表中,下次再调用这个函数时就不需要再去所有的动态链接库中找了。

发表评论

邮箱地址不会被公开。 必填项已用*标注