Skip to content

Commit f5d944c

Browse files
use separate names for internal and exported functions (JuliaLang#42151)
helps avoid linker errors and confusion Co-authored-by: Jeff Bezanson <[email protected]>
1 parent 82d8a36 commit f5d944c

33 files changed

+345
-281
lines changed

cli/jl_exports.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ JL_EXPORTED_FUNCS_WIN(XX)
2525
#endif
2626
#undef XX
2727

28-
// Define holder locations for function addresses as `const void * $(name)_addr = & $(name);`
29-
#define XX(name) JL_HIDDEN anonfunc * name##_addr = (anonfunc*)&name;
28+
// Define holder locations for function addresses as `const void * $(name)_addr = NULL;
29+
#define XX(name) JL_HIDDEN anonfunc * name##_addr = NULL;
3030
JL_EXPORTED_FUNCS(XX)
3131
#ifdef _OS_WINDOWS_
3232
JL_EXPORTED_FUNCS_WIN(XX)
3333
#endif
3434
#undef XX
3535

3636
// Generate lists of function names and addresses
37-
#define XX(name) #name,
37+
#define XX(name) "i" #name,
3838
static const char *const jl_exported_func_names[] = {
3939
JL_EXPORTED_FUNCS(XX)
4040
#ifdef _OS_WINDOWS_

cli/loader.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
# endif
5454
#define JL_HIDDEN
5555
#else
56-
# if defined(LIBRARY_EXPORTS) && defined(_OS_LINUX)
56+
# if defined(LIBRARY_EXPORTS) && defined(_OS_LINUX_)
5757
# define JL_DLLEXPORT __attribute__ ((visibility("protected")))
5858
# else
5959
# define JL_DLLEXPORT __attribute__ ((visibility("default")))

cli/loader_lib.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ __attribute__((constructor)) void jl_load_libjulia_internal(void) {
177177
// Once we have libjulia-internal loaded, re-export its symbols:
178178
for (unsigned int symbol_idx=0; jl_exported_func_names[symbol_idx] != NULL; ++symbol_idx) {
179179
void *addr = lookup_symbol(libjulia_internal, jl_exported_func_names[symbol_idx]);
180-
if (addr == NULL || addr == *jl_exported_func_addrs[symbol_idx]) {
181-
jl_loader_print_stderr3("ERROR: Unable to load ", jl_exported_func_names[symbol_idx], " from libjulia-internal");
180+
if (addr == NULL) {
181+
jl_loader_print_stderr3("ERROR: Unable to load ", jl_exported_func_names[symbol_idx], " from libjulia-internal\n");
182182
exit(1);
183183
}
184184
(*jl_exported_func_addrs[symbol_idx]) = addr;

src/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
/julia_flisp.boot
1111
/julia_flisp.boot.inc
1212
/flisp.boot.inc
13+
/jl_internal_funcs.inc
1314

1415
/libjulia-debug.a
1516
/libjulia-debug.so

src/Makefile

+17-8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ JLDFLAGS += $(LDFLAGS)
1717
FLAGS := \
1818
-D_GNU_SOURCE -I$(BUILDDIR) -I$(SRCDIR) \
1919
-I$(SRCDIR)/flisp -I$(SRCDIR)/support \
20-
-I$(LIBUV_INC) -I$(build_includedir) -DLIBRARY_EXPORTS \
20+
-I$(LIBUV_INC) -I$(build_includedir) \
2121
-I$(JULIAHOME)/deps/valgrind
2222
ifneq ($(USEMSVC), 1)
2323
FLAGS += -Wall -Wno-strict-aliasing -fno-omit-frame-pointer -fvisibility=hidden -fno-common \
@@ -95,12 +95,13 @@ endif
9595

9696
# headers are used for dependency tracking, while public headers will be part of the dist
9797
UV_HEADERS :=
98-
HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h julia_locks.h julia_atomics.h julia_internal.h options.h timing.h) $(addprefix $(BUILDDIR)/, $(DTRACE_HEADERS))
99-
PUBLIC_HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h julia_locks.h julia_atomics.h julia_gcext.h)
10098
ifeq ($(USE_SYSTEM_LIBUV),0)
10199
UV_HEADERS += uv.h
102100
UV_HEADERS += uv/*.h
103101
endif
102+
PUBLIC_HEADERS := $(BUILDDIR)/julia_version.h $(wildcard $(SRCDIR)/support/*.h) $(addprefix $(SRCDIR)/,julia.h julia_assert.h julia_threads.h julia_fasttls.h julia_locks.h julia_atomics.h)
103+
HEADERS := $(PUBLIC_HEADERS) $(addprefix $(SRCDIR)/,julia_internal.h options.h timing.h) $(addprefix $(BUILDDIR)/,$(DTRACE_HEADERS) jl_internal_funcs.inc)
104+
PUBLIC_HEADERS += $(addprefix $(SRCDIR)/,julia_gcext.h)
104105
PUBLIC_HEADER_TARGETS := $(addprefix $(build_includedir)/julia/,$(notdir $(PUBLIC_HEADERS)) $(UV_HEADERS))
105106

106107
LLVM_LDFLAGS := $(shell $(LLVM_CONFIG_HOST) --ldflags)
@@ -135,8 +136,8 @@ RELEASE_LIBS := $(COMMON_LIBPATHS) $(WHOLE_ARCHIVE) $(BUILDDIR)/flisp/libflisp.a
135136

136137
OBJS := $(SRCS:%=$(BUILDDIR)/%.o)
137138
DOBJS := $(SRCS:%=$(BUILDDIR)/%.dbg.obj)
138-
DEBUGFLAGS += $(FLAGS)
139-
SHIPFLAGS += $(FLAGS)
139+
DEBUGFLAGS += $(FLAGS) -DLIBRARY_EXPORTS
140+
SHIPFLAGS += $(FLAGS) -DLIBRARY_EXPORTS
140141

141142
# if not absolute, then relative to the directory of the julia executable
142143
SHIPFLAGS += "-DJL_SYSTEM_IMAGE_PATH=\"$(build_private_libdir_rel)/sys.$(SHLIB_EXT)\""
@@ -178,6 +179,13 @@ $(BUILDDIR)/%.h.gen : $(SRCDIR)/%.d
178179
sed 's/JULIA_/JL_PROBE_/' $@ > $@.tmp
179180
mv $@.tmp $@
180181

182+
$(BUILDDIR)/jl_internal_funcs.inc: $(SRCDIR)/jl_exported_funcs.inc
183+
# Generate `.inc` file that contains a list of `#define` macros to rename functions defined in `libjulia-internal`
184+
# to have a `ijl_` prefix instead of `jl_`, to denote that they are coming from `libjulia-internal`. This avoids
185+
# potential confusion with debugging tools, when inspecting a process that has both `libjulia` and `libjulia-internal`
186+
# loaded at the same time.
187+
grep 'XX(.\+)' $< | sed -E 's/.*XX\((.+)\).*/#define \1 i\1/g' >$@
188+
181189
# source file rules
182190
$(BUILDDIR)/%.o: $(SRCDIR)/%.c $(HEADERS) | $(BUILDDIR)
183191
@$(call PRINT_CC, $(CC) $(JCPPFLAGS) $(JCFLAGS) $(SHIPFLAGS) $(DISABLE_ASSERTIONS) -c $< -o $@)
@@ -213,7 +221,7 @@ else
213221
JULIA_SPLITDEBUG := 0
214222
endif
215223
$(build_shlibdir)/libccalltest.$(SHLIB_EXT): $(SRCDIR)/ccalltest.c
216-
@$(call PRINT_CC, $(CC) $(JCFLAGS) $(JCPPFLAGS) $(DEBUGFLAGS) -O3 $< $(fPIC) -shared -o $@.tmp $(JLDFLAGS))
224+
@$(call PRINT_CC, $(CC) $(JCFLAGS) $(JCPPFLAGS) $(FLAGS) -O3 $< $(fPIC) -shared -o $@.tmp $(LDFLAGS))
217225
$(INSTALL_NAME_CMD)libccalltest.$(SHLIB_EXT) $@.tmp
218226
ifeq ($(JULIA_SPLITDEBUG),1)
219227
@# Create split debug info file for libccalltest stacktraces test
@@ -230,7 +238,7 @@ endif
230238
$(INSTALL_NAME_CMD)libccalltest.$(SHLIB_EXT) $@
231239

232240
$(build_shlibdir)/libllvmcalltest.$(SHLIB_EXT): $(SRCDIR)/llvmcalltest.cpp $(LLVM_CONFIG_ABSOLUTE)
233-
@$(call PRINT_CC, $(CXX) $(LLVM_CXXFLAGS) $(JCXXFLAGS) $(JCPPFLAGS) $(DEBUGFLAGS) -O3 $< $(fPIC) -shared -o $@ $(JLDFLAGS) -L$(build_shlibdir) -L$(build_libdir) $(NO_WHOLE_ARCHIVE) $(LLVMLINK)) -lpthread
241+
@$(call PRINT_CC, $(CXX) $(LLVM_CXXFLAGS) $(FLAGS) $(CPPFLAGS) $(CXXFLAGS) -O3 $< $(fPIC) -shared -o $@ $(LDFLAGS) $(COMMON_LIBPATHS) $(NO_WHOLE_ARCHIVE) $(LLVMLINK)) -lpthread
234242

235243
julia_flisp.boot.inc.phony: $(BUILDDIR)/julia_flisp.boot.inc
236244

@@ -265,6 +273,7 @@ $(BUILDDIR)/llvm-alloc-opt.o $(BUILDDIR)/llvm-alloc-opt.dbg.obj: $(SRCDIR)/codeg
265273
$(BUILDDIR)/llvm-final-gc-lowering.o $(BUILDDIR)/llvm-final-gc-lowering.dbg.obj: $(SRCDIR)/llvm-pass-helpers.h
266274
$(BUILDDIR)/llvm-gc-invariant-verifier.o $(BUILDDIR)/llvm-gc-invariant-verifier.dbg.obj: $(SRCDIR)/codegen_shared.h
267275
$(BUILDDIR)/llvm-late-gc-lowering.o $(BUILDDIR)/llvm-late-gc-lowering.dbg.obj: $(SRCDIR)/llvm-pass-helpers.h
276+
$(BUILDDIR)/llvm-lower-handlers.o $(BUILDDIR)/llvm-lower-handlers.dbg.obj: $(SRCDIR)/codegen_shared.h
268277
$(BUILDDIR)/llvm-multiversioning.o $(BUILDDIR)/llvm-multiversioning.dbg.obj: $(SRCDIR)/codegen_shared.h
269278
$(BUILDDIR)/llvm-pass-helpers.o $(BUILDDIR)/llvm-pass-helpers.dbg.obj: $(SRCDIR)/llvm-pass-helpers.h $(SRCDIR)/codegen_shared.h
270279
$(BUILDDIR)/llvm-ptls.o $(BUILDDIR)/llvm-ptls.dbg.obj: $(SRCDIR)/codegen_shared.h
@@ -367,7 +376,7 @@ $(build_shlibdir)/lib%Plugin.$(SHLIB_EXT): $(SRCDIR)/clangsa/%.cpp $(LLVM_CONFIG
367376
install-analysis-deps:
368377
$(MAKE) -C $(JULIAHOME)/deps install-llvm install-clang install-llvm-tools install-libuv install-utf8proc install-unwind
369378

370-
analyzegc-deps-check: $(BUILDDIR)/julia_version.h $(BUILDDIR)/julia_flisp.boot.inc
379+
analyzegc-deps-check: $(BUILDDIR)/julia_version.h $(BUILDDIR)/julia_flisp.boot.inc $(BUILDDIR)/jl_internal_funcs.inc
371380
ifeq ($(USE_BINARYBUILDER_LLVM),0)
372381
ifneq ($(BUILD_LLVM_CLANG),1)
373382
$(error Clang must be available to use the clang analyzer. Either build it (BUILD_LLVM_CLANG=1) or use BinaryBuilder)

src/ccall.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -1264,13 +1264,14 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs)
12641264
return args[6 + i];
12651265
};
12661266

1267-
auto _is_libjulia_func = [&] (uintptr_t ptr, const char *name) {
1267+
auto _is_libjulia_func = [&] (uintptr_t ptr, StringRef name) {
12681268
if ((uintptr_t)fptr == ptr)
12691269
return true;
12701270
if (f_lib) {
12711271
#ifdef _OS_WINDOWS_
12721272
if ((f_lib == JL_EXE_LIBNAME) || // preventing invalid pointer access
12731273
(f_lib == JL_LIBJULIA_INTERNAL_DL_LIBNAME) ||
1274+
(!strcmp(f_lib, JL_LIBJULIA_DL_LIBNAME)) ||
12741275
(!strcmp(f_lib, jl_crtdll_basename))) {
12751276
// libjulia-like
12761277
}
@@ -1280,9 +1281,9 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs)
12801281
return false;
12811282
#endif
12821283
}
1283-
return f_name && !strcmp(f_name, name);
1284+
return f_name && f_name == name;
12841285
};
1285-
#define is_libjulia_func(name) _is_libjulia_func((uintptr_t)&(name), #name)
1286+
#define is_libjulia_func(name) _is_libjulia_func((uintptr_t)&(name), StringRef(#name))
12861287

12871288
// emit arguments
12881289
jl_cgval_t *argv = (jl_cgval_t*)alloca(sizeof(jl_cgval_t) * nccallargs);

0 commit comments

Comments
 (0)