[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    Re: Faster startups by fixing C++ object files before linking (numbers, howto, etc.)
From:       Leon Bottou <leonb () research ! att ! com>
Date:       2001-07-29 20:54:22
[Download RAW message or body]

*** NUMBERS

These numbers were obtained using command  
   bash% LD_DEBUG=statistics DISPLAY=localhost:1:s konqueror

--------- with regular builds
26923:  runtime linker statistics:
26923:    total startup time in dynamic loader: 358288994 clock cycles
26923:              time needed for relocation: 355202059 clock cycles (99.1)
26923:                   number of relocations: 53651
26923:             time needed to load objects: 2864849 clock cycles (.7)
konqueror: cannot connect to X server localhost:1:s

--------- after rebuilding qt, kdelibs, kdecore  (2.2beta1)
26891:  runtime linker statistics:
26891:    total startup time in dynamic loader: 171268316 clock cycles
26891:              time needed for relocation: 168954584 clock cycles (98.6)
26891:                   number of relocations: 21143
26891:             time needed to load objects: 2094340 clock cycles (1.2)
konqueror: cannot connect to X server localhost:1:s


*** BINUTIL PROBLEMS

Some people ran into binutil problems
- I am using binutils-2.10.91
- It is important to compile using a libbfd.so and a libiberty.a with matching versions.
  Some distribution have chose to put these libraries in separate packages.   
  When they mismatch, you can have undefined symbols, or segfaults.

  Maybe one should do:
   % gcc -O2 -o objprelink objprelink.c /usr/lib/libbfd.a  /usr/lib/libiberty.a
  since these .a files seem to come together.

  I just tried with the libbfd.a and libiberty.a that come with the 
  current rawhide rpm (  binutils-2.11.90.0.8-5.i386.rpm ).
  That works for me.

  Attached a new version of objprelink.c
   
*** COMPILER ISSUES

I am using the famous gcc-2.96-85
This is not the "-69" version that came with RH7.
This is the "-85" version that works quite well.

Note that my code scans virtual table sections named  ".gnu.linkonce.d.__vt_*"
I just checked that this is also true with gcc 2.95.3.
Old versions of gcc do not put virtual tables in such sections.  

**** HOWTO-QT

I used QT-2.3.1
First I patch the config file  "linux-g++-shared" using the attached patch "qt-configs.patch"
Then I do  "configure -shared -system-zlib -system-jpeg" and "make src-moc sub-src"
Here are the compared relocation counts.  These are obtained with 
the "counreloc" script attached.

-------- before
  16915 R_386_32
   2690 R_386_GLOB_DAT
   5040 R_386_JUMP_SLOT
   4926 R_386_RELATIVE
-------- after
   4563 R_386_32
   2690 R_386_GLOB_DAT
   5039 R_386_JUMP_SLOT
  21669 R_386_RELATIVE

Here is what I obtain with flag -v on a particular file in QT
  
% objprelink -v widgets/qscrollview.o | c++filt
processing file widgets/qscrollview.o
 scanning section "QPtrDict<QSVChildRec> virtual table"
 scanning section "QList<QSVChildRec> virtual table"
 scanning section "QClipperWidget virtual table"
 scanning section "QClipperWidget::QPaintDevice virtual table"
 scanning section "QPaintEvent virtual table"
 scanning section "QWheelEvent virtual table"
 scanning section "QMouseEvent virtual table"
 found 126 symbols in need for a stub
 defining stub sections
 copying section data from widgets/qscrollview.o
  patching relocs for QPtrDict<QSVChildRec> virtual table
  patching relocs for QList<QSVChildRec> virtual table
  patching relocs for QClipperWidget virtual table
  patching relocs for QClipperWidget::QPaintDevice virtual table
  patching relocs for QPaintEvent virtual table
  patching relocs for QWheelEvent virtual table
  patching relocs for QMouseEvent virtual table
 finishing widgets/qscrollview.o

**** HOWTO-KDE

I recompiled kdelibs, kdebase, kdenetwork using the following procedure:

1) compile everything as usual
2) fix all object files
        find . -name '*.o' -exec objprelink {} \;
3) touch all LO files in order to cause the rebuilding of all libraries (.LA,.A,.SO)
        find . -name '*.lo' -exec touch {} \;
4) rebuild libraries
       make

The attached KDELIBS file shows the differences 
in number of relocation records for all the kdelibs libraries, one by one.




["countreloc" (application/x-shellscript)]

#!/bin/sh

objdump --dynamic-reloc "$@" \
  | cut -c10-24 | tail +6 | grep -v '^ *$' | sort \
  | uniq -c 


["qt-configs.patch" (text/x-diff)]

--- configs/linux-g++-shared.orig	Fri Jul 27 19:44:50 2001
+++ configs/linux-g++-shared	Fri Jul 27 19:48:59 2001
@@ -32,7 +32,7 @@
 SYSCONF_LIBS_YACC	= 
 
 # Linking applications
-SYSCONF_LINK		= g++
+SYSCONF_LINK		= objprelink $(OBJECTS) $(OBJMOC) && g++
 SYSCONF_LFLAGS		= 
 SYSCONF_LIBS		= 
 
@@ -58,7 +58,8 @@
 #
 SYSCONF_LINK_SHLIB	= g++
 SYSCONF_LINK_TARGET_SHARED	= lib$(TARGET).so.$(VER_MAJ).$(VER_MIN).$(VER_PATCH)
-SYSCONF_LINK_LIB_SHARED	=  $(SYSCONF_LINK_SHLIB) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
+SYSCONF_LINK_LIB_SHARED	=  objprelink $(OBJECTS) $(OBJMOC) && \
+			      $(SYSCONF_LINK_SHLIB) -shared -Wl,-soname,lib$(TARGET).so.$(VER_MAJ) \
 				     $(LFLAGS) -o $(SYSCONF_LINK_TARGET_SHARED) \
 				     $(OBJECTS) $(OBJMOC) $(LIBS) && \
 				 mv $(SYSCONF_LINK_TARGET_SHARED) $(DESTDIR); \

["KDELIBS" (text/x-diff)]

--- /usr/lib/basicstyle.so
      5	R_386_32       	      5	R_386_32       
     10	R_386_GLOB_DAT 	     10	R_386_GLOB_DAT 
     16	R_386_JUMP_SLOT	     16	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      8	R_386_RELATIVE 
--- /usr/lib/dcopserver.so
    136	R_386_32       	     82	R_386_32       
     63	R_386_GLOB_DAT 	     63	R_386_GLOB_DAT 
    206	R_386_JUMP_SLOT	    206	R_386_JUMP_SLOT
      4	R_386_RELATIVE 	    137	R_386_RELATIVE 
--- /usr/lib/hcstyle.so
    135	R_386_32       	    115	R_386_32       
     37	R_386_GLOB_DAT 	     37	R_386_GLOB_DAT 
    172	R_386_JUMP_SLOT	    172	R_386_JUMP_SLOT
      6	R_386_RELATIVE 	    139	R_386_RELATIVE 
--- /usr/lib/kbuildsycoca.so
    167	R_386_32       	    137	R_386_32       
     68	R_386_GLOB_DAT 	     68	R_386_GLOB_DAT 
    209	R_386_JUMP_SLOT	    209	R_386_JUMP_SLOT
     12	R_386_RELATIVE 	    178	R_386_RELATIVE 
--- /usr/lib/kconf_update.so
      5	R_386_32       	      5	R_386_32       
     11	R_386_GLOB_DAT 	     11	R_386_GLOB_DAT 
     92	R_386_JUMP_SLOT	     92	R_386_JUMP_SLOT
      5	R_386_RELATIVE 	     10	R_386_RELATIVE 
--- /usr/lib/kcookiejar.so
    326	R_386_32       	    212	R_386_32       
     59	R_386_GLOB_DAT 	     59	R_386_GLOB_DAT 
    290	R_386_JUMP_SLOT	    290	R_386_JUMP_SLOT
     63	R_386_RELATIVE 	    386	R_386_RELATIVE 
--- /usr/lib/kde2/kbzip2filter.so
     46	R_386_32       	     36	R_386_32       
     13	R_386_GLOB_DAT 	     13	R_386_GLOB_DAT 
     27	R_386_JUMP_SLOT	     27	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     49	R_386_RELATIVE 
--- /usr/lib/kde2/kgzipfilter.so
     46	R_386_32       	     36	R_386_32       
     13	R_386_GLOB_DAT 	     13	R_386_GLOB_DAT 
     35	R_386_JUMP_SLOT	     35	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     49	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_eps.so
      5	R_386_32       	      5	R_386_32       
     10	R_386_GLOB_DAT 	     10	R_386_GLOB_DAT 
     60	R_386_JUMP_SLOT	     60	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      8	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_g3.so
      5	R_386_32       	      5	R_386_32       
      9	R_386_GLOB_DAT 	      9	R_386_GLOB_DAT 
     22	R_386_JUMP_SLOT	     22	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      8	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_ico.so
     14	R_386_32       	     14	R_386_32       
     10	R_386_GLOB_DAT 	     10	R_386_GLOB_DAT 
     55	R_386_JUMP_SLOT	     55	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     16	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_krl.so
      4	R_386_GLOB_DAT 	      4	R_386_GLOB_DAT 
      9	R_386_JUMP_SLOT	      9	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      3	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_tiff.so
      5	R_386_32       	      5	R_386_32       
      9	R_386_GLOB_DAT 	      9	R_386_GLOB_DAT 
     21	R_386_JUMP_SLOT	     21	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      8	R_386_RELATIVE 
--- /usr/lib/kde2/kimg_xview.so
      4	R_386_GLOB_DAT 	      4	R_386_GLOB_DAT 
     16	R_386_JUMP_SLOT	     16	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      3	R_386_RELATIVE 
--- /usr/lib/kde2/kio_file.so
     75	R_386_32       	     68	R_386_32       
     42	R_386_GLOB_DAT 	     42	R_386_GLOB_DAT 
    153	R_386_JUMP_SLOT	    153	R_386_JUMP_SLOT
      6	R_386_RELATIVE 	     79	R_386_RELATIVE 
--- /usr/lib/kde2/kio_ftp.so
     32	R_386_32       	     29	R_386_32       
     18	R_386_GLOB_DAT 	     18	R_386_GLOB_DAT 
    192	R_386_JUMP_SLOT	    192	R_386_JUMP_SLOT
     15	R_386_RELATIVE 	     47	R_386_RELATIVE 
--- /usr/lib/kde2/kio_help.so
    124	R_386_32       	     82	R_386_32       
     35	R_386_GLOB_DAT 	     35	R_386_GLOB_DAT 
    184	R_386_JUMP_SLOT	    184	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	    127	R_386_RELATIVE 
--- /usr/lib/kde2/kio_http.so
     50	R_386_32       	     45	R_386_32       
     24	R_386_GLOB_DAT 	     24	R_386_GLOB_DAT 
    271	R_386_JUMP_SLOT	    271	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     53	R_386_RELATIVE 
--- /usr/lib/kde2/kjs_html.so
   2012	R_386_32       	    622	R_386_32       
    441	R_386_GLOB_DAT 	    441	R_386_GLOB_DAT 
   1488	R_386_JUMP_SLOT	   1488	R_386_JUMP_SLOT
  21896	R_386_RELATIVE 	  23884	R_386_RELATIVE 
--- /usr/lib/kde2/libkded_kdeprintd.so
     72	R_386_32       	     57	R_386_32       
     35	R_386_GLOB_DAT 	     35	R_386_GLOB_DAT 
     99	R_386_JUMP_SLOT	     99	R_386_JUMP_SLOT
     10	R_386_RELATIVE 	     81	R_386_RELATIVE 
--- /usr/lib/kde2/libkdeprint_cups.so
   1334	R_386_32       	    273	R_386_32       
     90	R_386_GLOB_DAT 	     90	R_386_GLOB_DAT 
    340	R_386_JUMP_SLOT	    340	R_386_JUMP_SLOT
      6	R_386_RELATIVE 	   1329	R_386_RELATIVE 
--- /usr/lib/kde2/libkdeprint_ext.so
     89	R_386_32       	     56	R_386_32       
     17	R_386_GLOB_DAT 	     17	R_386_GLOB_DAT 
     37	R_386_JUMP_SLOT	     37	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     92	R_386_RELATIVE 
--- /usr/lib/kde2/libkdeprint_lpd.so
    151	R_386_32       	     97	R_386_32       
     41	R_386_GLOB_DAT 	     41	R_386_GLOB_DAT 
    180	R_386_JUMP_SLOT	    180	R_386_JUMP_SLOT
     23	R_386_RELATIVE 	    174	R_386_RELATIVE 
--- /usr/lib/kde2/libkdeprint_lpdunix.so
     75	R_386_32       	     55	R_386_32       
     20	R_386_GLOB_DAT 	     20	R_386_GLOB_DAT 
     98	R_386_JUMP_SLOT	     98	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     78	R_386_RELATIVE 
--- /usr/lib/kde2/libkdeprint_rlpr.so
    645	R_386_32       	    229	R_386_32       
     54	R_386_GLOB_DAT 	     54	R_386_GLOB_DAT 
    172	R_386_JUMP_SLOT	    172	R_386_JUMP_SLOT
      6	R_386_RELATIVE 	    646	R_386_RELATIVE 
--- /usr/lib/kde2/libkpac.so
     85	R_386_32       	     65	R_386_32       
     42	R_386_GLOB_DAT 	     42	R_386_GLOB_DAT 
    156	R_386_JUMP_SLOT	    156	R_386_JUMP_SLOT
     24	R_386_RELATIVE 	    109	R_386_RELATIVE 
--- /usr/lib/kded.so
    221	R_386_32       	    149	R_386_32       
     85	R_386_GLOB_DAT 	     85	R_386_GLOB_DAT 
    242	R_386_JUMP_SLOT	    242	R_386_JUMP_SLOT
     11	R_386_RELATIVE 	    225	R_386_RELATIVE 
--- /usr/lib/kio_http_cache_cleaner.so
     23	R_386_32       	     17	R_386_32       
     20	R_386_GLOB_DAT 	     20	R_386_GLOB_DAT 
     82	R_386_JUMP_SLOT	     82	R_386_JUMP_SLOT
      8	R_386_RELATIVE 	     31	R_386_RELATIVE 
--- /usr/lib/kio_uiserver.so
    628	R_386_32       	    355	R_386_32       
     81	R_386_GLOB_DAT 	     81	R_386_GLOB_DAT 
    298	R_386_JUMP_SLOT	    298	R_386_JUMP_SLOT
     88	R_386_RELATIVE 	    708	R_386_RELATIVE 
--- /usr/lib/klauncher.so
     95	R_386_32       	     65	R_386_32       
     44	R_386_GLOB_DAT 	     44	R_386_GLOB_DAT 
    234	R_386_JUMP_SLOT	    234	R_386_JUMP_SLOT
      7	R_386_RELATIVE 	    101	R_386_RELATIVE 
--- /usr/lib/klegacystyle.so
    144	R_386_32       	    128	R_386_32       
     40	R_386_GLOB_DAT 	     40	R_386_GLOB_DAT 
    291	R_386_JUMP_SLOT	    291	R_386_JUMP_SLOT
      6	R_386_RELATIVE 	    149	R_386_RELATIVE 
--- /usr/lib/kstepstyle.so
     98	R_386_32       	     96	R_386_32       
     23	R_386_GLOB_DAT 	     23	R_386_GLOB_DAT 
     88	R_386_JUMP_SLOT	     88	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	    100	R_386_RELATIVE 
--- /usr/lib/libDCOP.so
    119	R_386_32       	     95	R_386_32       
     74	R_386_GLOB_DAT 	     74	R_386_GLOB_DAT 
    310	R_386_JUMP_SLOT	    310	R_386_JUMP_SLOT
     45	R_386_RELATIVE 	    154	R_386_RELATIVE 
--- /usr/lib/libkab.so
    378	R_386_32       	    194	R_386_32       
     68	R_386_GLOB_DAT 	     68	R_386_GLOB_DAT 
    312	R_386_JUMP_SLOT	    312	R_386_JUMP_SLOT
     38	R_386_RELATIVE 	    413	R_386_RELATIVE 
--- /usr/lib/libkdecore.so
   1973	R_386_32       	    876	R_386_32       
    530	R_386_GLOB_DAT 	    530	R_386_GLOB_DAT 
   1916	R_386_JUMP_SLOT	   1916	R_386_JUMP_SLOT
    853	R_386_RELATIVE 	   2804	R_386_RELATIVE 
--- /usr/lib/libkdefakes.so
      4	R_386_GLOB_DAT 	      4	R_386_GLOB_DAT 
      7	R_386_JUMP_SLOT	      7	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	      3	R_386_RELATIVE 
--- /usr/lib/libkdeprint.so
   2623	R_386_32       	    757	R_386_32       
    292	R_386_GLOB_DAT 	    292	R_386_GLOB_DAT 
    664	R_386_JUMP_SLOT	    664	R_386_JUMP_SLOT
    104	R_386_RELATIVE 	   2703	R_386_RELATIVE 
--- /usr/lib/libkdeprint_management.so
   5341	R_386_32       	    971	R_386_32       
    392	R_386_GLOB_DAT 	    392	R_386_GLOB_DAT 
    689	R_386_JUMP_SLOT	    689	R_386_JUMP_SLOT
     31	R_386_RELATIVE 	   5317	R_386_RELATIVE 
--- /usr/lib/libkdesu.so
     33	R_386_32       	     26	R_386_32       
     26	R_386_GLOB_DAT 	     26	R_386_GLOB_DAT 
    155	R_386_JUMP_SLOT	    155	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     36	R_386_RELATIVE 
--- /usr/lib/libkdeui.so
  15962	R_386_32       	   2647	R_386_32       
   1576	R_386_GLOB_DAT 	   1576	R_386_GLOB_DAT 
   2786	R_386_JUMP_SLOT	   2786	R_386_JUMP_SLOT
    656	R_386_RELATIVE 	  16486	R_386_RELATIVE 
--- /usr/lib/libkfile.so
   3341	R_386_32       	    909	R_386_32       
    495	R_386_GLOB_DAT 	    495	R_386_GLOB_DAT 
    987	R_386_JUMP_SLOT	    987	R_386_JUMP_SLOT
     38	R_386_RELATIVE 	   3352	R_386_RELATIVE 
--- /usr/lib/libkhtml.so
  12094	R_386_32       	   2569	R_386_32       
   1160	R_386_GLOB_DAT 	   1160	R_386_GLOB_DAT 
   2227	R_386_JUMP_SLOT	   2227	R_386_JUMP_SLOT
   5948	R_386_RELATIVE 	  17988	R_386_RELATIVE 
--- /usr/lib/libkhtmlimage.so
     91	R_386_32       	     70	R_386_32       
     38	R_386_GLOB_DAT 	     38	R_386_GLOB_DAT 
     93	R_386_JUMP_SLOT	     93	R_386_JUMP_SLOT
      8	R_386_RELATIVE 	     98	R_386_RELATIVE 
--- /usr/lib/libkio.so
   1152	R_386_32       	    526	R_386_32       
    321	R_386_GLOB_DAT 	    321	R_386_GLOB_DAT 
    931	R_386_JUMP_SLOT	    931	R_386_JUMP_SLOT
    110	R_386_RELATIVE 	   1252	R_386_RELATIVE 
--- /usr/lib/libkjava.so
    310	R_386_32       	    161	R_386_32       
     61	R_386_GLOB_DAT 	     61	R_386_GLOB_DAT 
    228	R_386_JUMP_SLOT	    228	R_386_JUMP_SLOT
     12	R_386_RELATIVE 	    320	R_386_RELATIVE 
--- /usr/lib/libkjs.so
   1094	R_386_32       	    473	R_386_32       
    325	R_386_GLOB_DAT 	    325	R_386_GLOB_DAT 
    288	R_386_JUMP_SLOT	    288	R_386_JUMP_SLOT
    157	R_386_RELATIVE 	   1248	R_386_RELATIVE 
--- /usr/lib/libkparts.so
    710	R_386_32       	    358	R_386_32       
    181	R_386_GLOB_DAT 	    181	R_386_GLOB_DAT 
    292	R_386_JUMP_SLOT	    292	R_386_JUMP_SLOT
     21	R_386_RELATIVE 	    720	R_386_RELATIVE 
--- /usr/lib/libkscreensaver.so
    236	R_386_32       	    131	R_386_32       
     34	R_386_GLOB_DAT 	     34	R_386_GLOB_DAT 
     83	R_386_JUMP_SLOT	     83	R_386_JUMP_SLOT
     16	R_386_RELATIVE 	    246	R_386_RELATIVE 
--- /usr/lib/libkspell.so
    256	R_386_32       	    163	R_386_32       
     86	R_386_GLOB_DAT 	     86	R_386_GLOB_DAT 
    220	R_386_JUMP_SLOT	    220	R_386_JUMP_SLOT
      8	R_386_RELATIVE 	    262	R_386_RELATIVE 
--- /usr/lib/libkssl.so
    410	R_386_32       	    215	R_386_32       
     47	R_386_GLOB_DAT 	     47	R_386_GLOB_DAT 
    317	R_386_JUMP_SLOT	    317	R_386_JUMP_SLOT
      7	R_386_RELATIVE 	    414	R_386_RELATIVE 
--- /usr/lib/libksycoca.so
    948	R_386_32       	    544	R_386_32       
    270	R_386_GLOB_DAT 	    270	R_386_GLOB_DAT 
    848	R_386_JUMP_SLOT	    848	R_386_JUMP_SLOT
     30	R_386_RELATIVE 	    974	R_386_RELATIVE 
--- /usr/lib/libktexteditor.so
    208	R_386_32       	    168	R_386_32       
     29	R_386_GLOB_DAT 	     29	R_386_GLOB_DAT 
     45	R_386_JUMP_SLOT	     45	R_386_JUMP_SLOT
      7	R_386_RELATIVE 	    212	R_386_RELATIVE 
--- /usr/lib/webstyle.so
     89	R_386_32       	     87	R_386_32       
     21	R_386_GLOB_DAT 	     21	R_386_GLOB_DAT 
     82	R_386_JUMP_SLOT	     82	R_386_JUMP_SLOT
      3	R_386_RELATIVE 	     92	R_386_RELATIVE 

["objprelink.c.gz" (application/x-gzip)]
>> Visit http://master.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic