Commit 92c94e7df230dd86eb46e8edf8e9d92531d5f6ef

Authored by Jay Berkenbilt
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.
... ... @@ -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
... ... @@ -31,3 +31,4 @@ BUILD_PDF=@BUILD_PDF@
31 31 VALIDATE_DOC=@VALIDATE_DOC@
32 32 SKIP_TEST_COMPARE_IMAGES=@SKIP_TEST_COMPARE_IMAGES@
33 33 BUILDRULES=@BUILDRULES@
  34 +HAVE_LD_VERSION_SCRIPT=@HAVE_LD_VERSION_SCRIPT@
... ...
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
  1 +LIBQPDF_8 {
  2 + global:
  3 + *;
  4 +};
... ...
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  
... ...