Skip to content

Commit 3fb5b62

Browse files
committed
Adapt Windows cglobal() search for libjulia-internal
On Windows, we have a special list of libraries that we search for default symbol resolution. Now that we have symbols defined in `libjulia` and then imported by `libjulia-internal`, we need to make certain that we search `libjulia-internal` first (so that we find non-trampoline functions first) and then `libjulia` (so that we do in fact eventually find the symbols at all). (cherry picked from commit 9489e64)
1 parent ccda066 commit 3fb5b62

File tree

7 files changed

+31
-17
lines changed

7 files changed

+31
-17
lines changed

src/ccall.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ static bool runtime_sym_gvs(jl_codegen_params_t &emission_context, const char *f
2222
GlobalVariable *libptrgv;
2323
jl_codegen_params_t::SymMapGV *symMap;
2424
#ifdef _OS_WINDOWS_
25-
if ((intptr_t)f_lib == 1) {
25+
if ((intptr_t)f_lib == (intptr_t)JL_EXE_LIBNAME) {
2626
libptrgv = prepare_global_in(M, jlexe_var);
2727
symMap = &emission_context.symMapExe;
2828
}
29-
else if ((intptr_t)f_lib == 2) {
29+
else if ((intptr_t)f_lib == (intptr_t)JL_LIBJULIA_INTERNAL_DL_LIBNAME) {
3030
libptrgv = prepare_global_in(M, jldll_var);
3131
symMap = &emission_context.symMapDl;
3232
}
@@ -1266,7 +1266,7 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs)
12661266
auto _is_libjulia_func = [&] (uintptr_t ptr, const char *name) {
12671267
if ((uintptr_t)fptr == ptr)
12681268
return true;
1269-
return (!f_lib || f_lib == JL_DL_LIBNAME) && f_name && !strcmp(f_name, name);
1269+
return (!f_lib || f_lib == JL_LIBJULIA_INTERNAL_DL_LIBNAME) && f_name && !strcmp(f_name, name);
12701270
};
12711271
#define is_libjulia_func(name) _is_libjulia_func((uintptr_t)&(name), #name)
12721272

src/codegen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ static const auto jlexe_var = new JuliaVariable{
397397
[](LLVMContext &C) { return T_pint8; },
398398
};
399399
static const auto jldll_var = new JuliaVariable{
400-
"jl_dl_handle",
400+
"jl_libjulia_internal_handle",
401401
true,
402402
[](LLVMContext &C) { return T_pint8; },
403403
};
@@ -7531,7 +7531,7 @@ static void init_jit_functions(void)
75317531
add_named_global(jlRTLD_DEFAULT_var, &jl_RTLD_DEFAULT_handle);
75327532
#ifdef _OS_WINDOWS_
75337533
add_named_global(jlexe_var, &jl_exe_handle);
7534-
add_named_global(jldll_var, &jl_dl_handle);
7534+
add_named_global(jldll_var, &jl_libjulia_internal_handle);
75357535
#endif
75367536
global_jlvalue_to_llvm(new JuliaVariable{"jl_true", true, get_pjlvalue}, &jl_true);
75377537
global_jlvalue_to_llvm(new JuliaVariable{"jl_false", true, get_pjlvalue}, &jl_false);

src/dlload.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,10 @@ const char *jl_dlfind_win32(const char *f_name)
308308
void * dummy;
309309
if (jl_dlsym(jl_exe_handle, f_name, &dummy, 0))
310310
return JL_EXE_LIBNAME;
311-
if (jl_dlsym(jl_dl_handle, f_name, &dummy, 0))
312-
return JL_DL_LIBNAME;
311+
if (jl_dlsym(jl_libjulia_internal_handle, f_name, &dummy, 0))
312+
return JL_LIBJULIA_INTERNAL_DL_LIBNAME;
313+
if (jl_dlsym(jl_libjulia_handle, f_name, &dummy, 0))
314+
return JL_LIBJULIA_DL_LIBNAME;
313315
if (jl_dlsym(jl_kernel32_handle, f_name, &dummy, 0))
314316
return "kernel32";
315317
if (jl_dlsym(jl_ntdll_handle, f_name, &dummy, 0))
@@ -334,8 +336,8 @@ const char *jl_dlfind_win32(const char *f_name)
334336
// explicit is preferred over implicit
335337
return NULL;
336338
// oops, we didn't find it. NULL defaults to searching jl_RTLD_DEFAULT_handle,
337-
// which defaults to jl_dl_handle, where we won't find it, and will throw the
338-
// appropriate error.
339+
// which defaults to jl_libjulia_internal_handle, where we won't find it, and
340+
// will throw the appropriate error.
339341
}
340342
#endif
341343

src/init.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,8 @@ JL_DLLEXPORT void jl_atexit_hook(int exitcode)
293293

294294
static void post_boot_hooks(void);
295295

296-
JL_DLLEXPORT void *jl_dl_handle;
296+
JL_DLLEXPORT void *jl_libjulia_internal_handle;
297+
JL_DLLEXPORT void *jl_libjulia_handle;
297298
void *jl_RTLD_DEFAULT_handle;
298299
JL_DLLEXPORT void *jl_exe_handle;
299300
#ifdef _OS_WINDOWS_
@@ -657,7 +658,10 @@ void _julia_init(JL_IMAGE_SEARCH rel)
657658
jl_prep_sanitizers();
658659
void *stack_lo, *stack_hi;
659660
jl_init_stack_limits(1, &stack_lo, &stack_hi);
660-
jl_dl_handle = jl_load_dynamic_library(NULL, JL_RTLD_DEFAULT, 1);
661+
662+
// Load libjulia-internal (which contains this function), and libjulia, explicitly.
663+
jl_libjulia_internal_handle = jl_load_dynamic_library(NULL, JL_RTLD_DEFAULT, 1);
664+
jl_libjulia_handle = jl_load_dynamic_library(JL_LIBJULIA_DL_LIBNAME, JL_RTLD_DEFAULT, 1);
661665
#ifdef _OS_WINDOWS_
662666
jl_ntdll_handle = jl_dlopen("ntdll.dll", 0); // bypass julia's pathchecking for system dlls
663667
jl_kernel32_handle = jl_dlopen("kernel32.dll", 0);

src/julia.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1510,7 +1510,7 @@ JL_DLLEXPORT int jl_is_debugbuild(void) JL_NOTSAFEPOINT;
15101510
JL_DLLEXPORT jl_sym_t *jl_get_UNAME(void) JL_NOTSAFEPOINT;
15111511
JL_DLLEXPORT jl_sym_t *jl_get_ARCH(void) JL_NOTSAFEPOINT;
15121512
JL_DLLEXPORT jl_value_t *jl_get_libllvm(void) JL_NOTSAFEPOINT;
1513-
extern JL_DLLEXPORT int jl_n_threads;
1513+
extern JL_DLLIMPORT int jl_n_threads;
15141514

15151515
// environment entries
15161516
JL_DLLEXPORT jl_value_t *jl_environ(int i);

src/julia_internal.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,8 @@ STATIC_INLINE uint64_t cong(uint64_t max, uint64_t unbias, uint64_t *seed)
990990
}
991991

992992
// libuv stuff:
993-
JL_DLLEXPORT extern void *jl_dl_handle;
993+
JL_DLLEXPORT extern void *jl_libjulia_handle;
994+
JL_DLLEXPORT extern void *jl_libjulia_internal_handle;
994995
JL_DLLEXPORT extern void *jl_RTLD_DEFAULT_handle;
995996
#if defined(_OS_WINDOWS_)
996997
JL_DLLEXPORT extern void *jl_exe_handle;
@@ -1012,8 +1013,13 @@ JL_DLLEXPORT jl_value_t *jl_get_cfunction_trampoline(
10121013

10131014

10141015
// Windows only
1015-
#define JL_EXE_LIBNAME ((const char*)1)
1016-
#define JL_DL_LIBNAME ((const char*)2)
1016+
#define JL_EXE_LIBNAME ((const char*)1)
1017+
#define JL_LIBJULIA_INTERNAL_DL_LIBNAME ((const char*)2)
1018+
#if defined(JL_DEBUG_BUILD)
1019+
#define JL_LIBJULIA_DL_LIBNAME "libjulia-debug"
1020+
#else
1021+
#define JL_LIBJULIA_DL_LIBNAME "libjulia"
1022+
#endif
10171023
const char *jl_dlfind_win32(const char *name);
10181024

10191025
// libuv wrappers:

src/runtime_ccall.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ void *jl_get_library_(const char *f_lib, int throw_err) JL_NOTSAFEPOINT
3333
#ifdef _OS_WINDOWS_
3434
if (f_lib == JL_EXE_LIBNAME)
3535
return jl_exe_handle;
36-
if (f_lib == JL_DL_LIBNAME)
37-
return jl_dl_handle;
36+
if (f_lib == JL_LIBJULIA_INTERNAL_DL_LIBNAME)
37+
return jl_libjulia_internal_handle;
38+
if (f_lib == JL_LIBJULIA_DL_LIBNAME)
39+
return jl_libjulia_handle;
3840
#endif
3941
if (f_lib == NULL)
4042
return jl_RTLD_DEFAULT_handle;

0 commit comments

Comments
 (0)