Skip to content

Commit 6d400e4

Browse files
authored
Makefile: Add support for symbol versioning (ON by default) (#49012)
This enables symbol versioning by default, with the version string `JL_LIBJULIA_1.10` (the version suffix is the SOMAJOR in general). This will configure the linker to assign the specified version string to all Julia-exported symbols. As part of this change, the SOMAJOR has also been changed to be MAJOR.MINOR instead of just MAJOR. This is required to allow multiple minor releases of libjulia to live side-by-side in the same process. `SYMBOL_VERSION_SUFFIX` is provided to allow appending an additional unique "salt" to SOMAJOR, which can be helpful for creating template binaries that will be "version-stamped" after distribution. Correctly compute `LLVM_SHLIB_SYMBOL_VERSION` using `llvm-config`, so USE_SYSTEM_LLVM should continue to work.
1 parent 6174056 commit 6d400e4

File tree

7 files changed

+49
-25
lines changed

7 files changed

+49
-25
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
/source-dist.tmp
1313
/source-dist.tmp1
1414

15+
*.expmap
1516
*.exe
1617
*.dll
1718
*.dwo

Make.inc

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,17 @@ JULIA_MINOR_VERSION := $(shell echo $(JULIA_VERSION) | cut -d'-' -f 1 | cut -d'.
188188
JULIA_PATCH_VERSION := $(shell echo $(JULIA_VERSION) | cut -d'-' -f 1 | cut -d'+' -f 1 | cut -d'.' -f 3)
189189

190190
# libjulia's SONAME will follow the format libjulia.so.$(SOMAJOR). Before v1.0.0,
191-
# SOMAJOR will be a two-decimal value, e.g. libjulia.so.0.5, whereas at and beyond
192-
# v1.0.0, SOMAJOR will be simply the major version number, e.g. libjulia.so.1
191+
# somajor was a two-decimal value (e.g. libjulia.so.0.5). During v1.0.x - v1.9.x,
192+
# somajor was simply the major version number (e.g. libjulia.so.1). Starting in
193+
# v1.10.0, somajor is major.minor again (e.g. libjulia.so.1.10)
193194
# The file itself will ultimately symlink to libjulia.so.$(SOMAJOR).$(SOMINOR)
194-
ifeq ($(JULIA_MAJOR_VERSION),0)
195195
SOMAJOR := $(JULIA_MAJOR_VERSION).$(JULIA_MINOR_VERSION)
196196
SOMINOR := $(JULIA_PATCH_VERSION)
197-
else
198-
SOMAJOR := $(JULIA_MAJOR_VERSION)
199-
SOMINOR := $(JULIA_MINOR_VERSION)
197+
198+
# This suffix affects libjulia's SONAME and the symbol version associated with
199+
# all of its exported symbols.
200+
ifdef SYMBOL_VERSION_SUFFIX
201+
SOMAJOR := $(SOMAJOR)_$(SYMBOL_VERSION_SUFFIX)
200202
endif
201203

202204
ifneq ($(NO_GIT), 1)
@@ -488,7 +490,7 @@ endif
488490

489491
JCFLAGS_COMMON := -std=gnu11 -pipe $(fPIC) -fno-strict-aliasing -D_FILE_OFFSET_BITS=64
490492
JCFLAGS_CLANG := $(JCFLAGS_COMMON)
491-
JCFLAGS_GCC := $(JCFLAGS_COMMON)
493+
JCFLAGS_GCC := $(JCFLAGS_COMMON) -fno-gnu-unique
492494

493495
# AArch64 needs this flag to generate the .eh_frame used by libunwind
494496
JCPPFLAGS_COMMON := -fasynchronous-unwind-tables
@@ -497,7 +499,7 @@ JCPPFLAGS_GCC := $(JCPPFLAGS_COMMON)
497499

498500
JCXXFLAGS_COMMON := -pipe $(fPIC) -fno-rtti -std=c++14
499501
JCXXFLAGS_CLANG := $(JCXXFLAGS_COMMON) -pedantic
500-
JCXXFLAGS_GCC := $(JCXXFLAGS_COMMON)
502+
JCXXFLAGS_GCC := $(JCXXFLAGS_COMMON) -fno-gnu-unique
501503

502504
DEBUGFLAGS_COMMON := -O0 -DJL_DEBUG_BUILD -fstack-protector
503505
DEBUGFLAGS_CLANG := $(DEBUGFLAGS_COMMON) -g
@@ -1317,7 +1319,7 @@ ifeq (supported, $(shell echo $(IFUNC_DETECT_SRC) | $(CC) -Werror -x c - -S -o /
13171319
JCPPFLAGS += -DJULIA_HAS_IFUNC_SUPPORT=1
13181320
endif
13191321
JLDFLAGS += -Wl,-Bdynamic
1320-
OSLIBS += -Wl,--version-script=$(JULIAHOME)/src/julia.expmap
1322+
OSLIBS += -Wl,--version-script=$(BUILDROOT)/src/julia.expmap
13211323
ifneq ($(SANITIZE),1)
13221324
JLDFLAGS += -Wl,-no-undefined
13231325
endif
@@ -1342,7 +1344,7 @@ OSLIBS += -lelf -lkvm -lrt -lpthread -latomic
13421344
# See #21788
13431345
OSLIBS += -lgcc_s
13441346

1345-
OSLIBS += -Wl,--export-dynamic -Wl,--version-script=$(JULIAHOME)/src/julia.expmap \
1347+
OSLIBS += -Wl,--export-dynamic -Wl,--version-script=$(BUILDROOT)/src/julia.expmap \
13461348
$(NO_WHOLE_ARCHIVE)
13471349
endif
13481350

@@ -1357,7 +1359,7 @@ endif
13571359

13581360
ifeq ($(OS), WINNT)
13591361
HAVE_SSP := 1
1360-
OSLIBS += -Wl,--export-all-symbols -Wl,--version-script=$(JULIAHOME)/src/julia.expmap \
1362+
OSLIBS += -Wl,--export-all-symbols -Wl,--version-script=$(BUILDROOT)/src/julia.expmap \
13611363
$(NO_WHOLE_ARCHIVE) -lpsapi -lkernel32 -lws2_32 -liphlpapi -lwinmm -ldbghelp -luserenv -lsecur32 -latomic
13621364
JLDFLAGS += -Wl,--stack,8388608
13631365
ifeq ($(ARCH),i686)

cli/Makefile

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,18 @@ julia-debug: $(build_bindir)/julia-debug$(EXE)
104104
libjulia-release: $(build_shlibdir)/libjulia.$(SHLIB_EXT)
105105
libjulia-debug: $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT)
106106

107+
ifneq (,$(filter $(OS), Linux FreeBSD))
108+
VERSIONSCRIPT := -Wl,--version-script=$(BUILDDIR)/julia.expmap
109+
endif
110+
107111
ifeq ($(OS),WINNT)
108112
# On Windows we need to strip out exported functions from the generated import library.
109113
STRIP_EXPORTED_FUNCS := $(shell $(CPP_STDOUT) -I$(JULIAHOME)/src $(SRCDIR)/list_strip_symbols.h)
110114
endif
111115

112-
$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_OBJS) $(SRCDIR)/list_strip_symbols.h | $(build_shlibdir) $(build_libdir)
116+
$(build_shlibdir)/libjulia.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_OBJS) $(SRCDIR)/list_strip_symbols.h $(BUILDDIR)/julia.expmap | $(build_shlibdir) $(build_libdir)
113117
@$(call PRINT_LINK, $(CC) $(call IMPLIB_FLAGS,$@.tmp) $(LOADER_CFLAGS) -shared $(SHIPFLAGS) $(LIB_OBJS) -o $@ \
114-
$(JLIBLDFLAGS) $(LOADER_LDFLAGS) $(call SONAME_FLAGS,libjulia.$(JL_MAJOR_SHLIB_EXT)))
118+
$(JLIBLDFLAGS) $(LOADER_LDFLAGS) $(VERSIONSCRIPT) $(call SONAME_FLAGS,libjulia.$(JL_MAJOR_SHLIB_EXT)))
115119
@$(INSTALL_NAME_CMD)libjulia.$(JL_MAJOR_SHLIB_EXT) $@
116120
@$(DSYMUTIL) $@
117121
ifeq ($(OS), WINNT)
@@ -120,9 +124,9 @@ ifeq ($(OS), WINNT)
120124
@$(call PRINT_ANALYZE, $(OBJCOPY) $(build_libdir)/$(notdir $@).tmp.a $(STRIP_EXPORTED_FUNCS) $(build_libdir)/$(notdir $@).a && rm $(build_libdir)/$(notdir $@).tmp.a)
121125
endif
122126

123-
$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_DOBJS) $(SRCDIR)/list_strip_symbols.h | $(build_shlibdir) $(build_libdir)
127+
$(build_shlibdir)/libjulia-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(LIB_DOBJS) $(SRCDIR)/list_strip_symbols.h $(BUILDDIR)/julia.expmap | $(build_shlibdir) $(build_libdir)
124128
@$(call PRINT_LINK, $(CC) $(call IMPLIB_FLAGS,$@.tmp) $(LOADER_CFLAGS) -shared $(DEBUGFLAGS) $(LIB_DOBJS) -o $@ \
125-
$(JLIBLDFLAGS) $(LOADER_LDFLAGS) $(call SONAME_FLAGS,libjulia-debug.$(JL_MAJOR_SHLIB_EXT)))
129+
$(JLIBLDFLAGS) $(LOADER_LDFLAGS) $(VERSIONSCRIPT) $(call SONAME_FLAGS,libjulia-debug.$(JL_MAJOR_SHLIB_EXT)))
126130
@$(INSTALL_NAME_CMD)libjulia-debug.$(JL_MAJOR_SHLIB_EXT) $@
127131
@$(DSYMUTIL) $@
128132
ifeq ($(OS), WINNT)
@@ -144,8 +148,12 @@ $(build_bindir)/julia$(EXE): $(EXE_OBJS) $(build_shlibdir)/libjulia.$(SHLIB_EXT)
144148
$(build_bindir)/julia-debug$(EXE): $(EXE_DOBJS) $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT) | $(build_bindir)
145149
@$(call PRINT_LINK, $(CC) $(LOADER_CFLAGS) $(DEBUGFLAGS) $(EXE_DOBJS) -o $@ $(LOADER_LDFLAGS) $(RPATH) -ljulia-debug)
146150

151+
$(BUILDDIR)/julia.expmap: $(SRCDIR)/julia.expmap.in
152+
sed <'$<' >'$@' -e 's/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/'
153+
147154
clean: | $(CLEAN_TARGETS)
148155
rm -f $(BUILDDIR)/*.o $(BUILDDIR)/*.dbg.obj
149156
rm -f $(build_bindir)/julia*
157+
rm -f $(BUILDDIR)/julia.expmap
150158

151159
.PHONY: clean release debug julia-release julia-debug

cli/julia.expmap.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@JULIA_SHLIB_SYMBOL_VERSION@ { global: *; };

deps/llvm-ver.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ LLVM_SHARED_LIB_VER_SUFFIX := $(LLVM_VER_MAJ)jl
1717
# e.g.: "libLLVM-14jl"
1818
LLVM_SHARED_LIB_NAME := libLLVM-$(LLVM_SHARED_LIB_VER_SUFFIX)
1919
LLVM_SHARED_LINK_FLAG := -lLLVM-$(LLVM_SHARED_LIB_VER_SUFFIX)
20+
LLVM_SHLIB_SYMBOL_VERSION := JL_LLVM_$(LLVM_VER_MAJ).$(LLVM_VER_MIN)

src/Makefile

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ ifeq ($(JULIACODEGEN),LLVM)
119119
ifneq ($(USE_SYSTEM_LLVM),0)
120120
# USE_SYSTEM_LLVM != 0
121121
CG_LLVMLINK += $(LLVM_LDFLAGS) $(shell $(LLVM_CONFIG_HOST) --libs --system-libs)
122+
LLVM_SHLIB_SYMBOL_VERSION := $(shell nm -D --with-symbol-versions $(shell $(LLVM_CONFIG_HOST) --libfiles --link-shared | awk '{print $1; exit}') | \
123+
grep _ZN4llvm3Any6TypeId | head -n 1 | sed -e 's/.*@//')
124+
122125
# HACK: llvm-config doesn't correctly point to shared libs on all platforms
123126
# https://github.com/JuliaLang/julia/issues/29981
124127
else
@@ -344,10 +347,10 @@ $(FLISP_EXECUTABLE_release): $(BUILDDIR)/flisp/libflisp.a
344347
$(FLISP_EXECUTABLE_debug): $(BUILDDIR)/flisp/libflisp-debug.a
345348
$(MAKE) -C $(BUILDDIR)/flisp $(subst $(abspath $(BUILDDIR)/flisp)/,,$(abspath $(FLISP_EXECUTABLE_debug)))
346349

347-
$(BUILDDIR)/flisp/libflisp.a: $(addprefix $(SRCDIR)/flisp/,*.h *.c) $(BUILDDIR)/support/libsupport.a
350+
$(BUILDDIR)/flisp/libflisp.a: $(addprefix $(SRCDIR)/flisp/,*.h *.c) $(BUILDDIR)/support/libsupport.a $(BUILDDIR)/julia.expmap
348351
$(MAKE) -C $(SRCDIR)/flisp BUILDDIR='$(abspath $(BUILDDIR)/flisp)'
349352

350-
$(BUILDDIR)/flisp/libflisp-debug.a: $(addprefix $(SRCDIR)/,flisp/*.h flisp/*.c) $(BUILDDIR)/support/libsupport-debug.a
353+
$(BUILDDIR)/flisp/libflisp-debug.a: $(addprefix $(SRCDIR)/,flisp/*.h flisp/*.c) $(BUILDDIR)/support/libsupport-debug.a $(BUILDDIR)/julia.expmap
351354
$(MAKE) -C $(SRCDIR)/flisp debug BUILDDIR='$(abspath $(BUILDDIR)/flisp)'
352355

353356
$(BUILDDIR)/julia_version.h: $(JULIAHOME)/VERSION
@@ -365,13 +368,17 @@ $(BUILDDIR)/julia_version.h: $(JULIAHOME)/VERSION
365368

366369
CXXLD = $(CXX) -shared
367370

368-
$(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV)
371+
$(BUILDDIR)/julia.expmap: $(SRCDIR)/julia.expmap.in
372+
sed <'$<' >'$@' -e "s/@JULIA_SHLIB_SYMBOL_VERSION@/JL_LIBJULIA_$(SOMAJOR)/" \
373+
-e "s/@LLVM_SHLIB_SYMBOL_VERSION@/$(LLVM_SHLIB_SYMBOL_VERSION)/"
374+
375+
$(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT): $(BUILDDIR)/julia.expmap $(OBJS) $(BUILDDIR)/flisp/libflisp.a $(BUILDDIR)/support/libsupport.a $(LIBUV)
369376
@$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(JL_CXXFLAGS) $(CXXLDFLAGS) $(SHIPFLAGS) $(OBJS) $(RPATH_LIB) -o $@ \
370377
$(JLDFLAGS) $(JLIBLDFLAGS) $(RT_RELEASE_LIBS) $(call SONAME_FLAGS,libjulia-internal.$(JL_MAJOR_SHLIB_EXT)))
371378
@$(INSTALL_NAME_CMD)libjulia-internal.$(SHLIB_EXT) $@
372379
$(DSYMUTIL) $@
373380

374-
$(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a $(LIBUV)
381+
$(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(BUILDDIR)/julia.expmap $(DOBJS) $(BUILDDIR)/flisp/libflisp-debug.a $(BUILDDIR)/support/libsupport-debug.a $(LIBUV)
375382
@$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(JL_CXXFLAGS) $(CXXLDFLAGS) $(DEBUGFLAGS) $(DOBJS) $(RPATH_LIB) -o $@ \
376383
$(JLDFLAGS) $(JLIBLDFLAGS) $(RT_DEBUG_LIBS) $(call SONAME_FLAGS,libjulia-internal-debug.$(JL_MAJOR_SHLIB_EXT)))
377384
@$(INSTALL_NAME_CMD)libjulia-internal-debug.$(SHLIB_EXT) $@
@@ -393,13 +400,13 @@ libjulia-internal-release: $(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_
393400
libjulia-internal-debug: $(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)
394401
libjulia-internal-debug libjulia-internal-release: $(PUBLIC_HEADER_TARGETS)
395402

396-
$(build_shlibdir)/libjulia-codegen.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(CODEGEN_OBJS) $(BUILDDIR)/support/libsupport.a $(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT)
403+
$(build_shlibdir)/libjulia-codegen.$(JL_MAJOR_MINOR_SHLIB_EXT): $(BUILDDIR)/julia.expmap $(CODEGEN_OBJS) $(BUILDDIR)/support/libsupport.a $(build_shlibdir)/libjulia-internal.$(JL_MAJOR_MINOR_SHLIB_EXT)
397404
@$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(JL_CXXFLAGS) $(CXXLDFLAGS) $(SHIPFLAGS) $(CODEGEN_OBJS) $(RPATH_LIB) -o $@ \
398405
$(JLDFLAGS) $(JLIBLDFLAGS) $(CG_RELEASE_LIBS) $(call SONAME_FLAGS,libjulia-codegen.$(JL_MAJOR_SHLIB_EXT)))
399406
@$(INSTALL_NAME_CMD)libjulia-codegen.$(SHLIB_EXT) $@
400407
$(DSYMUTIL) $@
401408

402-
$(build_shlibdir)/libjulia-codegen-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(SRCDIR)/julia.expmap $(CODEGEN_DOBJS) $(BUILDDIR)/support/libsupport-debug.a $(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)
409+
$(build_shlibdir)/libjulia-codegen-debug.$(JL_MAJOR_MINOR_SHLIB_EXT): $(BUILDDIR)/julia.expmap $(CODEGEN_DOBJS) $(BUILDDIR)/support/libsupport-debug.a $(build_shlibdir)/libjulia-internal-debug.$(JL_MAJOR_MINOR_SHLIB_EXT)
403410
@$(call PRINT_LINK, $(CXXLD) $(call IMPLIB_FLAGS,$@) $(JCXXFLAGS) $(JL_CXXFLAGS) $(CXXLDFLAGS) $(DEBUGFLAGS) $(CODEGEN_DOBJS) $(RPATH_LIB) -o $@ \
404411
$(JLDFLAGS) $(JLIBLDFLAGS) $(CG_DEBUG_LIBS) $(call SONAME_FLAGS,libjulia-codegen-debug.$(JL_MAJOR_SHLIB_EXT)))
405412
@$(INSTALL_NAME_CMD)libjulia-codegen-debug.$(SHLIB_EXT) $@
@@ -429,6 +436,7 @@ clean:
429436
-rm -fr $(build_shlibdir)/libjulia-internal* $(build_shlibdir)/libjulia-codegen* $(build_shlibdir)/libccalltest* $(build_shlibdir)/libllvmcalltest*
430437
-rm -f $(BUILDDIR)/julia_flisp.boot $(BUILDDIR)/julia_flisp.boot.inc $(BUILDDIR)/jl_internal_funcs.inc
431438
-rm -f $(BUILDDIR)/*.dbg.obj $(BUILDDIR)/*.o $(BUILDDIR)/*.dwo $(BUILDDIR)/*.$(SHLIB_EXT) $(BUILDDIR)/*.a $(BUILDDIR)/*.h.gen
439+
-rm -f $(BUILDDIR)/julia.expmap
432440
-rm -f $(BUILDDIR)/julia_version.h
433441

434442
clean-flisp:

src/julia.expmap renamed to src/julia.expmap.in

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{
1+
@JULIA_SHLIB_SYMBOL_VERSION@ {
22
global:
33
pthread*;
44
__stack_chk_guard;
@@ -35,13 +35,16 @@
3535
JLJIT*;
3636
llvmGetPassPluginInfo;
3737

38-
/* Make visible so that linker will merge duplicate definitions across DSO boundaries */
39-
_ZN4llvm3Any6TypeId*;
40-
4138
/* freebsd */
4239
environ;
4340
__progname;
4441

4542
local:
4643
*;
4744
};
45+
46+
@LLVM_SHLIB_SYMBOL_VERSION@ {
47+
global:
48+
/* Make visible so that linker will merge duplicate definitions across DSO boundaries */
49+
_ZN4llvm3Any6TypeId*;
50+
};

0 commit comments

Comments
 (0)