diff --git a/01-Med-qblog.h-better-explanation-behaviour-of-QB_LOG_I.patch b/01-Med-qblog.h-better-explanation-behaviour-of-QB_LOG_I.patch index c81cd8d..054fcf0 100644 --- a/01-Med-qblog.h-better-explanation-behaviour-of-QB_LOG_I.patch +++ b/01-Med-qblog.h-better-explanation-behaviour-of-QB_LOG_I.patch @@ -116,5 +116,5 @@ index 3cb4eef..4954932 100644 #else #define QB_LOG_INIT_DATA(name) -- -2.14.3 +2.15.0 diff --git a/02-build-configure-check-section-boundary-symbols-prese.patch b/02-build-configure-check-section-boundary-symbols-prese.patch new file mode 100644 index 0000000..5d6f355 --- /dev/null +++ b/02-build-configure-check-section-boundary-symbols-prese.patch @@ -0,0 +1,80 @@ +From 9fadd438cbbabcde8fe3e19644bacc044279ebdb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= +Date: Fri, 6 Oct 2017 17:17:26 +0200 +Subject: [PATCH 2/6] build: configure: check section boundary symbols present + in the test +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There was an idea to make apparently run-time test set to that effect, +but it would make cross-building harder. So arrange the test as if it +would be meant for AC_TRY_RUN, but achieve the same as with the first +assertion by the means of inspecting the linked result with, possibly +target-specific, nm utility. + +While arranging the test for AC_TRY_RUN, based on feedback by Ferenc +Wágner, unify and increase usability of the run-time error signalling +through assertions. + +Signed-off-by: Jan Pokorný +--- + configure.ac | 35 ++++++++++++++++++++++++++--------- + 1 file changed, 26 insertions(+), 9 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 22630ba..29bd569 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -77,6 +77,7 @@ AC_CHECK_PROGS([DOXYGEN], [doxygen]) + AM_CONDITIONAL(HAVE_DOXYGEN, test -n "${DOXYGEN}") + AC_CHECK_PROGS([SPLINT], [splint]) + AM_CONDITIONAL(HAVE_SPLINT, test -n "${SPLINT}") ++AC_CHECK_TOOLS([NM], [eu-nm nm], [:]) + + ## local helper functions + +@@ -620,15 +621,31 @@ AC_SUBST(HAVE_SLOW_TESTS) + if test "x${GCC}" = xyes; then + AC_MSG_CHECKING([whether GCC supports __attribute__((section()) + ld supports orphan sections]) + if test "x${ac_cv_link_attribute_section}" = x ; then +- AC_TRY_LINK([#include +- extern void * __start___verbose, * __stop___verbose;], +- [static int my_var __attribute__((section("__verbose"))) = 5; +- if (__start___verbose == __stop___verbose) assert(0); +- if (my_var == 5) return 0; +- else return -1; +- ], +- [gcc_has_attribute_section=yes], +- [gcc_has_attribute_section=no]) ++ dnl could be turned to AC_TRY_RUN (first assertion is equivalent to ++ dnl the further check in action-if-true), but that would prevent ++ dnl cross-building ++ AC_LINK_IFELSE( ++ [AC_LANG_PROGRAM( ++ [[#include ++ extern void * __start___verbose, * __stop___verbose;]], ++ [[static int my_var __attribute__((section("__verbose"))) = 5; ++ assert("non-empty data section" ++ && __start___verbose != __stop___verbose); ++ assert("no data section value loss" ++ && my_var == 5);]] ++ )], ++ [# alternatively something like (but requires number parsing): ++ # readelf -SW "conftest${ac_exeext}" \ ++ # | sed -n '/__verbose/s/^\s*//p' | tr -s ' ' | cut -d" " -f6 ++ verbose_start_addr=$(${NM} -g --portability -- "conftest${ac_exeext}" \ ++ | grep __start___verbose | cut -d" " -f 3) ++ verbose_stop_addr=$(${NM} -g --portability -- "conftest${ac_exeext}" \ ++ | grep __stop___verbose | cut -d" " -f 3) ++ test "${verbose_start_addr}" = "${verbose_stop_addr}" \ ++ && gcc_has_attribute_section=no \ ++ || gcc_has_attribute_section=yes], ++ [gcc_has_attribute_section=no] ++ ) + else + gcc_has_attribute_section=${ac_cv_link_attribute_section} + fi +-- +2.15.0 + diff --git a/02-build-configure-run-attribute-section-test-through-r.patch b/02-build-configure-run-attribute-section-test-through-r.patch deleted file mode 100644 index f9dea7b..0000000 --- a/02-build-configure-run-attribute-section-test-through-r.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 287ae050e5330202eca59adbb7e87e9d26d69e08 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= -Date: Fri, 6 Oct 2017 17:17:26 +0200 -Subject: [PATCH 2/6] build: configure: run attribute section test through - run-time assertion -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -It's unclear why the apparently run-time test hasn't been set to that -effect, mere compilability was tested so far. - -Also, based on feedback by Ferenc Wágner, unify and increase usability -of the run-time error signalling through assertions. - -Signed-off-by: Jan Pokorný ---- - configure.ac | 22 +++++++++++++--------- - 1 file changed, 13 insertions(+), 9 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 22630ba..478194c 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -620,15 +620,19 @@ AC_SUBST(HAVE_SLOW_TESTS) - if test "x${GCC}" = xyes; then - AC_MSG_CHECKING([whether GCC supports __attribute__((section()) + ld supports orphan sections]) - if test "x${ac_cv_link_attribute_section}" = x ; then -- AC_TRY_LINK([#include -- extern void * __start___verbose, * __stop___verbose;], -- [static int my_var __attribute__((section("__verbose"))) = 5; -- if (__start___verbose == __stop___verbose) assert(0); -- if (my_var == 5) return 0; -- else return -1; -- ], -- [gcc_has_attribute_section=yes], -- [gcc_has_attribute_section=no]) -+ AC_TRY_RUN( -+ AC_LANG_PROGRAM( -+ [[#include -+ extern void * __start___verbose, * __stop___verbose;]], -+ [[static int my_var __attribute__((section("__verbose"))) = 5; -+ assert("non-empty data section" -+ && __start___verbose != __stop___verbose); -+ assert("no data section value loss" -+ && my_var == 5);]] -+ ), -+ [gcc_has_attribute_section=yes], -+ [gcc_has_attribute_section=no] -+ ) - else - gcc_has_attribute_section=${ac_cv_link_attribute_section} - fi --- -2.14.3 - diff --git a/03-tests-new-sort-of-tests-dubbed-functional-cover-link.patch b/03-tests-new-sort-of-tests-dubbed-functional-cover-link.patch index ea594fa..52288ff 100644 --- a/03-tests-new-sort-of-tests-dubbed-functional-cover-link.patch +++ b/03-tests-new-sort-of-tests-dubbed-functional-cover-link.patch @@ -1,4 +1,4 @@ -From d471da4335c1da2501f2c31ffafc18ae884af389 Mon Sep 17 00:00:00 2001 +From f400d33a3ce8ca04248a6602441a40b878eadf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Fri, 6 Oct 2017 17:17:26 +0200 Subject: [PATCH 3/6] tests: new sort of tests dubbed "functional", cover @@ -180,7 +180,7 @@ Signed-off-by: Jan Pokorný create mode 100755 tests/functional/log_test_mock.sh diff --git a/configure.ac b/configure.ac -index 478194c..274b49c 100644 +index 29bd569..8c588cb 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ AC_CONFIG_SRCDIR([lib/ringbuffer.c]) @@ -192,7 +192,7 @@ index 478194c..274b49c 100644 dnl automake >= 1.11 offers --enable-silent-rules for suppressing the output from dnl normal compilation. When a failure occurs, it will then display the full dnl command line -@@ -717,6 +717,9 @@ AC_CONFIG_FILES([Makefile +@@ -730,6 +730,9 @@ AC_CONFIG_FILES([Makefile lib/libqb.pc tools/Makefile tests/Makefile @@ -202,7 +202,7 @@ index 478194c..274b49c 100644 tests/test.conf examples/Makefile docs/Makefile -@@ -724,6 +727,8 @@ AC_CONFIG_FILES([Makefile +@@ -737,6 +740,8 @@ AC_CONFIG_FILES([Makefile docs/html.dox docs/man.dox]) @@ -1067,5 +1067,5 @@ index 0000000..145b9f4 + "- results stored in '_results/_[_]'" \ + || do_proceed "$@" -- -2.14.3 +2.15.0 diff --git a/04-Med-add-extra-run-time-client-libqb-checks-that-logg.patch b/04-Med-add-extra-run-time-client-libqb-checks-that-logg.patch index b9941c5..172d3d5 100644 --- a/04-Med-add-extra-run-time-client-libqb-checks-that-logg.patch +++ b/04-Med-add-extra-run-time-client-libqb-checks-that-logg.patch @@ -1,4 +1,4 @@ -From 06388b7fdf471438a08740791c21ae658c657bd0 Mon Sep 17 00:00:00 2001 +From 260768d94017023771af9e7f1bddcff91883617a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Fri, 6 Oct 2017 17:17:26 +0200 Subject: [PATCH 4/6] Med: add extra run-time (client, libqb) checks that @@ -247,10 +247,10 @@ Signed-off-by: Jan Pokorný create mode 100755 tests/functional/syslog-stdout.py diff --git a/configure.ac b/configure.ac -index 027154c..5338352 100644 +index 8c588cb..fdcd93c 100644 --- a/configure.ac +++ b/configure.ac -@@ -644,6 +644,7 @@ if test "x${GCC}" = xyes; then +@@ -655,6 +655,7 @@ if test "x${GCC}" = xyes; then AC_DEFINE([QB_HAVE_ATTRIBUTE_SECTION], 1, [Enabling code using __attribute__((section))]) PACKAGE_FEATURES="$PACKAGE_FEATURES attribute-section" @@ -259,7 +259,7 @@ index 027154c..5338352 100644 fi diff --git a/include/qb/qblog.h b/include/qb/qblog.h -index aba63a0..e71556c 100644 +index 4954932..a9a9ef2 100644 --- a/include/qb/qblog.h +++ b/include/qb/qblog.h @@ -1,9 +1,10 @@ @@ -627,5 +627,5 @@ index 0000000..64baf4c +if __name__ == '__main__': + main(*argv) -- -2.14.3 +2.15.0 diff --git a/05-High-bare-fix-for-libqb-logging-not-working-with-ld..patch b/05-High-bare-fix-for-libqb-logging-not-working-with-ld..patch index c36f1f5..1a3c124 100644 --- a/05-High-bare-fix-for-libqb-logging-not-working-with-ld..patch +++ b/05-High-bare-fix-for-libqb-logging-not-working-with-ld..patch @@ -1,4 +1,4 @@ -From ae68f462c4ee6cadcbdbbd31b4c19e19bdd7aab2 Mon Sep 17 00:00:00 2001 +From cd5d104895f018cf90480dc84f09f32f6dcc2b3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Fri, 6 Oct 2017 17:17:26 +0200 Subject: [PATCH 5/6] High: bare fix for libqb logging not working with @@ -280,24 +280,32 @@ References: Signed-off-by: Jan Pokorný --- - configure.ac | 147 +++++++++++++++++++++++++++++++++++++++++------ - include/qb/qblog.h | 32 +++++++++-- - lib/Makefile.am | 67 +++++++++++++++++++++ - lib/libqb.pc.in | 8 +++ + configure.ac | 156 +++++++++++++++++++++++++++++++++++++++++------ + include/qb/qblog.h | 32 ++++++++-- + lib/Makefile.am | 79 +++++++++++++++++++++++- + lib/libqb.pc.in | 11 ++++ lib/log.c | 7 +++ lib/qblog_script.la.in | 15 +++++ - lib/qblog_script.ld.in | 27 +++++++++ + lib/qblog_script.ld.in | 30 +++++++++ lib/qblog_script_noop.ld | 1 + - 8 files changed, 280 insertions(+), 24 deletions(-) + 8 files changed, 304 insertions(+), 27 deletions(-) create mode 100644 lib/qblog_script.la.in create mode 100644 lib/qblog_script.ld.in create mode 100644 lib/qblog_script_noop.ld diff --git a/configure.ac b/configure.ac -index 5338352..ac56c4c 100644 +index fdcd93c..cc3d3c3 100644 --- a/configure.ac +++ b/configure.ac -@@ -503,6 +503,14 @@ AC_ARG_ENABLE([debug], +@@ -78,6 +78,7 @@ AM_CONDITIONAL(HAVE_DOXYGEN, test -n "${DOXYGEN}") + AC_CHECK_PROGS([SPLINT], [splint]) + AM_CONDITIONAL(HAVE_SPLINT, test -n "${SPLINT}") + AC_CHECK_TOOLS([NM], [eu-nm nm], [:]) ++AC_CHECK_TOOLS([READELF], [eu-readelf readelf], [:]) + + ## local helper functions + +@@ -502,6 +503,14 @@ AC_ARG_ENABLE([debug], AC_ARG_ENABLE([coverage], [AS_HELP_STRING([--enable-coverage],[coverage analysis of the codebase])]) @@ -312,7 +320,7 @@ index 5338352..ac56c4c 100644 AC_ARG_ENABLE([slow-tests], [AS_HELP_STRING([--enable-slow-tests],[build and run slow tests])]) -@@ -611,6 +619,19 @@ else +@@ -610,6 +619,19 @@ else COVERAGE_LDFLAGS="" fi @@ -332,27 +340,17 @@ index 5338352..ac56c4c 100644 if test "x${enable_slow_tests}" = xyes ; then AC_DEFINE([HAVE_SLOW_TESTS], 1,[have slow tests]) AC_MSG_NOTICE([Enabling Slow tests]) -@@ -620,33 +641,121 @@ AC_SUBST(HAVE_SLOW_TESTS) +@@ -619,20 +641,60 @@ AC_SUBST(HAVE_SLOW_TESTS) # --- callsite sections --- if test "x${GCC}" = xyes; then + AX_SAVE_FLAGS AC_MSG_CHECKING([whether GCC supports __attribute__((section()) + ld supports orphan sections]) if test "x${ac_cv_link_attribute_section}" = x ; then -- AC_TRY_RUN( -- AC_LANG_PROGRAM( + LDFLAGS="${LDFLAGS_save} -shared -fPIC" # we are compiling shared lib + AC_LINK_IFELSE( + [AC_LANG_SOURCE( - [[#include -- extern void * __start___verbose, * __stop___verbose;]], -- [[static int my_var __attribute__((section("__verbose"))) = 5; -- assert("non-empty data section" -- && __start___verbose != __stop___verbose); -- assert("no data section value loss" -- && my_var == 5);]] -- ), -- [gcc_has_attribute_section=yes], ++ [[#include + extern int __start___verbose[], __stop___verbose[]; + int test(void) { + static int my_var __attribute__((section("__verbose"))) = 3; @@ -362,52 +360,74 @@ index 5338352..ac56c4c 100644 + && my_var == 3 /* for 2.29.1+ */); + return *((int *) __start___verbose); }]] + )], -+ [gcc_has_attribute_section=yes; cp "conftest${EXEEXT}" "conftest.so"], - [gcc_has_attribute_section=no] - ) ++ [gcc_has_attribute_section=yes; cp "conftest${ac_exeext}" "conftest.so"], ++ [gcc_has_attribute_section=no] ++ ) + AX_RESTORE_FLAGS - else - gcc_has_attribute_section=${ac_cv_link_attribute_section} - fi -- - AC_MSG_RESULT($gcc_has_attribute_section) -- if test $gcc_has_attribute_section = yes; then -- AC_DEFINE([QB_HAVE_ATTRIBUTE_SECTION], 1, -- [Enabling code using __attribute__((section))]) -- PACKAGE_FEATURES="$PACKAGE_FEATURES attribute-section" -- AC_SUBST([client_dlopen_LIBS],[$dlopen_LIBS]) ++ else ++ gcc_has_attribute_section=${ac_cv_link_attribute_section} ++ fi ++ AC_MSG_RESULT($gcc_has_attribute_section) + + # in the failing case (e.g. with ld from binutils 2.29), it's likely the + # following will fail readily in linkage (hidden symbol `__stop___verbose' + # in conftest is referenced by DSO), but keep the sensible test + # (in-executable symbol is expected to be propagated into the library, + # and to draw the full circle back to the executable through standard -+ # return value passing; ++ # return value passing (respectively no-exec probing to spot the issue); + # -rpath passed because LD_LIBRARY_PATH exporting is unwieldy here); -+ # moreover, "my_var" == 3 assertion above is necessary so that binutils -+ # 2.29.1+ will not slip other parts of the overall is-workaround-needed -+ # harness, as it restored some (but not all) of the original behaviour, -+ # but the workaround is still provably needed ++ # moreover, "my_var" == 3 assertion above (respectively checking if the ++ # boundary symbol visibility differs from DEFAULT in readelf output) is ++ # necessary so that binutils 2.29.1+ will not slip other parts of the ++ # overall is-workaround-needed harness, as it restored some (but not ++ # all) of the original behaviour, but the workaround is still provably ++ # needed + if test "x${gcc_has_attribute_section}" = xyes; then + AC_MSG_CHECKING([whether linker emits global boundary symbols for orphan sections]) -+ LIBS="${LIBS} -L. -l:conftest.so -Wl,-rpath=$(pwd)" -+ AC_TRY_RUN( -+ AC_LANG_PROGRAM( -+ [[#include ++ LIBS="${LIBS} -L. -l:conftest${shrext_cmds} -Wl,-rpath=$(pwd)" + dnl could be turned to AC_TRY_RUN (first assertion is equivalent to + dnl the further check in action-if-true), but that would prevent + dnl cross-building + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include +- extern void * __start___verbose, * __stop___verbose;]], + extern int __start___verbose[], __stop___verbose[]; + int test(void);]], -+ [[static int my_var __attribute__((section("__verbose"))) = 5; + [[static int my_var __attribute__((section("__verbose"))) = 5; +- assert("non-empty data section" + assert("E:non-empty data section" -+ && __start___verbose != __stop___verbose); + && __start___verbose != __stop___verbose); +- assert("no data section value loss" +- && my_var == 5);]] + assert("E:no data section value loss" + && my_var == test() /*5?*/);]] -+ ), -+ [gcc_has_attribute_section_visible=yes], + )], + [# alternatively something like (but requires number parsing): + # readelf -SW "conftest${ac_exeext}" \ +@@ -642,22 +704,78 @@ if test "x${GCC}" = xyes; then + verbose_stop_addr=$(${NM} -g --portability -- "conftest${ac_exeext}" \ + | grep __stop___verbose | cut -d" " -f 3) + test "${verbose_start_addr}" = "${verbose_stop_addr}" \ +- && gcc_has_attribute_section=no \ +- || gcc_has_attribute_section=yes], +- [gcc_has_attribute_section=no] ++ && gcc_has_attribute_section_visible=no \ ++ || { verbose_start_type=$(${READELF} -s backup \ ++ | sed -n '/__start___verbose/{s/^\s*//p;q}' \ ++ | tr -s ' ' \ ++ | cut -d" " -f6) ++ test "${verbose_start_type}" = DEFAULT \ ++ && gcc_has_attribute_section_visible=yes \ ++ || gcc_has_attribute_section_visible=no; }], + [gcc_has_attribute_section_visible=no] -+ ) + ) +- else +- gcc_has_attribute_section=${ac_cv_link_attribute_section} +- fi + AX_RESTORE_FLAGS + AC_MSG_RESULT($gcc_has_attribute_section_visible) -+ rm -f "conftest.so" ++ rm -f "conftest${shrext_cmds}" + + if test "x${gcc_has_attribute_section_visible}" = xno; then + # check if the linker script based workaround is @@ -444,7 +464,13 @@ index 5338352..ac56c4c 100644 + AC_MSG_RESULT([$gcc_has_attribute_section]) + rm -f "conftest.ld" + fi -+ + +- AC_MSG_RESULT($gcc_has_attribute_section) +- if test $gcc_has_attribute_section = yes; then +- AC_DEFINE([QB_HAVE_ATTRIBUTE_SECTION], 1, +- [Enabling code using __attribute__((section))]) +- PACKAGE_FEATURES="$PACKAGE_FEATURES attribute-section" +- AC_SUBST([client_dlopen_LIBS],[$dlopen_LIBS]) + if test "x${gcc_has_attribute_section}" = xyes; then + AC_DEFINE([QB_HAVE_ATTRIBUTE_SECTION], 1, + [Enabling code using __attribute__((section))]) @@ -470,7 +496,7 @@ index 5338352..ac56c4c 100644 # --- ansi --- if test "x${enable_ansi}" = xyes && \ -@@ -728,9 +837,11 @@ AC_CONFIG_FILES([Makefile +@@ -739,9 +857,11 @@ AC_CONFIG_FILES([Makefile docs/Makefile docs/common.dox docs/html.dox @@ -485,7 +511,7 @@ index 5338352..ac56c4c 100644 AC_OUTPUT diff --git a/include/qb/qblog.h b/include/qb/qblog.h -index e71556c..e0890a9 100644 +index a9a9ef2..00adb3a 100644 --- a/include/qb/qblog.h +++ b/include/qb/qblog.h @@ -79,7 +79,10 @@ extern "C" { @@ -552,7 +578,7 @@ index e71556c..e0890a9 100644 assert("non-empty implicit callsite section, otherwise target's \ linkage at fault and logging would not work reliably" \ diff --git a/lib/Makefile.am b/lib/Makefile.am -index 0bebeb5..ff5b3b4 100644 +index 0bebeb5..1572cff 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -19,6 +19,7 @@ @@ -612,15 +638,23 @@ index 0bebeb5..ff5b3b4 100644 AM_LDFLAGS = $(LDFLAGS_COPY:-Bsymbolic-functions=) -@@ -60,6 +100,33 @@ else +@@ -60,9 +100,42 @@ else endif endif +- +-pkgconfigdir = $(libdir)/pkgconfig +-pkgconfig_DATA = libqb.pc +qblog_script.ld: %.ld: %.ld.in + $(AM_V_GEN)$(CPP) -xc -I$(top_srcdir)/include -D_GNU_SOURCE -C -P $< \ + | sed -n "/$$(sed -n '/^[^#]/{s/[*\/]/\\&/g;p;q;}' $<)/,$$ p" \ + > $@ + ++# sadly, there's a distinction between "exec" and "data" install, and it's hard ++# to decouple install-exec-hook below (.pc file is platform-dependent, anyway) ++pkgconfigexecdir = $(libdir)/pkgconfig ++pkgconfigexec_DATA = libqb.pc ++ +# find the libqb.so symlink's target, if so, try to find out, iteratively, +# its gradually shorter forms that likewise symlinks the same target as the +# original libqb.so path, point to that file from the linker script using @@ -639,29 +673,36 @@ index 0bebeb5..ff5b3b4 100644 + test "$${t2_target}" = "$${target}" || break; \ + t1_bn=$${t2_bn}; done; test -n "$${t1_bn}" || \ + { echo "only applicable to SO symlink scheme"; exit 1; }; \ -+ echo "INPUT($${t1_bn})" > "$(DESTDIR)$(libdir)/libqb.so-t" -+ cat $< >> "$(DESTDIR)$(libdir)/libqb.so-t" -+ mv -f "$(DESTDIR)$(libdir)/libqb.so-t" "$(DESTDIR)$(libdir)/libqb.so" ++ echo "$${t1_bn}" > "$(DESTDIR)$(libdir)/libqb.so-t" ++ so_ver=$$(cat "$(DESTDIR)$(libdir)/libqb.so-t"); \ ++ echo "INPUT($${so_ver})" > "$(DESTDIR)$(libdir)/libqb.so-t"; \ ++ cat $< >> "$(DESTDIR)$(libdir)/libqb.so-t"; \ ++ sed -i -- "s/libqb.so./$${so_ver}/" \ ++ "$(DESTDIR)$(libdir)/libqb.so-t" "$(DESTDIR)$(pkgconfigexecdir)/libqb.pc" ++ mv -f "$(DESTDIR)$(libdir)/libqb.so-t" "$(DESTDIR)$(libdir)/libqb.so" +endif - pkgconfigdir = $(libdir)/pkgconfig - pkgconfig_DATA = libqb.pc + if HAVE_SPLINT + check_SCRIPTS = run_splint.sh diff --git a/lib/libqb.pc.in b/lib/libqb.pc.in -index 37d27b7..65d3b8e 100644 +index 37d27b7..d9839bf 100644 --- a/lib/libqb.pc.in +++ b/lib/libqb.pc.in -@@ -8,5 +8,13 @@ Version: @PACKAGE_VERSION@ +@@ -8,5 +8,16 @@ Version: @PACKAGE_VERSION@ Description: libqb Requires: Libs: -L${libdir} -lqb @client_dlopen_LIBS@ +# NOTE: If -lqb not usable for linking (e.g. linker not compatible with +# linker scripts ad-hoc modifying output sections), try recent +# ld.bfd/binutils linker first when available, otherwise you can -+# try "-l:libqb.so." link switch (right available, -+# for example, directly within libqb.so plaintext) that bypasses -+# said linker script -- but beware, logging problems may ensue. -+# That can be partially mitigated with QB_KILL_ATTRIBUTE_SECTION -+# macro defined when compiling, but testing remains a must. ++# try "-l:libqb.so." link switch that bypasses said linker ++# script -- but beware, logging may be less efficient and may lack ++# possible future optimizations and extra features. Consequently, ++# logging issues (typically bound to QB_LOG_INIT_DATA macro) can be ++# mitigated with QB_KILL_ATTRIBUTE_SECTION macro defined for a build. ++# NOTE: when concerned about a warning coming from the build process like ++# warning: [...]libqb.so contains output sections; did you forget -T? ++# and the build finishes OK, take it merely as a harmless side-effect Libs.private: @LIBS@ Cflags: -I${includedir} diff --git a/lib/log.c b/lib/log.c @@ -705,10 +746,10 @@ index 0000000..f262df8 +inherited_linker_flags=-Wl,@abs_builddir@/qblog_script.ld diff --git a/lib/qblog_script.ld.in b/lib/qblog_script.ld.in new file mode 100644 -index 0000000..2ee2da0 +index 0000000..a188ac2 --- /dev/null +++ b/lib/qblog_script.ld.in -@@ -0,0 +1,27 @@ +@@ -0,0 +1,30 @@ +#include +/* GNU ld script + This atypical arrangement enforces global visibility of boundary symbols @@ -721,11 +762,14 @@ index 0000000..2ee2da0 + NOTE: If -lqb not usable for linking (e.g. linker not compatible with + linker scripts ad-hoc modifying output sections), try recent + ld.bfd/binutils linker first when available, otherwise you can -+ try "-l:libqb.so." link switch (right available, -+ for example, directly within libqb.so plaintext) that bypasses -+ said linker script -- but beware, logging problems may ensue. -+ That can be partially mitigated with QB_KILL_ATTRIBUTE_SECTION -+ macro defined when compiling, but testing remains a must. ++ try "-l:libqb.so." link switch that bypasses said linker ++ script -- but beware, logging may be less efficient and may lack ++ possible future optimizations and extra features. Consequently, ++ logging issues (typically bound to QB_LOG_INIT_DATA macro) can be ++ mitigated with QB_KILL_ATTRIBUTE_SECTION macro defined for a build. ++ NOTE: When concerned about a warning coming from the build process like ++ warning: [...]libqb.so contains output sections; did you forget -T? ++ while it finishes OK, consider it merely a harmless side-effect. + */ +SECTIONS { +#ifdef QB_HAVE_ATTRIBUTE_SECTION @@ -744,5 +788,5 @@ index 0000000..f037fca @@ -0,0 +1 @@ +/* this is an empty linker script having a role of a NO-OP link object */ -- -2.14.3 +2.15.0 diff --git a/06-Low-fix-internal-object-symbol-s-leak-expose-run-tim.patch b/06-Low-fix-internal-object-symbol-s-leak-expose-run-tim.patch index 7843b5b..da4742e 100644 --- a/06-Low-fix-internal-object-symbol-s-leak-expose-run-tim.patch +++ b/06-Low-fix-internal-object-symbol-s-leak-expose-run-tim.patch @@ -1,4 +1,4 @@ -From 93ebd97659c51527b0dc4b98ba3e0a9070a1dfea Mon Sep 17 00:00:00 2001 +From 8ae46f6c7a2e9c518fec635b8f7afb1b1dbc710f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Pokorn=C3=BD?= Date: Fri, 6 Oct 2017 17:17:26 +0200 Subject: [PATCH 6/6] Low: fix internal object symbol's leak & expose run-time @@ -56,7 +56,7 @@ index c1852e1..9094dc7 100644 #undef QB_VER_MINOR #undef QB_VER_MICRO diff --git a/include/qb/qblog.h b/include/qb/qblog.h -index e0890a9..14f2a33 100644 +index 00adb3a..059d633 100644 --- a/include/qb/qblog.h +++ b/include/qb/qblog.h @@ -299,9 +299,11 @@ extern struct qb_log_callsite QB_ATTR_SECTION_STOP[]; @@ -97,7 +97,7 @@ index bfce349..b02ce8d 100644 #ifdef __cplusplus } diff --git a/lib/Makefile.am b/lib/Makefile.am -index ff5b3b4..a428975 100644 +index 1572cff..6ca6b15 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -30,7 +30,7 @@ AM_CPPFLAGS = -I$(top_builddir)/include -I$(top_srcdir)/include @@ -193,5 +193,5 @@ index 19fca2c..98df44c 100644 +[MAIN |debug] ../log_client.c:69:hello [libqb|error] log_blackbox.c:196:qb_log_blackbox_print_from_file: -- -2.14.3 +2.15.0 diff --git a/libqb.spec b/libqb.spec index bbe5181..0ca89ac 100644 --- a/libqb.spec +++ b/libqb.spec @@ -2,7 +2,7 @@ Name: libqb Version: 1.0.2 -Release: 13%{?dist} +Release: 14%{?dist} Summary: An IPC library for high performance servers Group: System Environment/Libraries @@ -10,7 +10,7 @@ License: LGPLv2+ URL: https://github.com/ClusterLabs/libqb Source0: https://github.com/ClusterLabs/libqb/releases/download/v%{version}/%{name}-%{version}.tar.xz Patch0: 01-Med-qblog.h-better-explanation-behaviour-of-QB_LOG_I.patch -Patch1: 02-build-configure-run-attribute-section-test-through-r.patch +Patch1: 02-build-configure-check-section-boundary-symbols-prese.patch Patch2: 03-tests-new-sort-of-tests-dubbed-functional-cover-link.patch Patch3: 04-Med-add-extra-run-time-client-libqb-checks-that-logg.patch Patch4: 05-High-bare-fix-for-libqb-logging-not-working-with-ld..patch @@ -62,7 +62,8 @@ rm -rf $RPM_BUILD_ROOT/%{_docdir}/* %package devel Summary: Development files for %{name} Group: Development/Libraries -Requires: %{name} = %{version}-%{release} pkgconfig +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: pkgconfig %description devel The %{name}-devel package contains libraries and header files for @@ -77,6 +78,10 @@ developing applications that use %{name}. %{_mandir}/man3/qb*3* %changelog +* Wed Nov 15 2017 Jan Pokorný - 1.0.2-14 +- Evolution of the previous (rhbz#1478089) +- Make -devel package dependency on the main package arch-qualified + * Tue Oct 31 2017 Jan Pokorný - 1.0.2-13 - Evolution of the previous (rhbz#1478089)