Linux 动态函式库解析(二)动态连结 VS 静态联结 在 Linux 中,执行档我们可以编程成静态联结以及动态连结,以下我们举一个简短的程序作为例子:
若我们执行 :
所产生出来的执行档 test,预设为使用动态函式库,所以我们可以用以下的指令 :
来得知目前该执行档共用了哪些动态函式库,以我们所举的 test 执行档来说,共用了两个动态函式库,分别为 libc.so.6 与 ld-linux.so.2。我们还可以透过下面的 file 指令,来得知该执行档的相关属性,如下
not stripped 表示这个执行档还没有透过 strip 指令来把执行时用不到的符号、以及相关除错的资讯删除,举个例子来说,目前这个test 执行档大小约为 11694 bytes
经过strip後,则变为 3004 bytes
不过读者必须注意到一点,经过 strip 过的执行档,就无法透过其它的除错软件从里面取得函式在编程时所附的相关资讯,这些资讯对我们在除错软件时,可以提供不少的帮助,各位在应用上请自行注意。 相对於编程出来使用动态函式库的执行档 test,我们也可以做出静态联结的执行档 test
透过指令 ldd,我们可以确定执行档 test 并没有使用到动态函式库
再透过指令 file,可以注意到 test 目前为 statically linked,且亦尚未经过 strip
相信大夥都会好奇,使用静态联结,且又没有经过 strip 删去不必要的符号的执行档的大小会是多少,透过 ls -l来看,我们发现大小变成 932358 bytes 比起静态联结的执行档大了相当多
若再经过 strip,则档案大小变为 215364 bytes
与使用动态函式库的执行档 test 比较起来,大了约 70倍 (215364/3004)。因此,整体来说,在使用的环境中使用动态函式库并且经过 strip 处理的话,可以让整体的空间较为精简。许多执行档都会用到同一组的函式库,像 libc 中的函式是每个执行档都会使用到的,若是使用动态函式库,则可以尽量减少同样的函式库内容重复存在系统中,进而达到节省空间的目的。 笔者一年前曾写过一个可以用来删去动态函式库中不必要函式的工具,针对这个只用到了 printf 的程序来产生新的 libc.so 的话,我们可以得到一个精简过的 libc.so 大小约为 219068 bytes
与静态联结的执行档大小 215364 bytes 比较起来,若是在这个环境中使用了动态函式库的话成本约为 3004 + 219068 =222072 bytes,不过这是只有一个执行档的情况下,使用动态函式库的环境会小输给使用静态联结的环境,在一个基本的 Linux 环境中,如果大量的使用动态函式库的话,像是有 2 个以上的执行档的话,那用动态函式库的成本就大大的降低了,像如果两个执行档都只用到了 printf,那静态联结的成本为 215364 *2 =430728 bytes,而使用动态函式库的成本为3004 *2 + 219068=225076 bytes,两者相差约一倍。 上一篇:Linux 动态函式库解析(一) 下一篇:J2SE1.4的I/O新特性 更多相关文章
|
推荐文章
精彩文章
|