Hi Alexey, I’ve searched for |GetProcAddress| usages across source code and couldn’t find (hopefully tbh) other occurrences of such mismatches.
Regards, Ali > On 7 Dec 2018, at 20:24, Alexey Ivanov <alexey.iva...@oracle.com> wrote: > > Hi Ali, > > On 06/12/2018 22:49, Ali İnce wrote: >> Hi Magnus, Alexey, >> >> I believe we won’t be able to get further opinions from serviceability-dev. > > Unfortunately, no one has replied as of now. > Have you found any issues with jdwpTransport_OnLoad after removing JNICALL? > >> Andrew Luo suggested using a similar mechanism as is used for jvm.dll by >> using symbol name files mapped by platform (files are under >> make/hotspot/symbols and interestingly windows is almost the only platform >> for which a symbol file doesn’t exist). > > Andrew says the .def files are auto-generated for Windows. There's a set of > shared functions. > JVM cannot change the calling convention, jvm.dll is the public interface to > JVM. > >> Another issue, again opened against AdoptOpenJDK 32-bit builds is somehow >> related with the same problem - but this time it is jimage.dll depending on >> zip.dll expecting the ZIP_InflateFully function to be decorated with JNICALL >> - whereas it was removed earlier from the implementation and the runtime >> image just fails with access violation just because jimage source code still >> declared it with JNICALL >> (https://github.com/AdoptOpenJDK/openjdk-build/issues/763 >> <https://github.com/AdoptOpenJDK/openjdk-build/issues/763>). > > The usage of ZIP_InflateFully from zip.dll by jimage.dll was overlooked > during work on https://bugs.openjdk.java.net/browse/JDK-8201226 > <https://bugs.openjdk.java.net/browse/JDK-8201226>. > > I can take care of it. > (I could not build 32 bit Windows. It seem to have overcome the problem by > adding --disable-warnings-as-errors option to configure.) > > However, the report says the resulting image crashes in 64 bit windows too > which shouldn't be affected by JNICALL mismatch. > >> I’ve also searched for GetProcAddress calls across the source code - and I >> think it’s important to work on the consistency of JNICALL usages across the >> whole source code. > > There are many places where libraries are loaded dynamically or a function > may be unavailable on older versions of the platform. > Have you identified any other place where functions from JDK DLLs are looked > up by names? > >> Another noteworthy thing I’ve noticed is there are still JNICALL modifiers >> for example in >> https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/master/src/jdk.crypto.cryptoki/windows/native/libj2pkcs11/j2secmod_md.c#L49 >> >> <https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/master/src/jdk.crypto.cryptoki/windows/native/libj2pkcs11/j2secmod_md.c#L49> >> - which I guess will also be reported as broken since these functions are >> again name decorated. > > This is a JNI method. It should use JNICALL modifier. If it wasn't found, the > class sun.security.pkcs11.Secmod would fail to load. I guess JVM handles name > mangling somehow for native method implementation. > > Such functions were never explicitly exported using mapfiles or /export > options on Windows, at least in the client area. For Linux and Solaris, > adding or removing a native method required editing mapfiles. > >> If we’re still determined to remove JNICALL, what about just removing >> __stdcall from JNICALL declaration at >> https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/master/src/java.base/windows/native/include/jni_md.h#L31 >> >> <https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/master/src/java.base/windows/native/include/jni_md.h#L31> >> ? Wouldn’t that be a more consistent move? > > We can't do that. > Implementation of Java native methods must use __stdcall calling convention. > >> >> Regards, >> >> Ali >> >>> On 22 Nov 2018, at 17:29, Magnus Ihse Bursie <magnus.ihse.bur...@oracle.com >>> <mailto:magnus.ihse.bur...@oracle.com>> wrote: >>> >>> I think we are in complete agreement. What's missing is some expert opinion >>> from serviceability-dev if there is any problem with changing the >>> signature. I'd preferably have that. >>> >>> If no one knows, I'd say, change it, and see if we still pass the relevant >>> tests, and if so, ship it. >>> >>> /Magnus >>> >>> 22 nov. 2018 kl. 18:04 skrev Alexey Ivanov <alexey.iva...@oracle.com >>> <mailto:alexey.iva...@oracle.com>>: >>> >>>> >>>> On 21/11/2018 12:16, Magnus Ihse Bursie wrote: >>>>> >>>>> On 2018-11-20 16:49, Alexey Ivanov wrote: >>>>> >>>>>> Hi Ali, Magnus, >>>>>> >>>>>> I absolutely agree this change has to be reviewed by someone from >>>>>> serviceability. >>>>>> >>>>>> There are several options: >>>>>> >>>>>> 1. Add -export:jdwpTransport_OnLoad to LDFLAGS for Windows >>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2018-November/023935.html >>>>>> >>>>>> <http://mail.openjdk.java.net/pipermail/build-dev/2018-November/023935.html> >>>>>> so it partially reverts the changes from >>>>>> https://bugs.openjdk.java.net/browse/JDK-8200178 >>>>>> <https://bugs.openjdk.java.net/browse/JDK-8200178> >>>>>> >>>>>> 2. Remove JNICALL (__stdcall) modifier, eventually changing the calling >>>>>> convention to __cdecl. >>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2018-November/023969.html >>>>>> >>>>>> <http://mail.openjdk.java.net/pipermail/build-dev/2018-November/023969.html> >>>>>> >>>>>> 3. Use inline /export option via #pragma: >>>>>> #pragma comment(linker, "/export:jdwpTransport_OnLoad= >>>>>> _jdwpTransport_OnLoad@16") >>>>>> as referenced in >>>>>> https://docs.microsoft.com/en-ie/cpp/cpp/dllexport-dllimport?view=vs-2017 >>>>>> >>>>>> <https://docs.microsoft.com/en-ie/cpp/cpp/dllexport-dllimport?view=vs-2017> >>>>>> https://docs.microsoft.com/en-ie/cpp/build/reference/exports?view=vs-2017 >>>>>> >>>>>> <https://docs.microsoft.com/en-ie/cpp/build/reference/exports?view=vs-2017> >>>>>> >>>>>> The third options still needs to be tested to make sure it does not >>>>>> break other platforms builds. >>>>> I'm not fond of either solution 1 or 3. I really think the signature >>>>> should be made correctly at the point of definition in the source code. >>>> >>>> That is why I proposed removing JNICALL (__stdcall) from the function >>>> declaration as we had done for libzip, libjimage [1] and mlib_image [2]. >>>> >>>> Microsoft recommends using __stdcall for DLLs, at the same time it >>>> decorates the function name making it harder to export it by its plain >>>> name. >>>> >>>> >>>> By removing JNICALL / __stdcall, we make the function use __cdecl calling >>>> convention. The difference between them is that with __stdcall the callee >>>> cleans the stack whereas with __cdecl the caller cleans the stack. >>>> >>>> It shouldn't be a problem as long as all function declarations use the >>>> same calling convention, which, I believe, is the case here. >>>> >>>>> We've spent some considerable effort of getting rid of the /export flags >>>>> for Windows (and map files for unix), and I don't want to see them creep >>>>> back in. Note that option 3 is just option 1 in disguise. The only single >>>>> good thing about it is that it allows you to put the compiler option next >>>>> to the signature declaration in the source code. >>>> >>>> At least in this case, the option will be near the function body >>>> definition. It will be easier to update it if the signature changes. >>>> >>>> If we are to use __stdcall, it seems to be the only way to export the >>>> undecorated name. >>>> >>>>> The same goes for def files, as suggested by Ali. It's just yet another >>>>> version of option 1 in disguise/map files. >>>> >>>> If option 2 is rejected, I'm for using option 3. If option 3 cannot be >>>> used too, I'm for option 1. >>>> I think we should not fall back to def files in any case. And Makefile >>>> will have to include the reference to the def file, so it's even worse >>>> than option 1. >>>> >>>> >>>> Regards, >>>> Alexey >>>> >>>> [1] https://bugs.openjdk.java.net/browse/JDK-8201226 >>>> <https://bugs.openjdk.java.net/browse/JDK-8201226> >>>> [2] https://bugs.openjdk.java.net/browse/JDK-8202476 >>>> <https://bugs.openjdk.java.net/browse/JDK-8202476> >>>>> >>>>> /Magnus >>>>> >>>>>> >>>>>> >>>>>> Regards, >>>>>> Alexey >>>>>> >>>>>> On 19/11/2018 12:19, Magnus Ihse Bursie wrote: >>>>>>> Hi Ali, >>>>>>> >>>>>>> From a build perspective this change looks OK. I'm not aware of the >>>>>>> finer details on the OnLoad mechanism, like what calling convention is >>>>>>> to be used. So maybe this is a no-go from that view. >>>>>>> >>>>>>> I'm cc:ing servicability so they can have a look at it. >>>>>>> >>>>>>> /Magnus >>>>>>> >>>>>>> On 2018-11-18 13:07, Ali İnce wrote: >>>>>>>> Hi Alexey, >>>>>>>> >>>>>>>> Below is a new patch content that removes JNICALL modifiers from the >>>>>>>> exported functions of interest. This results in exported functions not >>>>>>>> to be name decorated and use __cdecl calling convention. >>>>>>>> >>>>>>>> Do you have any more suggestions, or would you please guide me on next >>>>>>>> steps? >>>>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>> Ali >>>>>>>> >>>>>>>> # HG changeset patch >>>>>>>> # User Ali Ince <ali.i...@gmail.com> <mailto:ali.i...@gmail.com> >>>>>>>> # Date 1542542415 0 >>>>>>>> # Sun Nov 18 12:00:15 2018 +0000 >>>>>>>> # Node ID a41df44e13e1b761f4b3f05a17ed18953067ae39 >>>>>>>> # Parent 16d5ec7dbbb49ef3f969e34be870e3f917ea89ff >>>>>>>> Remove JNICALL modifiers to prevent name decoration on 32-bit windows >>>>>>>> builds >>>>>>>> >>>>>>>> diff -r 16d5ec7dbbb4 -r a41df44e13e1 >>>>>>>> src/jdk.jdi/share/native/libdt_shmem/shmemBack.c >>>>>>>> --- a/src/jdk.jdi/share/native/libdt_shmem/shmemBack.c Tue Aug 14 >>>>>>>> 14:28:23 2018 +0200 >>>>>>>> +++ b/src/jdk.jdi/share/native/libdt_shmem/shmemBack.c Sun Nov 18 >>>>>>>> 12:00:15 2018 +0000 >>>>>>>> @@ -339,7 +339,7 @@ >>>>>>>> return JDWPTRANSPORT_ERROR_NONE; >>>>>>>> } >>>>>>>> >>>>>>>> -JNIEXPORT jint JNICALL >>>>>>>> +JNIEXPORT jint >>>>>>>> jdwpTransport_OnLoad(JavaVM *vm, jdwpTransportCallback* cbTablePtr, >>>>>>>> jint version, jdwpTransportEnv** result) >>>>>>>> { >>>>>>>> diff -r 16d5ec7dbbb4 -r a41df44e13e1 >>>>>>>> src/jdk.jdwp.agent/share/native/include/jdwpTransport.h >>>>>>>> --- a/src/jdk.jdwp.agent/share/native/include/jdwpTransport.h Tue Aug >>>>>>>> 14 14:28:23 2018 +0200 >>>>>>>> +++ b/src/jdk.jdwp.agent/share/native/include/jdwpTransport.h Sun Nov >>>>>>>> 18 12:00:15 2018 +0000 >>>>>>>> @@ -140,7 +140,7 @@ >>>>>>>> void (*free)(void *buffer); /* Call this for all >>>>>>>> deallocations */ >>>>>>>> } jdwpTransportCallback; >>>>>>>> >>>>>>>> -typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm, >>>>>>>> +typedef jint (*jdwpTransport_OnLoad_t)(JavaVM *jvm, >>>>>>>> jdwpTransportCallback >>>>>>>> *callback, >>>>>>>> jint version, >>>>>>>> jdwpTransportEnv** >>>>>>>> env); >>>>>>>> diff -r 16d5ec7dbbb4 -r a41df44e13e1 >>>>>>>> src/jdk.jdwp.agent/share/native/libdt_socket/socketTransport.c >>>>>>>> --- a/src/jdk.jdwp.agent/share/native/libdt_socket/socketTransport.c >>>>>>>> Tue Aug 14 14:28:23 2018 +0200 >>>>>>>> +++ b/src/jdk.jdwp.agent/share/native/libdt_socket/socketTransport.c >>>>>>>> Sun Nov 18 12:00:15 2018 +0000 >>>>>>>> @@ -1019,7 +1019,7 @@ >>>>>>>> return JDWPTRANSPORT_ERROR_NONE; >>>>>>>> } >>>>>>>> >>>>>>>> -JNIEXPORT jint JNICALL >>>>>>>> +JNIEXPORT jint >>>>>>>> jdwpTransport_OnLoad(JavaVM *vm, jdwpTransportCallback* cbTablePtr, >>>>>>>> jint version, jdwpTransportEnv** env) >>>>>>>> { >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>>> On 16 Nov 2018, at 23:03, Alexey Ivanov <alexey.iva...@oracle.com> >>>>>>>>> <mailto:alexey.iva...@oracle.com> wrote: >>>>>>>>> >>>>>>>>> Hi Ali, >>>>>>>>> >>>>>>>>> It's exactly what I referred to. >>>>>>>>> >>>>>>>>> Yes, it does change the calling convention. >>>>>>>>> Yet it's not a (big) problem because both parties will use the same >>>>>>>>> calling convention. >>>>>>>>> >>>>>>>>> Using a DLL from another build will not be possible. But it's not a >>>>>>>>> good idea to do so anyway. >>>>>>>>> >>>>>>>>> >>>>>>>>> Mapfiles and export options have been removed by >>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8200178 >>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8200178> to simplify >>>>>>>>> managing exported functions. So that to add or remove an exported >>>>>>>>> function, you don't have modify makefiles and/or mapfiles. You just >>>>>>>>> edit the source files. >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> Alexey >>>>>>>>> >>>>>>>>> On 16/11/2018 22:42, Ali İnce wrote: >>>>>>>>>> Hi Alexey, >>>>>>>>>> >>>>>>>>>> Thanks for your reply. >>>>>>>>>> >>>>>>>>>> I will definitely give it a try though I’m not sure if that’ll be a >>>>>>>>>> breaking change. This is because JNICALL modifier is defined to be >>>>>>>>>> __stdcall on windows which is both specified on jdwpTransport_OnLoad >>>>>>>>>> exported functions both for dt_socket.dll and dt_shmem.dll. >>>>>>>>>> >>>>>>>>>> The __stdcall is ignored on x64 platforms and also name decoration >>>>>>>>>> is not applied >>>>>>>>>> (https://docs.microsoft.com/en-gb/cpp/build/reference/decorated-names?view=vs-2017 >>>>>>>>>> >>>>>>>>>> <https://docs.microsoft.com/en-gb/cpp/build/reference/decorated-names?view=vs-2017>). >>>>>>>>>> I believe that’s why we don’t experience any problems on x64 builds. >>>>>>>>>> >>>>>>>>>> Removing JNICALL (thus __stdcall) modifier (apparently only applies >>>>>>>>>> to x86 builds) will result in the calling convention to be changed, >>>>>>>>>> and thus will change how parameters are ordered and also the stack >>>>>>>>>> cleanup rules. I think this may result in problems in programs that >>>>>>>>>> are designed to load shared libraries and its exported functions at >>>>>>>>>> runtime (not bound by link time which probably won’t cause any >>>>>>>>>> issues - assuming that they use the shared function signature) - as >>>>>>>>>> in >>>>>>>>>> https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/5f01925b80ed851b133ee26fbcb07026ac04149e/src/jdk.jdwp.agent/share/native/libjdwp/transport.c#L99 >>>>>>>>>> >>>>>>>>>> <https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/5f01925b80ed851b133ee26fbcb07026ac04149e/src/jdk.jdwp.agent/share/native/libjdwp/transport.c#L99>. >>>>>>>>>> >>>>>>>>>> Any thoughts? >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> >>>>>>>>>> Ali >>>>>>>>>> >>>>>>>>>>> On 15 Nov 2018, at 22:14, Alexey Ivanov <alexey.iva...@oracle.com> >>>>>>>>>>> <mailto:alexey.iva...@oracle.com> wrote: >>>>>>>>>>> >>>>>>>>>>> Hi Ali, >>>>>>>>>>> >>>>>>>>>>> Can the issue be resolved by using different call modifiers on the >>>>>>>>>>> affected functions? >>>>>>>>>>> >>>>>>>>>>> Some build / link issues were resolved by adding / removing JNICALL >>>>>>>>>>> modifier, see >>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8201226 >>>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8201226> >>>>>>>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2018-April/021553.html >>>>>>>>>>> >>>>>>>>>>> <http://mail.openjdk.java.net/pipermail/build-dev/2018-April/021553.html> >>>>>>>>>>> >>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8202476 >>>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8202476> >>>>>>>>>>> http://mail.openjdk.java.net/pipermail/build-dev/2018-May/021913.html >>>>>>>>>>> >>>>>>>>>>> <http://mail.openjdk.java.net/pipermail/build-dev/2018-May/021913.html> >>>>>>>>>>> >>>>>>>>>>> Regards, >>>>>>>>>>> Alexey >>>>>>>>>>> >>>>>>>>>>> On 15/11/2018 21:43, Ali İnce wrote: >>>>>>>>>>>> Hi, >>>>>>>>>>>> >>>>>>>>>>>> An issue (https://github.com/AdoptOpenJDK/openjdk-build/issues/709 >>>>>>>>>>>> <https://github.com/AdoptOpenJDK/openjdk-build/issues/709>) raised >>>>>>>>>>>> against AdoptOpenJDK jdk11 32-bit windows builds led us to the >>>>>>>>>>>> name decoration problem on built 32-bit dlls - specifically >>>>>>>>>>>> dt_socket.dll and dt_shmem.dll. Whereas 64-bit MSVC builds don’t >>>>>>>>>>>> apply any name decorations on exported functions, 32-bit builds >>>>>>>>>>>> apply them - which requires either def files or /export flags to >>>>>>>>>>>> be specified on the linker arguments. >>>>>>>>>>>> >>>>>>>>>>>> Although the expected linker arguments were present on previous >>>>>>>>>>>> jdk makefiles, they were removed in jdk11 makefiles. >>>>>>>>>>>> >>>>>>>>>>>> Below is the proposed patch, which can also be browsed at >>>>>>>>>>>> https://github.com/AdoptOpenJDK/openjdk-jdk11u/pull/1 >>>>>>>>>>>> <https://github.com/AdoptOpenJDK/openjdk-jdk11u/pull/1>. >>>>>>>>>>>> >>>>>>>>>>>> Would you please have a look and let me know of any points I may >>>>>>>>>>>> have missed (I don’t have any background information about why the >>>>>>>>>>>> export flags were removed in jdk11)? >>>>>>>>>>>> >>>>>>>>>>>> Regards, >>>>>>>>>>>> >>>>>>>>>>>> Ali >>>>>>>>>>>> >>>>>>>>>>>> diff --git a/make/lib/Lib-jdk.jdi.gmk b/make/lib/Lib-jdk.jdi.gmk >>>>>>>>>>>> index 197b95c2e2..ac6ebf5591 100644 >>>>>>>>>>>> --- a/make/lib/Lib-jdk.jdi.gmk >>>>>>>>>>>> +++ b/make/lib/Lib-jdk.jdi.gmk >>>>>>>>>>>> @@ -37,6 +37,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows) >>>>>>>>>>>> jdk.jdwp.agent:include \ >>>>>>>>>>>> jdk.jdwp.agent:libjdwp/export, \ >>>>>>>>>>>> LDFLAGS := $(LDFLAGS_JDKLIB), \ >>>>>>>>>>>> + LDFLAGS_windows := -export:jdwpTransport_OnLoad, \ >>>>>>>>>>>> LIBS := $(JDKLIB_LIBS), \ >>>>>>>>>>>> )) >>>>>>>>>>>> >>>>>>>>>>>> diff --git a/make/lib/Lib-jdk.jdwp.agent.gmk >>>>>>>>>>>> b/make/lib/Lib-jdk.jdwp.agent.gmk >>>>>>>>>>>> index 0bc93e0d35..0382e55325 100644 >>>>>>>>>>>> --- a/make/lib/Lib-jdk.jdwp.agent.gmk >>>>>>>>>>>> +++ b/make/lib/Lib-jdk.jdwp.agent.gmk >>>>>>>>>>>> @@ -37,6 +37,7 @@ $(eval $(call SetupJdkLibrary, >>>>>>>>>>>> BUILD_LIBDT_SOCKET, \ >>>>>>>>>>>> libjdwp/export, \ >>>>>>>>>>>> LDFLAGS := $(LDFLAGS_JDKLIB) \ >>>>>>>>>>>> $(call SET_SHARED_LIBRARY_ORIGIN), \ >>>>>>>>>>>> + LDFLAGS_windows := -export:jdwpTransport_OnLoad, \ >>>>>>>>>>>> LIBS_linux := -lpthread, \ >>>>>>>>>>>> LIBS_solaris := -lnsl -lsocket, \ >>>>>>>>>>>> LIBS_windows := $(JDKLIB_LIBS) ws2_32.lib, \ >>>>>>> >>>>>> >>>>> >>>> >> >