Hello,

gcc and ld can be instructed to work together to "garbage collect" unused input 
sections.
This feature eliminates unused code from native libraries. As a prerequisite to 
take full advantage of the feature,
the source files need to be compiled with "-ffunction-sections -fdata-sections".

Details on what happens can be found in the ld documentation: 
https://linux.die.net/man/1/ld .
See the description of --gc-sections and --print-gc-sections therein.
For more detailed insights there is a talk available from ELC2010: 
https://elinux.org/images/2/2d/ELC2010-gc-sections_Denys_Vlasenko.pdf

My change enables the unused code elimination on linux s390x .
(on the other Linux platforms, there are still issues to be solved with the 
serviceability agent, but we do not have the serviceability agent  on linux 
s390x).

The change has 2 benefits :
- native libs with unused code get smaller (some get alot smaller)
some example lib sizes  from  linuxs390x (product build) :
                    default settings  / link-time gc-sections
libmlib_image.so        556K                 536K
libjavajpeg.so              300K                 292K
libsplashscreen.so      412K                 268K
libfontmanager.so       1.4M                 864K
libjvm.so                        19M                  17M

- the flag --print-gc-sections  outputs the removed sections when calling the 
linker;
this helps a lot to find coding "waiting for" cross-platform removal.


Here is an example output of --print-gc-sections for the libnet-build (linux 
s390x) :

/bin/ld: Removing unused section '.bss.my_gconf_init_func' in file 
'/builddir/support/native/java.base/libnet/DefaultProxySelector.o'  <--- seems 
to be dead
/bin/ld: Removing unused section '.text.NET_ReadV' in file 
'/builddir/support/native/java.base/libnet/linux_close.o'                   
<--- seems to be dead, I requested cross-platform removal with 
https://bugs.openjdk.java.net/browse/JDK-8234501
/bin/ld: Removing unused section '.text.getInet6Address_scopeifname' in file 
'/builddir/support/native/java.base/libnet/net_util.o'    <--- seems to be dead
/bin/ld: Removing unused section '.text.getInet6Address_scopeid_set' in file 
'/builddir/support/native/java.base/libnet/net_util.o'    <--- seems to be dead
/bin/ld: Removing unused section '.text.getInetAddress_hostName' in file 
'/builddir/support/native/java.base/libnet/net_util.o'        <--- seems to be 
dead
/bin/ld: Removing unused section '.text.setDefaultScopeID' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'           <--- seems 
to be dead indeed
/bin/ld: Removing unused section '.text.getDefaultScopeID' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'           <--- seems 
to be dead indeed
/bin/ld: Removing unused section '.text.kernelIsV24' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'                 <--- 
seems to be dead indeed
/bin/ld: Removing unused section '.bss.ni_defaultIndexID.8722' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'       <--- only used 
in getDefaultScopeID , which is dead
/bin/ld: Removing unused section '.bss.ni_class.8721' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'                <--- 
only used in getDefaultScopeID , which is dead
/bin/ld: Removing unused section '.bss.vinit24' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'                      
<--- only used in kernelIsV24 which is dead
/bin/ld: Removing unused section '.bss.kernelV24' in file 
'/builddir/support/native/java.base/libnet/net_util_md.o'                    
<--- only used in kernelIsV24 which is dead

bug/webrev :
https://bugs.openjdk.java.net/browse/JDK-8234525

http://cr.openjdk.java.net/~mbaesken/webrevs/8234525.1/

Thanks, Matthias


Reply via email to