Commit 92c94e7df230dd86eb46e8edf8e9d92531d5f6ef
1 parent
81fc5943
Add symbol versioning
For ELF systems, turn on versioned symbols by default, and add a configure option to enable or disable them.
Showing
6 changed files
with
57 additions
and
48 deletions
TODO
| ... | ... | @@ -4,6 +4,13 @@ Next |
| 4 | 4 | * Get rid of off_t. size_t is okay. Use autoconf to figure out what |
| 5 | 5 | type to use for offsets. |
| 6 | 6 | |
| 7 | + * Get rid of int/size_t/off_t inconsistencies. MSVC 2010 can find | |
| 8 | + these if you add /w14267 to the compilation. We might want to do | |
| 9 | + this by default. The easiest way to fix this on Windows is to | |
| 10 | + modify msvc.mk to add this to both cl /c lines and run | |
| 11 | + | |
| 12 | + make 2>&1 | tee build.log | |
| 13 | + | |
| 7 | 14 | * Deal with portability issues from gcc 4.7. See portability.patch |
| 8 | 15 | from debian package. |
| 9 | 16 | |
| ... | ... | @@ -11,52 +18,6 @@ Next |
| 11 | 18 | to build and test cleanly in 2.3.1. Hopefully the next release |
| 12 | 19 | will include 64-bit binary distributions and external libraries. |
| 13 | 20 | |
| 14 | - * Add versioned symbols. Fix below to not use AM_CONDITIONAL. Just | |
| 15 | - set some variable that can be part of LDFLAGS, like | |
| 16 | - LD_VERSION_SCRIPT, instead. | |
| 17 | - | |
| 18 | -# Check if LD supports linker scripts, and define conditional | |
| 19 | -# HAVE_LD_VERSION_SCRIPT if so. This functionality is currently | |
| 20 | -# constrained to compilers using GNU ld on ELF systems or systems | |
| 21 | -# which provide an adequate emulation thereof. | |
| 22 | -AC_ARG_ENABLE([ld-version-script], | |
| 23 | - AS_HELP_STRING([--enable-ld-version-script], | |
| 24 | - [enable linker version script (default is disabled)]), | |
| 25 | - [have_ld_version_script=$enableval], [have_ld_version_script=no]) | |
| 26 | -if test "$have_ld_version_script" != no; then | |
| 27 | - AC_MSG_CHECKING([if LD -Wl,--version-script works]) | |
| 28 | - save_LDFLAGS="$LDFLAGS" | |
| 29 | - LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" | |
| 30 | - cat > conftest.map <<EOF | |
| 31 | -VERS_1 { | |
| 32 | - global: sym; | |
| 33 | -}; | |
| 34 | - | |
| 35 | -VERS_2 { | |
| 36 | - global: sym; | |
| 37 | -} VERS_1; | |
| 38 | -EOF | |
| 39 | - AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], | |
| 40 | - [have_ld_version_script=yes], [have_ld_version_script=no]) | |
| 41 | - rm -f conftest.map | |
| 42 | - LDFLAGS="$save_LDFLAGS" | |
| 43 | - AC_MSG_RESULT($have_ld_version_script) | |
| 44 | -fi | |
| 45 | -AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes") | |
| 46 | - | |
| 47 | ----- | |
| 48 | - | |
| 49 | -if HAVE_LD_VERSION_SCRIPT | |
| 50 | -libtiff_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libtiff.map | |
| 51 | -endif | |
| 52 | - | |
| 53 | ----- | |
| 54 | - | |
| 55 | -LIBQPDF_3 { | |
| 56 | - global: | |
| 57 | - *; | |
| 58 | -}; | |
| 59 | - | |
| 60 | 21 | * Provide an option to copy encryption parameters from another file. |
| 61 | 22 | This would make it possible to decrypt a file, manually work with |
| 62 | 23 | it, and then re-encrypt it using the original encryption parameters | ... | ... |
autoconf.mk.in
configure.ac
| ... | ... | @@ -41,6 +41,40 @@ AC_TYPE_UINT16_T |
| 41 | 41 | AC_TYPE_UINT32_T |
| 42 | 42 | AC_CHECK_FUNCS(random) |
| 43 | 43 | |
| 44 | +# Check if LD supports linker scripts, and define conditional | |
| 45 | +# HAVE_LD_VERSION_SCRIPT if so. This functionality is currently | |
| 46 | +# constrained to compilers using GNU ld on ELF systems or systems | |
| 47 | +# which provide an adequate emulation thereof. | |
| 48 | +AC_ARG_ENABLE([ld-version-script], | |
| 49 | + AS_HELP_STRING([--enable-ld-version-script], | |
| 50 | + [enable linker version script (default is disabled)]), | |
| 51 | + [have_ld_version_script=$enableval], [have_ld_version_script=yes]) | |
| 52 | +if test "$have_ld_version_script" != no; then | |
| 53 | + AC_MSG_CHECKING([if LD -Wl,--version-script works]) | |
| 54 | + save_LDFLAGS="$LDFLAGS" | |
| 55 | + LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map" | |
| 56 | + cat > conftest.map <<EOF | |
| 57 | +VERS_1 { | |
| 58 | + global: sym; | |
| 59 | +}; | |
| 60 | + | |
| 61 | +VERS_2 { | |
| 62 | + global: sym; | |
| 63 | +} VERS_1; | |
| 64 | +EOF | |
| 65 | + AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])], | |
| 66 | + [have_ld_version_script=yes], [have_ld_version_script=no]) | |
| 67 | + rm -f conftest.map | |
| 68 | + LDFLAGS="$save_LDFLAGS" | |
| 69 | + AC_MSG_RESULT($have_ld_version_script) | |
| 70 | +fi | |
| 71 | +if test "$have_ld_version_script" = "yes"; then | |
| 72 | + HAVE_LD_VERSION_SCRIPT=1 | |
| 73 | +else | |
| 74 | + HAVE_LD_VERSION_SCRIPT=0 | |
| 75 | +fi | |
| 76 | +AC_SUBST(HAVE_LD_VERSION_SCRIPT) | |
| 77 | + | |
| 44 | 78 | AC_MSG_CHECKING(for gnu make >= 3.81) |
| 45 | 79 | make_okay=0 |
| 46 | 80 | if make --version >/dev/null 2>&1; then | ... | ... |
libqpdf.map
0 → 100644
libqpdf/build.mk
| ... | ... | @@ -64,6 +64,8 @@ $(OBJS_libqpdf): libqpdf/$(OUTPUT_DIR)/%.$(LOBJ): libqpdf/%.cc |
| 64 | 64 | # |
| 65 | 65 | # * If any interfaces have been removed or changed, we are not binary |
| 66 | 66 | # compatible. Increment CURRENT, and set AGE and REVISION to 0. |
| 67 | +# Also update libqpdf.map, changing the numeric portion to match | |
| 68 | +# CURRENT. | |
| 67 | 69 | # |
| 68 | 70 | # * Otherwise, if any interfaces have been added since the last |
| 69 | 71 | # public release, then increment CURRENT and AGE, and set REVISION |
| ... | ... | @@ -72,4 +74,4 @@ $(OBJS_libqpdf): libqpdf/$(OUTPUT_DIR)/%.$(LOBJ): libqpdf/%.cc |
| 72 | 74 | # * Otherwise, increment REVISION |
| 73 | 75 | |
| 74 | 76 | $(TARGETS_libqpdf): $(OBJS_libqpdf) |
| 75 | - $(call makelib,$(OBJS_libqpdf),$@,$(LDFLAGS),$(LIBS),7,1,4) | |
| 77 | + $(call makelib,$(OBJS_libqpdf),$@,$(LDFLAGS),$(LIBS),8,0,0) | ... | ... |
make/libtool.mk
| ... | ... | @@ -18,6 +18,12 @@ endef |
| 18 | 18 | |
| 19 | 19 | # --- Private definitions --- |
| 20 | 20 | |
| 21 | +ifeq ($(HAVE_LD_VERSION_SCRIPT), 1) | |
| 22 | +LD_VERSION_FLAGS=-Wl,--version-script=libqpdf.map | |
| 23 | +else | |
| 24 | +LD_VERSION_FLAGS= | |
| 25 | +endif | |
| 26 | + | |
| 21 | 27 | # Usage: $(call libdepflags,$(basename obj)) |
| 22 | 28 | # Usage: $(call fixdeps,$(basename obj)) |
| 23 | 29 | ifeq ($(GENDEPS),1) |
| ... | ... | @@ -83,7 +89,8 @@ endef |
| 83 | 89 | # Usage: $(call makelib,objs,library,ldflags,libs,current,revision,age) |
| 84 | 90 | define makelib |
| 85 | 91 | $(LIBTOOL) --mode=link \ |
| 86 | - $(CXX) $(CXXFLAGS) -o $(2) $(1) $(3) $(4) \ | |
| 92 | + $(CXX) $(CXXFLAGS) $(LD_VERSION_FLAGS) \ | |
| 93 | + -o $(2) $(1) $(3) $(4) \ | |
| 87 | 94 | -rpath $(libdir) -version-info $(5):$(6):$(7) |
| 88 | 95 | endef |
| 89 | 96 | ... | ... |