Define JNIEXPORT as visibility default with GCC?

Martin Buchholz martinrb at
Thu Feb 14 01:14:40 UTC 2013

This seems like an obvious improvement.
There are already bunches of places in the jdk sources that do things like:

#if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE)

#if defined(__GNUC__) && (__GNUC__ > 4) || (__GNUC__ == 4) &&
(__GNUC_MINOR__ > 2)
  #define JNIEXPORT     __attribute__((visibility("default")))
  #define JNIIMPORT     __attribute__((visibility("default")))
  #define JNIEXPORT
  #define JNIIMPORT

This is *crazy*.  The visibility feature has nothing to do with x86, or
JNIEXPORT should be defined to  __attribute__((visibility("default")))
#if #and #only #if:
defined(__GNUC__) && (__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ >

and that change should simply be made to the public exported jdk jni headers


On Mon, Feb 11, 2013 at 10:26 AM, Jeremy Manson <jeremymanson at>wrote:

> Hi folks,
> Pardon if this has come up before; a quick search didn't indicate
> anything, but the mailing list archives are kind of hard to search.
> I wonder if it makes sense to define JNIEXPORT as meaning __attribute__
> ((visibility ("default"))) when compiling with gcc.  Currently, anyone
> building JNI code with -fvisibility=hidden and a stock Oracle JDK is at a
> loss: their JNI exports will be hidden along with everything else.
> I notice that both IcedTea and OS X have made this change independently,
> and it has been added to Hotspot's JNIEXPORT definition (so HS can be built
> with -fvisibility=hidden), but the change isn't present in the latest JDK8
> bits:
> The workaround is pretty ugly: people who want to use -fvisibility=hidden
> have to redefine JNIEXPORT.  Upstream, it would be a pretty simple change
> to jni_md.h, along the lines of:
> #if defined(__GNUC__) && __GNUC__ >= 4
>     #define JNIEXPORT __attribute__ ((visibility ("default")))
> #else
>     #define JNIEXPORT
> #endif
> Any thoughts?
> Jeremy

More information about the core-libs-dev mailing list