[Quote=引用 10 楼 cdbdyx 的回复:]
1.首先是编译阶段,这就涉及到ELF文件的相关知识,如果某个可执行程序依赖一个动态库里面的函数,那么编译生成的ELF会记录这个动态库的名字以及这个程序调用的符号,这就区别于静态链接。也就是这个可执行程序并不存xxx的实际代码。
int xxx(int x, int y)
{
printf("x is %d, y is %d\n");
}
1.首先是编译阶段,这就涉及到ELF文件的相关知识,如果某个可执行程序依赖一个动态库里面的函数,那么编译生成的ELF会记录这个动态库的名字以及这个程序调用的符号,这就区别于静态链接。也就是这个可执行程序并不存xxx的实际代码。
int xxx(int x, int y)
{
printf("x is %d, y is %d\n");
}
我只知道程序在执行的时候,利用ld把so的代码段还有数据段,放到可执行程序对应的段里面,然后从入口函数开始执行。代码中有系统调用再到内核里面去。个人觉得so和内核没有关系,只跟程序的加载有关系。另外的话动态库的话有种惰性链接的说法,就是动态库的符号在真正执行的地方才会执行加载。具体可以参考link and loader,这一块确实比较复杂。