Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 30154431FD2 for ; Sat, 3 Nov 2012 20:24:21 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: 0 X-Spam-Level: X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id qRwXGBUsvogE for ; Sat, 3 Nov 2012 20:24:20 -0700 (PDT) Received: from foo.net (70-36-235-136.dsl.static.sonic.net [70.36.235.136]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 171BF431FAF for ; Sat, 3 Nov 2012 20:24:20 -0700 (PDT) Received: from foo.net (localhost [127.0.0.1]) by foo.net (8.14.5+Sun/8.14.5) with ESMTP id qA43GGa3025693; Sat, 3 Nov 2012 20:16:16 -0700 (PDT) Received: (from blakej@localhost) by foo.net (8.14.5+Sun/8.14.5/Submit) id qA43GGQx025692; Sat, 3 Nov 2012 20:16:16 -0700 (PDT) From: Blake Jones To: notmuch@notmuchmail.org Subject: [PATCH 07/10] gen-version-script: parse Solaris "nm" output (Solaris support) Date: Sat, 3 Nov 2012 20:15:59 -0700 Message-Id: <1351998962-25135-8-git-send-email-blakej@foo.net> X-Mailer: git-send-email 1.7.3.2 In-Reply-To: <1351998962-25135-1-git-send-email-blakej@foo.net> References: <1351998962-25135-1-git-send-email-blakej@foo.net> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0.2 (foo.net [127.0.0.1]); Sat, 03 Nov 2012 20:16:16 -0700 (PDT) X-Mailman-Approved-At: Sun, 04 Nov 2012 01:30:19 -0800 Cc: Blake Jones X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Nov 2012 03:24:21 -0000 The output of "nm" on Solaris is substantially different from that on Linux, and the current version of gen-version-script is tied to the Linux "nm" output. This patch separates the parts of "nm" processing which are dependent on the output format into a couple shell functions, and makes another shell function to use the appropriate version of "c++filt" to demangle symbols. It also modifies lib/Makefile.local to pass the generated symbol table correctly to the Solaris linker. --- lib/Makefile.local | 4 ++++ lib/gen-version-script.sh | 50 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 49 insertions(+), 5 deletions(-) diff --git a/lib/Makefile.local b/lib/Makefile.local index 0c6b258..2068e4a 100644 --- a/lib/Makefile.local +++ b/lib/Makefile.local @@ -30,7 +30,11 @@ LIBRARY_SUFFIX = so LINKER_NAME = libnotmuch.$(LIBRARY_SUFFIX) SONAME = $(LINKER_NAME).$(LIBNOTMUCH_VERSION_MAJOR) LIBNAME = $(SONAME).$(LIBNOTMUCH_VERSION_MINOR).$(LIBNOTMUCH_VERSION_RELEASE) +ifeq ($(PLATFORM),SOLARIS) +LIBRARY_LINK_FLAG = -shared -Wl,-M notmuch.sym -Wl,-soname=$(SONAME) -Wl,--no-undefined -lc +else LIBRARY_LINK_FLAG = -shared -Wl,--version-script=notmuch.sym,-soname=$(SONAME) -Wl,--no-undefined +endif ifeq ($(PLATFORM),OPENBSD) LIBRARY_LINK_FLAG += -lc endif diff --git a/lib/gen-version-script.sh b/lib/gen-version-script.sh index 76670d5..d7d96da 100644 --- a/lib/gen-version-script.sh +++ b/lib/gen-version-script.sh @@ -1,3 +1,4 @@ +#!/bin/sh # we go through a bit of work to get the unmangled names of the # typeinfo symbols because of @@ -11,10 +12,44 @@ fi HEADER=$1 shift +if [ `uname -s` == SunOS ] ; then + # + # Using Solaris "nm", a defined symbol looks like this: + # + # [Index] Value Size Type Bind Other Shndx Name + # [15] | 128| 16|FUNC |GLOB |0 |1 |notmuch_tags_get + # + # and an undefined symbol looks like this: + # + # [Index] Value Size Type Bind Other Shndx Name + # [35] | 0| 0|NOTY |GLOB |0 |UNDEF |notmuch_tags_get + # + find_xapian_error() { + nawk -F'\|' '$7 !~ "UNDEF" && $8 ~ "Xapian.*Error" { print $8 }' + } + find_compat_syms() { + nawk -F'\|' '$7 !~ "UNDEF" && $8 ~ "get(line|delim)" { print $8 ";" }' + } + demangle() { + gc++filt "$@" + } +else + find_xapian_error() { + awk '$1 ~ "^[0-9a-fA-F][0-9a-fA-F]*$" && $3 ~ "Xapian.*Error" {print $3}' + } + find_compat_syms() { + awk '$1 ~ "^[0-9a-fA-F][0-9a-fA-F]*$" && $2 == "T" && $3 ~ "^get(line|delim)$" {print $3 ";"}' + } + demangle() { + c++filt "$@" + } +fi + printf '{\nglobal:\n' -nm $* | awk '$1 ~ "^[0-9a-fA-F][0-9a-fA-F]*$" && $3 ~ "Xapian.*Error" {print $3}' | sort | uniq | \ -while read sym; do - demangled=$(c++filt $sym) + +# Find the typeinfo for "Xapian::*Error"s. +nm $* | find_xapian_error | sort | uniq | while read sym; do + demangled=$(demangle $sym) case $demangled in typeinfo*) printf "\t$sym;\n" @@ -23,6 +58,11 @@ while read sym; do ;; esac done -nm $* | awk '$1 ~ "^[0-9a-fA-F][0-9a-fA-F]*$" && $2 == "T" && $3 ~ "^get(line|delim)$" {print $3 ";"}' -sed -n 's/^[[:space:]]*\(notmuch_[a-z_]*\)[[:space:]]*(.*/ \1;/p' $HEADER + +# Find the "compat" syms that we need to export. +nm $* | find_compat_syms + +# Finally, get the real notmuch symbols. +sed -n 's/^[ ]*\(notmuch_[a-z_]*\)[ ]*(.*/ \1;/p' $HEADER + printf "local: *;\n};\n" -- 1.7.9.2