On 3/10/2018 6:51 AM, Kim Barrett wrote:
On Oct 1, 2018, at 7:10 PM, David Holmes <david.hol...@oracle.com> wrote:

On 2/10/2018 4:35 AM, Kim Barrett wrote:
On Oct 1, 2018, at 2:27 AM, David Holmes <david.hol...@oracle.com> wrote:

On 1/10/2018 1:21 PM, Kim Barrett wrote:
The current library may have been previously only dlopen’ed with RTLD_LAZY.  
Reopening with RTLD_NOW
forces resolution of all undefined symbols in that shared object, which appears 
to be the purpose of the
deprecated function.

The current library is libjvm and it's already opened in the appropriate way:

   libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);

and it seems to have always been opened this way. So I can't see how this can 
fix the problem the workaround purports to fix??

http://hg.openjdk.java.net/macosx-port/macosx-port/hotspot/rev/be94a5de4d32#l54.758
The current version of LoadJavaVM (for Mac) contains:
#ifndef STATIC_BUILD
     libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
#else
     libjvm = dlopen(NULL, RTLD_FIRST);
#endif
where STATIC_BUILD is controlled by the --enable-static-builds
configure option. The --enable-static-builds option was added in JDK 9
by 8136556: Add the ability to perform static builds of MacOSX x64
binaries.

Which "current version" is this? It is not what is in jdk/jdk repo, which has 
no STATIC_BUILD support in this area. ??

I think the MacOSX version of LoadJavaVM is here:
./java.base/macosx/native/libjli/java_md_macosx.m
(Note that this appears to be an Obj-C source file.)
(And no, I have no idea what build magic goes on to make this work.)
This has the STATIC_BUILD stuff.

Hmmm okay. But I can't find that file in the original mac port, or in 7u at all. In 7u we have

jdk/src/macosx/bin/java_md_macosx.c

with

libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);

and that was created in 2012 when the launcher was refactored under JDK-7124089.

The archaeology is getting too hard. :(

There are also definitions for other platforms.
./java.base/windows/native/libjli/java_md.c       // Windows
./java.base/unix/native/libjli/java_md_solinux.c  // Solaris/Linux/AIX
(Note that java_md_solinux.c is excluded for macosx by the build
system; see LIBJLI_EXCLUDE_FILES in CoreLibraries.gmk.)

Although we may have not used RTLD_NOW with static builds (does this 
discussions re symbol resolution even make sense with a static build?)

I think symbol resolution can make sense with a static build, if there
are other libraries that are not statically linked. I don't know
whether that's the case here. I'm going to try doing a static build
without this dlopen code and see what happens.

in some version of the JDK, my point is that we have been using RTLD_NOW for as 
long as the workaround has been in place.
That strongly suggests to me that use of RTLD_NOW is not a solution to the 
problem the workaround was introduced for.

I think my replacement code is equivalent to the deprecated code.  I
think the sequence of events may have been something like:

(1) dlopen java lib without RTLD_NOW
(2) run into problems that led to workaround code
(3) run into further problems that led to dlopen java lib with RTLD_NOW
     but didn't remove the now superfluous workaround (perhaps it was
     forgotten?)
(4) merge

Perhaps. No way to know.


I thought this part of the change would be straight-forward. An
alternative would be to leave the old deprecated call in place,
locally disable the deprecation warning, and file an RFE for someone
more knowledgable in this area and with Mac development to look at.

Sorry for the obstructions on this but changing the code without knowing it 
even implements the same workaround is just wrong to me. I strongly suspect the 
code is not needed at all.

I agree that for the non-STATIC_BUILD case the workaround is
superfluous. If a static build without any workaround code works then
I think the workaround code should just be removed.  Is that okay with
you?

Yes but you will need to go through a full round of testing, not just tier 1-3, before being reasonably confident the workaround is not needed. I'd hate to see this break things "in the wild" just because we don't have adequate test coverage.

Other opinions welcomed.

David


Reply via email to