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> # 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> 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 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). >> 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. >> >> Any thoughts? >> >> Regards, >> >> Ali >> >>> On 15 Nov 2018, at 22:14, Alexey Ivanov <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 >>> http://mail.openjdk.java.net/pipermail/build-dev/2018-April/021553.html >>> >>> https://bugs.openjdk.java.net/browse/JDK-8202476 >>> 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) 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. >>>> >>>> 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, \ >