aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorGravatar David Bremner <bremner@debian.org>2011-07-16 15:59:44 -0300
committerGravatar David Bremner <bremner@debian.org>2011-07-16 22:16:46 -0300
commitfeb22fef2e3f6f1cf1722f00945c580e506df0df (patch)
treeefe0edb202123401e4083070d66a794e0128c5d5 /lib
parent8b310a157c06c826c0ee7f677fbbf9f19e78537b (diff)
libnotmuch: export Xapian typeinfo symbols
The lack of such exporting seems to cause problems catching exceptions, as suggested by http://gcc.gnu.org/wiki/Visibility This manifested in the symbol-hiding test failing when notmuch was compile with gcc 4.4.5. On i386, this further manifested as notmuch new failing to run (crashing with an uncaught exception on first run).
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.local4
-rw-r--r--lib/gen-version-script.sh27
2 files changed, 28 insertions, 3 deletions
diff --git a/lib/Makefile.local b/lib/Makefile.local
index 7e2bc87b..a6076ab5 100644
--- a/lib/Makefile.local
+++ b/lib/Makefile.local
@@ -76,9 +76,7 @@ $(dir)/$(LIBNAME): $(libnotmuch_modules) notmuch.sym
$(call quiet,CXX $(CXXFLAGS)) $(libnotmuch_modules) $(FINAL_LIBNOTMUCH_LDFLAGS) $(LIBRARY_LINK_FLAG) -o $@
notmuch.sym: lib/notmuch.h
- printf "{\nglobal:\n" > notmuch.sym
- sed -n 's/^\s*\(notmuch_[a-z_]*\)\s*(.*/\t\1;/p' $< >> notmuch.sym
- printf "local: *;\n};\n" >> notmuch.sym
+ sh lib/gen-version-script.sh $< $(libnotmuch_modules) > $@
$(dir)/$(SONAME): $(dir)/$(LIBNAME)
ln -sf $(LIBNAME) $@
diff --git a/lib/gen-version-script.sh b/lib/gen-version-script.sh
new file mode 100644
index 00000000..e753eaf5
--- /dev/null
+++ b/lib/gen-version-script.sh
@@ -0,0 +1,27 @@
+
+# we go through a bit of work to get the unmangled names of the
+# typeinfo symbols because of
+# http://sourceware.org/bugzilla/show_bug.cgi?id=10326
+
+if [ $# -lt 2 ]; then
+ echo Usage: $0 header obj1 obj2 obj3
+ exit 1;
+fi
+
+HEADER=$1
+shift
+
+printf '{\nglobal:\n'
+nm --defined $* | awk '$3 ~ "Xapian.*Error" {print $3}' | sort | uniq | \
+while read sym; do
+ demangled=$(c++filt $sym)
+ case $demangled in
+ typeinfo*)
+ printf "\t$sym;\n"
+ ;;
+ *)
+ ;;
+ esac
+done
+sed -n 's/^\s*\(notmuch_[a-z_]*\)\s*(.*/\t\1;/p' $HEADER
+printf "local: *;\n};\n"