From db0d4b71b579a9ce556bb19948ce4c847cc6c129 Mon Sep 17 00:00:00 2001 From: Rainer Orth Date: Wed, 6 Oct 2010 17:01:11 +0000 Subject: re PR libstdc++/45863 (FAIL: libstdc++-abi/abi_check) PR libstdc++/45863 * scripts/extract_symvers: Restore revision 164879. Only use pvs on SunOS. From-SVN: r165055 --- libstdc++-v3/scripts/extract_symvers | 81 +++++++++++++++++++++++++++--------- 1 file changed, 62 insertions(+), 19 deletions(-) (limited to 'libstdc++-v3/scripts') diff --git a/libstdc++-v3/scripts/extract_symvers b/libstdc++-v3/scripts/extract_symvers index f6d4231..7510233 100755 --- a/libstdc++-v3/scripts/extract_symvers +++ b/libstdc++-v3/scripts/extract_symvers @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (C) 2002, 2003, 2009 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2009, 2010 Free Software Foundation, Inc. # # This file is part of the GNU ISO C++ Library. This library is free # software; you can redistribute it and/or modify it under the @@ -26,14 +26,6 @@ fi lib=$1 output=$2 -# GNU binutils, somewhere after version 2.11.2, requires -W/--wide to avoid -# default line truncation. -W is not supported and truncation did not occur -# by default before that point. -readelf="readelf --symbols" -if readelf --help | grep -- --wide > /dev/null; then - readelf="$readelf --wide" -fi - # This avoids weird sorting problems later. LC_ALL=C export LC_ALL @@ -42,16 +34,67 @@ export LANG tmp=extract.$$ -${readelf} ${lib} |\ -sed -e 's/ \[: [A-Fa-f0-9]*\] //' -e '/\.dynsym/,/^$/p;d' |\ -egrep -v ' (LOCAL|UND) ' |\ -awk '{ if ($4 == "FUNC" || $4 == "NOTYPE") - printf "%s:%s\n", $4, $8; - else if ($4 == "OBJECT" || $4 == "TLS") - printf "%s:%s:%s\n", $4, $3, $8; - }' | sort | uniq > $tmp 2>&1 -# else printf "Huh? What is %s?\n", $8; - +case `uname -s` in +SunOS) + # Sun ld doesn't record symbol versions in .dynsym entries and they + # cannot easily be extracted from readelf --versions output, so use pvs + # instead. Linux may have a completely different pvs from LVM2, so only + # do this on SunOS. + # Need to use nawk on Solaris 2 since Solaris 8/9 awk (oawk) cannot handle + # sub. + pvs -dsvo ${lib} | \ + nawk '# Remove colon separator from version field, trailing semicolon. + { + sub (/:$/, "", $3); + sub (/;$/, ""); + } + # Record base version. The [BASE] field was only added in Solaris 11, + # so simply use the first record instead. + NR == 1 { + basever = $3; + next; + } + # Ignore version dependencies. + $4 ~ /\{.*\}/ { + next; + } + NF == 4 { + if ($3 == $4 || $3 == basever) + # Emit versions or symbols bound to base versions as objects. + printf "OBJECT:0:%s\n", $4; + else + # Everything else without a size field is a function. + printf "FUNC:%s@@%s\n", $4, $3; + next; + } + # Emit objects. + NF == 5 { + # Strip parens from object size. + sub (/^\(/, "", $5); + sub (/\)$/, "", $5); + printf "OBJECT:%s:%s@@%s\n", $5, $4, $3; + next; + }' | sort | uniq > $tmp 2>&1 + ;; +*) + # GNU binutils, somewhere after version 2.11.2, requires -W/--wide to + # avoid default line truncation. -W is not supported and truncation did + # not occur by default before that point. + readelf="readelf --symbols" + if readelf --help | grep -- --wide > /dev/null; then + readelf="$readelf --wide" + fi + ${readelf} ${lib} |\ + sed -e 's/ \[: [A-Fa-f0-9]*\] //' -e '/\.dynsym/,/^$/p;d' |\ + egrep -v ' (LOCAL|UND) ' |\ + awk '{ if ($4 == "FUNC" || $4 == "NOTYPE") + printf "%s:%s\n", $4, $8; + else if ($4 == "OBJECT" || $4 == "TLS") + printf "%s:%s:%s\n", $4, $3, $8; + }' | sort | uniq > $tmp 2>&1 +# else printf "Huh? What is %s?\n", $8; + ;; +esac # I think we'll be doing some more with this file, but for now, dump. mv $tmp $output -- cgit v1.1