blob: 3d8e23755ab143a3413e3d017d6e60ae68447194 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<head>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-1">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="StarOffice/5.2 (Solaris Sparc)">
<META NAME="AUTHOR" CONTENT="Jens-Heiner Rechtien">
<META NAME="CREATED" CONTENT="20010528;19140800">
<META NAME="CHANGEDBY" CONTENT="Jens-Heiner Rechtien">
<META NAME="CHANGED" CONTENT="20010529;13214800">
</head>
<body>
<H1>Excessive shared libraries file sizes</H1>
<P>Recent versions of OpenOffice/StarOffice exhibit an disturbing
increase in shared library file size. This is especially true for the
Unix platforms, topped by whopping 73% increase from SRC569 to SRC624
on Linux.</P>
<H2>Reasons</H2>
<P>The biggest increase in code size especially on GCC based
platforms is probably due to the increased use of exceptions. Since
abandoning exceptions is out of question we can't do much about this
currently. It's interesting to note that the use of exception
specifications which should in principle help reducing the costs of
exception handling has a pretty averse effect on GCC platforms.
Exception specifications increase the code size of callees by a
significant amount (up to 300 bytes for GCC/Linux/X86 per method!),
without having a noticeable effect on the code size of the caller.
Even the empty exception specification throw() applied to a leave
(non calling) function incurs this cost. This is clearly a very
pronounced deficiency of GCC.</P>
<H2>Solutions</H2>
<OL>
<LI><P>Remove all exception specifications, especially on all inline
functions. This seems to be the only possible way to reduce the code
size of gcc-2.95.2 build libraries significantly. <BR><BR>Some
preliminary evaluation of gcc-3.0 indicates that the gcc developers
noticed this problem. Gcc-3.0 offers a switch which allows the
compiler to not to enforce the exception specifications.
Additionally the compiler is much more able in recognizing that
some functions will never throw and produces way smaller code in
this case even in the case of honored exception specifications. It
might be very worthwhile to switch to gcc-3.0 when it's ready.
Gcc-3.0 is scheduled to be available at the end of the 1Q 2001. The
downside of Gcc-3.0 will be that it's in no way binary compatible to
gcc-2.95.2</P>
<P>Update 2000/05/28: gcc-2.95.3 (bugfix release) seems to produce
more compact code in some cases. It has not yet been investigated if
this improvement is related to exception specifications. Anyway,
improvements from 0.4% up to 20% can be observed. Preliminary tests
have been done on SRC633, details can be found <A HREF="comparison.html">here</A>.</P>
<LI><P>Export minimized shared libraries could be smaller on
GCC/GNU-binutils platforms. The GNU ld has a deficiency regarding
minimizing the .dynstr section of a shared library if version map
are used to minimize the exports from the library. All it's does is
to remove the references of the &quot;localized&quot; strings from
the .dyntab, but it never deletes the strings itself from the
.dynstr section. Neither does &quot;strip&quot;. <BR><BR>The Mozilla
developers noticed this, too. They invented a small tool called
&quot;elf-gc-dynstr&quot; which removes the unused strings and than
relocates the references to the remaining stuff in the .dyntab
section. Some tests showed that this operation has no side effects
and does reduce the overall size of the *.so files by about 2.5% to
3.5%.
</P>
<TABLE WIDTH=957 BORDER=1 CELLPADDING=5 CELLSPACING=4>
<COL WIDTH=303>
<COL WIDTH=306>
<COL WIDTH=300>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=303>
<P>size of all stripped *.so in kBytes</P>
</TH>
<TH WIDTH=306>
<P>SRC569</P>
</TH>
<TH WIDTH=300>
<P>SRC624</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR>
<TD WIDTH=303 VALIGN=TOP>
<P>without elf-gc-dynstr treatment</P>
</TD>
<TD WIDTH=306 VALIGN=BOTTOM SDVAL="116898" SDNUM="1033;">
<P ALIGN=CENTER>116898</P>
</TD>
<TD WIDTH=300 VALIGN=BOTTOM SDVAL="202844" SDNUM="1033;">
<P ALIGN=CENTER>202844</P>
</TD>
</TR>
<TR>
<TD WIDTH=303 VALIGN=TOP>
<P>with elf-gc-dynstr treatment</P>
</TD>
<TD WIDTH=306 VALIGN=BOTTOM SDVAL="114409" SDNUM="1033;">
<P ALIGN=CENTER>114409</P>
</TD>
<TD WIDTH=300 VALIGN=BOTTOM SDVAL="195756" SDNUM="1033;">
<P ALIGN=CENTER>195756</P>
</TD>
</TR>
</TBODY>
</TABLE>
<P>The more export minimized shared libraries ( components! ) we
have the more will be the overall savings.<BR><BR>We use
elf-gc-dynstr on unxlngi3 since SRC625 b</P>
<LI><P>Patched GCC called &quot;FrankenGCC&quot;. Another offshot of
Mozilla, can be found <A HREF="http://www.mozilla.org/projects/footprint/frankengcc.html">here</A>.
<BR><BR>GCC tends to the create a vtable even in the case of a class
with only pure virtual methods. Another problem is that certain
inlined static constructs end up in every object file but not in the
link-once section. Thus ld fails to combine these constructs at
shared library link time.<BR><BR>I tried the patch but didn't see
any improvement in code size. The opposite was true, the file size
did even increase.<BR><BR><BR>
</P>
</OL>
<DL>
<DL>
<DD>
<TABLE WIDTH=100% BORDER=1 CELLPADDING=5 CELLSPACING=4>
<COL WIDTH=85*>
<COL WIDTH=85*>
<COL WIDTH=85*>
<THEAD>
<TR VALIGN=TOP>
<TH WIDTH=33%>
<P>SRC624 stripped libcfgmgr2.so</P>
</TH>
<TH WIDTH=33%>
<P>gcc-2.95.2</P>
</TH>
<TH WIDTH=33%>
<P>frankengcc-2.95.2</P>
</TH>
</TR>
</THEAD>
<TBODY>
<TR>
<TD WIDTH=33% VALIGN=TOP>
<P>library size in kBytes</P>
</TD>
<TD WIDTH=33% VALIGN=BOTTOM SDVAL="6084924" SDNUM="1033;">
<P ALIGN=CENTER>6084924</P>
</TD>
<TD WIDTH=33% VALIGN=BOTTOM SDVAL="6422940" SDNUM="1033;">
<P ALIGN=CENTER>6422940</P>
</TD>
</TR>
</TBODY>
</TABLE>
</DL>
</DL>
<P><BR><BR>
</P>
<P>Author: <A HREF="mailto:Jens-Heiner.Rechtien@germany.sun.com?subject=Excessive file sizes">Jens-Heiner
Rechtien</A></P>
<P>Last changed: 16.03.2001</P>
</body>
</HTML>