区别Linux下so与a文件的区别(linux.so.a)

Linux下的动态链接库文件有so和a两种,两者有着不同的特征与用处:

so文件:so文件是Linux下的shared object文件,是动态链接库的文件,而不是可执行的文件,不会直接执行;

a文件:a文件是Linux下的archives文件,是静态链接库的文件,不具备动态链接库文件的特性,不能被运行。

so与a文件的最主要区别是:

1、一般so文件拥有独立的可执行性,该文件可以被动态加载,操作系统会将其直接加载到应用程序的地址空间,也可以用来拓展应用程序的功能;而a文件并不具有独立的可执行性,它将在程序编译阶段就被静态加载进程序,无法外部或动态加载。

2、so文件是链接时可以搜索找到与程序相对应的库文件,从而加载进去;而a文件是在编译阶段一次性把所有的库文件都加载进去,无法在链接时找到。

下面是一段示例代码,用于演示动静态链接特点:

“`c

// 静态链接示例

int main(){

int x = add(2, 3);

int y = div(x, 2);

printf(“x=%d, y=%d\n”, x, y);

return 0;

}


```c
// 动态链接示例
int main(){
void *handle;
int (*add)(int, int);
int (*div)(int, int);
handle = dlopen("./lib.so", RTLD_LAZY);
add = (int (*)(int, int))dlsym(handle, "add");
div = (int (*)(int, int))dlsym(handle, "div");
int x = add(2, 3);
int y = div(x, 2);
printf("x=%d, y=%d\n", x, y);
return 0;
}

可以看到,从示例代码可以发现,so文件可以用于动态加载,而静态链接时无法在链接阶段搜索到。

总结:so文件拥有独立可执行性,可以用于动态加载;而a文件则不具备可执行性,需要在程序编译阶段一次性把所有的库文件都静态加载进去。


数据运维技术 » 区别Linux下so与a文件的区别(linux.so.a)