RFR: 8371893: [macOS aarch64] use dead_strip linker option to reduce binary size

Chris Plummer cjplummer at openjdk.org
Wed Nov 19 18:57:14 UTC 2025


On Fri, 14 Nov 2025 11:25:05 GMT, Matthias Baesken <mbaesken at openjdk.org> wrote:

> The dead_strip linker option on macOS removes functions and data that are unreachable by the entry point or exported symbols.
> Setting it can reduce the size of some binaries we generate quite a lot, for example (product build, Xcode 15 is used) :
> (before -> after setting the option)
> 
> 1.4M -> 1.1M images/jdk/lib/libfontmanager.dylib
> 264K -> 248K images/jdk/lib/libjavajpeg.dylib
> 152K -> 132K images/jdk/lib/libjli.dylib
> 388K -> 296K images/jdk/lib/liblcms.dylib
> 164K -> 128K images/jdk/lib/libzip.dylib
> 
> 
> and libjvm :
> 
> 20M -> 18M images/jdk/lib/server/libjvm.dylib
> 146M -> 137M images/jdk/lib/server/libjvm.dylib.dSYM

This seems to work:


extern void* _ZTV8Metadata[];

__attribute__((used))
 void* foo() {
  return _ZTV8Metadata[0];
}


You can put this anywhere since it does not reference any hotspot types. It just needs to be linked in with libjvm. Note I tried putting the "used" attribute on _ZTV8Metadata and getting rid of the foo() part, but I got the following warning and the vtable was dead stripped:

`warning: 'used' attribute ignored on a non-definition declaration [-Wignored-attributes]`

-------------

PR Comment: https://git.openjdk.org/jdk/pull/28319#issuecomment-3554180419


More information about the build-dev mailing list