2002-11-13 Roland McGrath <roland@redhat.com>
authorroland <roland>
Thu, 14 Nov 2002 03:59:36 +0000 (03:59 +0000)
committerroland <roland>
Thu, 14 Nov 2002 03:59:36 +0000 (03:59 +0000)
* scripts/abilist.awk: New file.
* Makefile (distribute): Add it.
* Makerules ($(objpfx)%.dynsym, $(objpfx)%.symlist): New rules.
(tests): Depend on .symlist file for each $(install-lib.so-versioned).
[! subdir] (tests): Depend on libc.symlist.
(generated): Add those files.
* aclocal.m4 (LIBC_PROG_BINUTILS): Check for objdump, set OBJDUMP.
* config.make.in (OBJDUMP): New variable, substituted by configure.

Makefile
Makerules
aclocal.m4
config.make.in
configure
scripts/abilist.awk [new file with mode: 0644]

index 942b285..0358a6c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -278,7 +278,7 @@ distribute  :=      README README.libm INSTALL FAQ FAQ.in NOTES NEWS BUGS   \
                            rellns-sh config.sub config.guess           \
                            mkinstalldirs move-if-change install-sh     \
                            test-installation.pl gen-FAQ.pl versions.awk\
-                           gen-sorted.awk abi-versions.awk             \
+                           gen-sorted.awk abi-versions.awk abilist.awk \
                            firstversions.awk documented.sh cpp)
 
 distribute := $(strip $(distribute))
index 461451f..1fab920 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -1073,6 +1073,28 @@ endif
 
 # The include magic above causes those files to use this variable for flags.
 CPPFLAGS-nonlib = -DNOT_IN_libc=1
+
+
+ifeq ($(versioning),yes)
+# Generate normalized lists of symbols, versions, and data sizes.
+# This is handy for checking against existing library binaries.
+
+$(objpfx)%.symlist: $(..)scripts/abilist.awk $(objpfx)%.dynsym
+       $(AWK) -f $^ > $@T
+       mv -f $@T $@
+
+$(objpfx)%.dynsym: $(objpfx)%.so
+       $(OBJDUMP) --dynamic-syms $< > $@T
+       mv -f $@T $@
+
+tests: $(patsubst %.so,$(objpfx)%.symlist,$(install-lib.so-versioned))
+generated += $(install-lib.so-versioned:.so=.symlist)
+
+ifndef subdir
+tests: $(objpfx)libc.symlist
+generated += libc.symlist
+endif
+endif
 \f
 .PHONY: TAGS
 TAGS: $(objpfx)distinfo $(..)MakeTAGS
index 30ef36d..7395ee8 100644 (file)
@@ -96,6 +96,8 @@ AS=`$CC -print-prog-name=as`
 LD=`$CC -print-prog-name=ld`
 AR=`$CC -print-prog-name=ar`
 AC_SUBST(AR)
+OBJDUMP=`$CC -print-prog-name=objdump`
+AC_SUBST(OBJDUMP)
 
 # ranlib has to be treated a bit differently since it might not exist at all.
 ac_ranlib=`$CC -print-prog-name=ranlib`
index d1f8409..ed0ad41 100644 (file)
@@ -92,6 +92,7 @@ MIG = @MIG@
 PWD_P = @PWD_P@
 BISON = @BISON@
 AUTOCONF = @AUTOCONF@
+OBJDUMP = @OBJDUMP@
 
 # Installation tools.
 INSTALL = @INSTALL@
index d149b94..33737d6 100755 (executable)
--- a/configure
+++ b/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs oldest_abi subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S PWD_P CC MAKE MSGFMT MAKEINFO SED AUTOCONF CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR RANLIB ac_ct_RANLIB MIG AS LD CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc libc_cv_have_initfini no_whole_archive exceptions LIBGD EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS with_fp with_cvs oldest_abi subdirs force_install all_warnings build build_cpu build_vendor build_os host host_cpu host_vendor host_os base_machine sysnames INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S PWD_P CC MAKE MSGFMT MAKEINFO SED AUTOCONF CFLAGS LDFLAGS CPPFLAGS ac_ct_CC OBJEXT BUILD_CC cross_compiling CPP AR OBJDUMP RANLIB ac_ct_RANLIB MIG AS LD CCVERSION SYSINCLUDES libc_cv_gcc_static_libgcc BASH libc_cv_have_bash2 KSH libc_cv_have_ksh AWK PERL INSTALL_INFO OLD_DEBIAN_INSTALL_INFO BISON VERSIONING libc_cv_asm_protected_directive libc_cv_initfinit_array libc_cv_z_nodelete libc_cv_z_nodlopen libc_cv_z_initfirst libc_cv_Bgroup libc_cv_z_combreloc libc_cv_have_initfini no_whole_archive exceptions LIBGD EGREP sizeof_long_double libc_cv_gcc_unwind_find_fde uname_sysname uname_release uname_version old_glibc_headers libc_cv_slibdir libc_cv_localedir libc_cv_sysconfdir libc_cv_rootsbindir use_ldconfig ldd_rewrite_script gnu_ld gnu_as elf xcoff static shared pic_default profile omitfp bounded static_nss nopic_initfini DEFINES linux_doors mach_interface_list VERSION RELEASE LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -3500,6 +3500,8 @@ AS=`$CC -print-prog-name=as`
 LD=`$CC -print-prog-name=ld`
 AR=`$CC -print-prog-name=ar`
 
+OBJDUMP=`$CC -print-prog-name=objdump`
+
 
 # ranlib has to be treated a bit differently since it might not exist at all.
 ac_ranlib=`$CC -print-prog-name=ranlib`
@@ -5001,7 +5003,7 @@ if test "${libc_cv_asm_underscores+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5004 "configure"
+#line 5006 "configure"
 #include "confdefs.h"
 void underscore_test(void) {
 return; }
@@ -5261,7 +5263,7 @@ if test "${libc_cv_gcc_dwarf2_unwind_info+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.c <<EOF
-#line 5264 "configure"
+#line 5266 "configure"
 static char *__EH_FRAME_BEGIN__;
 _start ()
 {
@@ -5360,7 +5362,7 @@ if test "${libc_cv_gcc_builtin_expect+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.c <<EOF
-#line 5363 "configure"
+#line 5365 "configure"
 int foo (int a)
 {
   a = __builtin_expect (a, 10);
@@ -5428,7 +5430,7 @@ if test "${libc_cv_gcc_subtract_local_labels+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.c <<EOF
-#line 5431 "configure"
+#line 5433 "configure"
 int foo (int a)
 {
   static const int ar[] = { &&l1 - &&l1, &&l2 - &&l1 };
@@ -6982,6 +6984,7 @@ s,@BUILD_CC@,$BUILD_CC,;t t
 s,@cross_compiling@,$cross_compiling,;t t
 s,@CPP@,$CPP,;t t
 s,@AR@,$AR,;t t
+s,@OBJDUMP@,$OBJDUMP,;t t
 s,@RANLIB@,$RANLIB,;t t
 s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
 s,@MIG@,$MIG,;t t
diff --git a/scripts/abilist.awk b/scripts/abilist.awk
new file mode 100644 (file)
index 0000000..385e85d
--- /dev/null
@@ -0,0 +1,49 @@
+# This awk script processes the output of objdump --dynamic-syms
+# into a simple format that should not change when the ABI is not changing.
+
+BEGIN { outpipe = "sort" }
+
+# Normalize columns.
+/^[0-9a-fA-F]+      / { sub(/      /, "  -   ") }
+
+# Skip undefineds.
+$4 == "*UND*" { next }
+
+# Skip locals.
+$2 == "l" { next }
+
+$2 == "g" || $2 == "w" && NF == 7 {
+  weak = ($2 == "w") ? "weak" : "strong";
+  type = $3;
+  size = strtonum("0x" $5);
+  version = $6;
+  symbol = $7;
+  gsub(/[()]/, "", version);
+
+  if (version == "GLIBC_PRIVATE") next;
+
+  if (type == "D" && $4 == ".tbss") {
+    print symbol, version, weak, "TLS", size | outpipe;
+  }
+  else if (type == "DO" && $4 == "*ABS*") {
+    print symbol, version, weak, "ABS" | outpipe;
+  }
+  else if (type == "DO") {
+    print symbol, version, weak, "DATA", size | outpipe;
+  }
+  else if (type == "DF") {
+    print symbol, version, weak, "FUNC" | outpipe;
+  }
+  else {
+    print symbol, version, weak, "UNEXPECTED", type, $4, $5;
+  }
+
+  next;
+}
+
+# Header crapola.
+NF == 0 || /DYNAMIC SYMBOL TABLE/ || /file format/ { next }
+
+{
+  print "Don't grok this line:", $0
+}