
Hello, I've noticed that libraries that are compiled even with -dynamic are really huge: libHScairo-0.12.0-ghc6.12.1.so - 1.4 M libHSgio-0.12.0-ghc6.12.1.so - 1.6 M libHSgtk-0.12.0-ghc6.12.1.so - 14 M (ldd confirms that these libraries are really linked dynamically with the rest of the world) just to name a few. All of them are striped with "strip -s". At this point *bindings* to C libraries are larger that the libraries themselves, which I find unacceptable. So I decided to dig a bit deeper and when examining cairo-0.12.0 I found that Types.o object file consumes 1.5 MB. So I "cleaned" up Types.hs and tried to compile it separately from the rest of the library: % ghc -c Types.hs && ls -lh | grep Types.o -rw-r--r-- 1 angel angel 69K 2010-12-14 18:24 Types.o % rm Types.o % ghc -c Types.hs -O && ls -lh | grep Types.o -rw-r--r-- 1 angel angel 1.1M 2010-12-14 18:25 Types.o So adding -O when compiling Types.hs makes the size of object file jump from 69K to 1.1M. Just think about it - the file contains *two* *enums* and nothing more. And yet it twice as large as a full-blown application like gedit. So I would like to ask you whether such behavior is known and should such this be considered as a bug? I've attached the testcase. It also can be found here: http://hpaste.org/42331/something Btw, I'm using GHC 6.12.1, x86_64. Best regards, Audrius

On 14/12/2010 16:33, Audrius Šaikūnas wrote:
Hello,
I've noticed that libraries that are compiled even with -dynamic are really huge: libHScairo-0.12.0-ghc6.12.1.so - 1.4 M libHSgio-0.12.0-ghc6.12.1.so - 1.6 M libHSgtk-0.12.0-ghc6.12.1.so - 14 M
(ldd confirms that these libraries are really linked dynamically with the rest of the world)
just to name a few. All of them are striped with "strip -s". At this point *bindings* to C libraries are larger that the libraries themselves, which I find unacceptable.
So I decided to dig a bit deeper and when examining cairo-0.12.0 I found that Types.o object file consumes 1.5 MB. So I "cleaned" up Types.hs and tried to compile it separately from the rest of the library:
% ghc -c Types.hs&& ls -lh | grep Types.o -rw-r--r-- 1 angel angel 69K 2010-12-14 18:24 Types.o % rm Types.o % ghc -c Types.hs -O&& ls -lh | grep Types.o -rw-r--r-- 1 angel angel 1.1M 2010-12-14 18:25 Types.o
So adding -O when compiling Types.hs makes the size of object file jump from 69K to 1.1M. Just think about it - the file contains *two* *enums* and nothing more. And yet it twice as large as a full-blown application like gedit.
So I would like to ask you whether such behavior is known and should such this be considered as a bug?
This particular example seems to be fixed, at least with the current HEAD: $ ghc -O -c en.hs $ ll en.o -rw-rw-r-- 1 simonmar GHC 84248 2010-12-14 16:47 en.o $ size en.o text data bss dec hex filename 23210 3680 0 26890 690a en.o But if you do find a case of code bloat, by all means file a bug and we'll look into it. Cheers, Simon

On Tuesday 14 December 2010 17:50:30, Simon Marlow wrote:
This particular example seems to be fixed, at least with the current HEAD:
Also with 7.0.1. On my 32-bit system, -O increases the Types.o size from 37K to 45K which is reasonable, while with 6.12.3 it goes from 38K to 543K.
participants (3)
-
Audrius Šaikūnas
-
Daniel Fischer
-
Simon Marlow