LINUX 中库/可执行文件的大小很大

发布于 2024-11-08 11:49:32 字数 2059 浏览 0 评论 0原文

我们有一个使用 C++ 创建的 32 位 Gui 应用程序。我们将该应用程序从 Solaris 移植到 Linux。我们面临的问题是,

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

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

请查找创建的示例动态库。我们想知道 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>

因此,这些文件内部只有一行,

我使用这些文件创建了一个共享库。

SOLARIS

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

LINUX

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

在这里我们可以看到Linux 共享库的大小比solaris 曾经大得多。 源文件

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

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

系统详情

/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

We have a 32bit Gui application created using C++. We ported the application from Solaris to Linux. Issue we are facing is

the size of the library and executable is very large in LINUX compared to Solaris.

Red Hat Enterprise Linux 5.4 is the Linux version we using.

Please find a sample dynamic library created. We would like to know the following behavior of LINUX is normal or not.

Consider we created two files test1.cc and test2.cc. Both having a single line of code.

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>

Thus the files have only only one line inside them

I created a Shared library using these files.

SOLARIS

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

LINUX

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

Here we can see that the Linux shared library are in much bigger size than solaris once. Please note that the source file

for these libraries are same.
Our application uses thousand of files having these header files and hence a notable difference in size occurs.

We would like to know this size difference is a normal behavior of LINUX.

System Details

/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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

痴情 2024-11-15 11:49:32

你可以使用 nm 来查看库中有哪些代码。

you could play with nm to see what code is in the library.

心如狂蝶 2024-11-15 11:49:32
  1. 不要使用调试符号进行构建(gcc 的 -g 选项)
  2. 从库中删除符号

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

  1. do not build with debug symbols (-g option for gcc)
  2. strip the symbols from the library

After doing steps 1 and 2, do the comparison.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文