1.用nm命令获取动态库中的所有符号列表,假如动态库的文件为lib.so
nm -gD lib.so > lib.txt? 将把符号列表输出到名为lib.txt的文本文件中
2.创建个新的静态库文件,使用ar命令可以创建一个空的静态库文件
ar -rcs lib.a
3.将动态库中的每个符号提取到静态库中,用objcopy命令将动态库中的每个符号提取到静态库中,
while read line; do
symbol=$(echo $line | awk '{print $3}')
objcopy --redefine-sym $symbol=libdynamic.so libstatic.a
done < symbol_list.txt
这个我不会用
objcopy --redefine-syms=symbol_list.txt libdynamic.so libstatic.a
?4.完成后,你将得到一个名为libstatic.a
的静态库文件,其中包含了从动态库中提取的所有符号。
请注意,这种方法只能将动态库中的符号转换为静态库中的符号,而无法将动态链接库中的代码转换为静态库中的代码。如果需要将动态库的代码静态链接到应用程序中,还需要重新编译该代码并将其与应用程序一起静态链接。
存储方式:静态库的代码和符号被编译进可执行文件中,而动态库的代码和符号则是在运行时从共享库文件中加载到进程空间中。
可重定位性:静态库的符号和代码可以被多次复用,因为它们被编译为可重定位目标文件,在链接时被静态地链接到可执行文件中。而动态库的符号和代码只有在运行时才会被加载,因此不能被多次复用。
大小:静态库包含完整的代码和数据,所以它的大小通常比动态库大。动态库只包含代码和数据的一部分,因此它的大小通常比静态库小。
运行时行为:静态库在编译时将其代码和数据链接到可执行文件中,因此它在运行时的行为与可执行文件完全一致。而动态库的行为则取决于其加载和链接时的环境,例如其版本、位置和加载顺序等。
将动态库中的符号转换为静态库中的符号,意味着将动态库中的函数和变量等符号提取出来作为静态库中的一部分。这样,在链接可执行程序时,编译器可以直接将静态库中的符号链接到可执行程序中,而不需要使用动态链接库。