RFR: JDK-8244634:, LoadLibraryW failed from tools/jpackage tests after JDK-8242302
Alexander Matveev
alexander.matveev at oracle.com
Tue May 12 22:55:44 UTC 2020
Hi Alexey,
Looks good. I do not see any issues with keeping code which alters PATH.
I think it might be better to keep it, just in case.
Thanks,
Alexander
On 5/12/2020 8:42 AM, Alexey Semenyuk wrote:
> Changed the patch to try AddDllDirectory() first and alter PATH as the
> last resort. Webrev at [1]
>
> Log output:
> ---
> $ env JPACKAGE_DEBUG=true ./JTwork/scratch/output/test/test.exe
> [TRACE] applauncher.cpp:217: Entering AppLauncher::launch
> [TRACE] applauncher.cpp:100: Launcher config file path:
> "C:\Users\test\8244634\jdk-15_b22\JTwork\scratch\output\test\app\test.cfg"
> [TRACE] winlauncher.cpp:70: Entering
> `anonymous-namespace'::loadDllWithAddDllDirectory
> [TRACE] winlauncher.cpp:86:
> AddDllDirectory(C:\Users\test\8244634\jdk-15_b22\JTwork\scratch\output\test\runtime\bin):
> OK
> [TRACE] winlauncher.cpp:94:
> LoadLibraryEx(C:\Users\test\8244634\jdk-15_b22\JTwork\scratch\output\test\runtime\bin\jli.dll,
> LOAD_LIBRARY_SEARCH_DEFAULT_DIRS): 00007FFBED200000
> [TRACE] winlauncher.cpp:0: Exiting
> `anonymous-namespace'::loadDllWithAddDllDirectory (entered at
> winlauncher.cpp:70)
> [TRACE] jvmlauncher.cpp:177: JVM library:
> "C:\Users\test\8244634\jdk-15_b22\JTwork\scratch\output\test\runtime\bin\jli.dll"
> hello: Environment supports a display
> jpackage test application
> args.length: 0
> -Dparam1=Some Param 1
> -Dparam2=Some "Param" 2
> -Dparam3=Some "Param" with " 3
> hello: Output file: [appOutput.txt]
> [TRACE] applauncher.cpp:0: Exiting AppLauncher::launch (entered at
> applauncher.cpp:217)
> ---
>
> AddDllDirectory/LoadLibraryEx works. However not with
> LOAD_LIBRARY_SEARCH_USER_DIRS flag, but with wider
> LOAD_LIBRARY_SEARCH_DEFAULT_DIRS.
> Should we keep the code that would alter PATH in case
> AddDllDirectory() doesn't work?
>
> [1] http://cr.openjdk.java.net/~asemenyuk/8244634/webrev.01
>
> - Alexey
>
> On 5/12/2020 10:33 AM, Alexey Semenyuk wrote:
>> > Is the problem that by removing the copy of the microsoft dlls from
>> the applications bin directory, then on machines that do not have all
>> of these dll's already in the PATH (usually in C:\windows\system32)
>> they can no longer be found ?
>> Yes.
>>
>> > Is there a way you can link the launcher (e.g., something similar
>> to RPATH on Unix systems) to look in the right place relative to the
>> launcher?
>> The problem with failure to load jli.dll from the app launcher is
>> that the system fails to load dependent dlls for jli.dll (MSVC
>> run-time libs) from the directory with jli.dll even though the full
>> path to jli.dll is specified in LoadLibrary() call. Launcher itself
>> is statically linked with MSVC run-time libs. It it not an issue.
>>
>> > Did you try to load jli.dll by specifying full path to jli.dll when
>> calling LoadLibary?
>> Yes. Launcher loads jli.dll with the full path specified. The problem
>> why LoadLibrary() fails to load it from the full path is that
>> depending on OS/DLL loading settings LoadLibrary() would or would NOT
>> look for dependent dlls in the directory where jli.dll is located.
>> The tricky part about AddDllDirectory() is that it would work for
>> LoadLibraryEx() with LOAD_LIBRARY_SEARCH_USER_DIRS only. Is this how
>> Windows implicitly loads MSVC run-time libs before it completes
>> explicit request to load jli.dll from the app launcher? I don't know.
>>
>> PATH env variable will be altered only in case the first attempt to
>> load jli.dll fails. Value of PATH can be restored after jli.dll is
>> loaded. This piece of code can be added to the patch. I'll also give
>> another try to AddDllDirectory() with LoadLibraryEx() call.
>>
>> - Alexey
>>
>> On 5/12/2020 8:31 AM, Kevin Rushforth wrote:
>>> Is there a way you can link the launcher (e.g., something similar to
>>> RPATH on Unix systems) to look in the right place relative to the
>>> launcher? Otherwise, the solution with adding to the PATH seems OK
>>> to me.
>>>
>>> -- Kevin
>>>
>>>
>>> On 5/12/2020 5:22 AM, Andy Herrick wrote:
>>>> Is the problem that by removing the copy of the microsoft dlls from
>>>> the applications bin directory, then on machines that do not have
>>>> all of these dll's already in the PATH (usually in
>>>> C:\windows\system32) they can no longer be found ?
>>>>
>>>> I don't like manually manipulating the PATH env variable either,
>>>> but if so I don't see what else can be done short of putting the
>>>> app exe in the bin dir of the runtime.
>>>>
>>>> /Andy
>>>>
>>>>
>>>> On 5/11/2020 9:37 PM, Alexander Matveev wrote:
>>>>> Hi Alexey,
>>>>>
>>>>> Updating PATH does not look like good solution to me. Did you try
>>>>> to load jli.dll by specifying full path to jli.dll when calling
>>>>> LoadLibary? If it does not work, then for AddDllDirectory() did
>>>>> you used LoadLibrary() or LoadLibraryEx() with
>>>>> LOAD_LIBRARY_SEARCH_USER_DIRS? According to doc you need to use
>>>>> LoadLibraryEx() with flag when using AddDllDirectory().
>>>>>
>>>>> Thanks,
>>>>> Alexander
>>>>>
>>>>> On 5/11/2020 4:36 PM, Alexey Semenyuk wrote:
>>>>>> Please review fix [2] for jpackage bug [1].
>>>>>>
>>>>>> Fix failure to load jli.dll from app launcher. The fix is to
>>>>>> append path to directory with jli.dll to PATH env variable and
>>>>>> load jli.dll with altered value of PATH if the first attempt to
>>>>>> load jli.dll without altering PATH fails.
>>>>>>
>>>>>> - Alexey
>>>>>>
>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8244634
>>>>>>
>>>>>> [2] http://cr.openjdk.java.net/~asemenyuk/8244634/webrev.00
>>>>>>
>>>>>
>>>
>>
>
More information about the core-libs-dev
mailing list