在LINUX中,库/可执行文件的大小很大 我们有一个用C++创建的32位GUI应用程序。我们将应用程序从Solaris移植到Linux。我们面临的问题是

在LINUX中,库/可执行文件的大小很大 我们有一个用C++创建的32位GUI应用程序。我们将应用程序从Solaris移植到Linux。我们面临的问题是,c++,c,linux,C++,C,Linux,与Solaris相比,LINUX中的库和可执行文件的大小非常大 Red Hat Enterprise Linux 5.4是我们使用的Linux版本 请查找已创建的示例动态库。我们想知道LINUX的以下行为是否正常 假设我们创建了两个文件test1.cc和test2.cc。两者都有一行代码 a-2720@N530 /data1/users/a-2720/samp :ls -lrt test1.cc test2.cc -rw-rw-r-- 1 a-2720 mcs 2

与Solaris相比,LINUX中的库和可执行文件的大小非常大

Red Hat Enterprise Linux 5.4是我们使用的Linux版本

请查找已创建的示例动态库。我们想知道LINUX的以下行为是否正常

假设我们创建了两个文件test1.cc和test2.cc。两者都有一行代码

a-2720@N530 /data1/users/a-2720/samp :ls  -lrt test1.cc test2.cc

-rw-rw-r--   1 a-2720   mcs           21 May 18 06:16 test1.cc

-rw-rw-r--   1 a-2720   mcs           21 May 18 06:16 test2.cc


a-2720@N530 /data1/users/a-2720/samp :cat test1.cc

    #include<iostream.h>


a-2720@N530 /data1/users/a-2720/samp :cat test2.cc

    #include<iostream.h>
LINUX 在这里,我们可以看到Linux共享库的大小比以前的solaris要大得多。请注意,源文件

因为这些库是相同的。 我们的应用程序使用了数千个具有这些头文件的文件,因此在大小上存在显著差异

我们想知道这种大小差异是LINUX的正常行为

系统详细信息
-g
选项将添加到可执行文件,这将增加其大小。另外,打开.p>
-g
选项将添加到可执行文件,这将增加其大小。同时打开。

您可以使用nm查看库中的代码。

您可以使用nm查看库中的代码

  • 不要使用调试符号生成(-g选项用于gcc)
  • 从库中删除符号
  • 完成步骤1和2后,进行比较

  • 不要使用调试符号生成(-g选项用于gcc)
  • 从库中删除符号

  • 执行步骤1和步骤2后,进行比较。

    比较这两个库之间的
    libc
    (或您的系统的一些其他公共库)的大小。可能会给你一些线索。Linux和Solaris不是首字母缩写。
    iostream
    是一个大型复杂的库,有很多实现和编译选项的折衷,不同的实现可能会提供影响对象大小的扩展。静态查找表和内联之类的东西会主导您的结果。为了进行更有意义的比较,请在剥离应用程序后,将整个应用程序与典型的部署优化级别一起使用(调试格式在质量和详细程度上有所不同),并在实际操作期间将重点放在常驻集上,而不是磁盘对象大小或虚拟大小上您在每个应用程序上使用的编译器是什么?OS/CPU组合(Intel和/或Sparc)?为什么40KB的库文件会出现问题?您确定您编译它时没有调试符号,并且启用了优化功能吗?在任何情况下,40KB都是非常小的。请比较这两个库的大小
    libc
    (或系统中的其他库)。可能会给你一些线索。Linux和Solaris不是首字母缩写。
    iostream
    是一个大型复杂的库,有很多实现和编译选项的折衷,不同的实现可能会提供影响对象大小的扩展。静态查找表和内联之类的东西会主导您的结果。为了进行更有意义的比较,请在剥离应用程序后,将整个应用程序与典型的部署优化级别一起使用(调试格式在质量和详细程度上有所不同),并在实际操作期间将重点放在常驻集上,而不是磁盘对象大小或虚拟大小上您在每个应用程序上使用的编译器是什么?OS/CPU组合(Intel和/或Sparc)?为什么40KB的库文件会出现问题?您确定您编译它时没有调试符号,并且启用了优化功能吗?无论如何,40KB真的很小。
    CC -c  -library=iostream  -g -mt test1.cc
    
    CC -c  -library=iostream  -g -mt test2.cc
    
    CC -G -h libtestsolaris.so test1.o test2.o -o libtestsolaris.so -library=iostream 
    
    a-2720@N530 /data1/users/a-2720/samp :ls  -lrt test1.o test2.o libtestsolaris.so
    
    -rw-rw-r--   1 a-2720   mcs        20944 May 18 06:16 test1.o
    
    -rw-rw-r--   1 a-2720   mcs        20944 May 18 06:16 test2.o
    
    -rwxrwxr-x   1 a-2720   mcs         7384 May 18 06:16 libtestsolaris.so
    
    CC -m32 -c  -library=iostream  -g -mt test1.cc
    
    CC -m32 -c  -library=iostream  -g -mt test2.cc
    
    CC -m32 -G -h libtestlinux.so test1.o test2.o -o libtestlinux.so -library=iostream 
    
    /data1/users/adarsh/samp :ls  -lrt test1.o test2.o libtestlinux.so
    
    -rw-r--r-- 1 adarsh ifo 20220 May 18 06:44 test1.o
    
    -rw-r--r-- 1 adarsh ifo 20220 May 18 06:44 test2.o
    
    -rwxr-xr-x 1 adarsh ifo 41680 May 18 06:44 libtestlinux.so
    
    /data1/users/adarsh/samp :cat /etc/*-release
    Red Hat Enterprise Linux Server release 5.4 (Tikanga)
    
    /data1/users/adarsh/samp :uname -a
    Linux N280 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux