动态链接

加载动态链接时相关的节

加载时不同地方在于碰到.interp节时,会从.interp节读出一个路径字符串,这个路径指向了该可执行文件需要的动态链接器在文件系统中的位置

此处测试给出了一个软连接,但是fat32并不支持,只能判定并进行转发到libc.so

动态链接传参

静态程序传参时只需要传argv向量即可,会把argc,argv[0],argv[1],...,argv[argc-1],0放入栈中,而动态链接程序有所不同 除了要传argv,还要传环境路径和aux,环境路径作为加载依赖库时寻找的路径,aux中记载了要执行的程序的program header,基地址等 所以相当于需要在栈中放入三个向量,三个向量地址从低到高如下所示

main函数所需参数: argc argv[0] argv[1] ... argv[argc-1] 0

environment: "environ[0]=value[0]" "environ[1]=value[1]" ... 0

auxv: AT_ID1 aux[AT_ID1] AT_ID2 aux[AT_ID2] AT_ID3 aux[AT_ID3] ... 0

三个向量都以0作为结束,而且形式各有不同

入口点

动态链接程序需要以动态链接器的入口地址作为入口点

动态链接器在经过dl_start-dls2-dls2b-dls3的过程后才会进入要执行的程序的入口点

Last updated