Hi Alexey, Magnus,

Thanks for all of your comments on the possible options.

Another option would be to use def files which contain an EXPORTS section
that lists the exported functions (
https://docs.microsoft.com/en-gb/cpp/build/reference/exports?view=vs-2017).
These files can lie next to the native source files and will require a
/DEF:<file-name> option passed to LDFLAGS_windows. Very similar to Option 1
as Alexey suggested, but could be handy especially on other occurrences of
exported functions with JNICALL modifier.

I still believe Option 1 or the one I mentioned above will be a more
conservative approach to fix this issue but I'm a newcomer so I'll be happy
to take the option as suggested.

Regards,

Ali

On Tue, Nov 20, 2018 at 3:49 PM Alexey Ivanov <alexey.iva...@oracle.com>
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
> so it partially reverts the changes from
> 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
>
> 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/build/reference/exports?view=vs-2017
>
> The third options still needs to be tested to make sure it does not break
> other platforms builds.
>
>
> 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> <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> 
> <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> 
> <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, 
> seehttps://bugs.openjdk.java.net/browse/JDK-8201226http://mail.openjdk.java.net/pipermail/build-dev/2018-April/021553.html
> https://bugs.openjdk.java.net/browse/JDK-8202476http://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, \
>
>
>
>

Reply via email to