summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog40
-rw-r--r--Makeconfig2
-rw-r--r--elf/dl-close.c2
-rw-r--r--elf/dl-load.c6
-rw-r--r--elf/dl-open.c2
-rw-r--r--hurd/geteuids.c4
-rw-r--r--include/libc-symbols.h2
-rw-r--r--include/shlib-compat.h2
-rw-r--r--libio/freopen.c2
-rw-r--r--linuxthreads/cancel.c2
-rw-r--r--linuxthreads/pthread.c2
-rw-r--r--linuxthreads/wrapsyscall.c2
-rw-r--r--malloc/malloc.c4
-rw-r--r--nss/nsswitch.c6
-rw-r--r--stdio-common/vfprintf.c6
-rw-r--r--sysdeps/arm/init-first.c4
-rw-r--r--sysdeps/generic/init-first.c4
-rw-r--r--sysdeps/generic/libc-start.c8
-rw-r--r--sysdeps/i386/init-first.c6
-rw-r--r--sysdeps/mips/init-first.c4
-rw-r--r--sysdeps/mips/machine-gmon.h4
-rw-r--r--sysdeps/powerpc/elf/libc-start.c8
-rw-r--r--sysdeps/unix/sysv/linux/alpha/adjtime.c25
-rw-r--r--sysdeps/unix/sysv/linux/alpha/msgctl.c8
-rw-r--r--sysdeps/unix/sysv/linux/alpha/oldglob.c19
-rw-r--r--sysdeps/unix/sysv/linux/alpha/semctl.c7
-rw-r--r--sysdeps/unix/sysv/linux/alpha/shmctl.c7
-rw-r--r--sysdeps/unix/sysv/linux/arm/errlist.c27
-rw-r--r--sysdeps/unix/sysv/linux/arm/siglist.c38
-rw-r--r--sysdeps/unix/sysv/linux/i386/chown.c4
-rw-r--r--sysdeps/unix/sysv/linux/i386/getrlimit.c10
-rw-r--r--sysdeps/unix/sysv/linux/i386/getrlimit64.c9
-rw-r--r--sysdeps/unix/sysv/linux/i386/msgctl.c13
-rw-r--r--sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c7
-rw-r--r--sysdeps/unix/sysv/linux/i386/semctl.c13
-rw-r--r--sysdeps/unix/sysv/linux/i386/setrlimit.c9
-rw-r--r--sysdeps/unix/sysv/linux/i386/shmctl.c13
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c8
-rw-r--r--sysdeps/unix/sysv/linux/msgctl.c13
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/chown.c9
-rw-r--r--sysdeps/unix/sysv/linux/semctl.c15
-rw-r--r--sysdeps/unix/sysv/linux/shmctl.c13
42 files changed, 200 insertions, 189 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d63eb53f0..289ac14f80 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,43 @@
+2000-03-29  Jes Sorensen  <jes@pcatls01.cern.ch>
+
+	* malloc/malloc.c: Declare bit flags UL so that they will not
+	default to int size when being inverted.
+
+2000-03-29  Andreas Jaeger  <aj@suse.de>
+
+	* sysdeps/unix/sysv/linux/arm/errlist.c: Use shlib-compat macros.
+	* sysdeps/unix/sysv/linux/arm/siglist.c: Likewise.
+
+2000-03-29  Andreas Jaeger  <aj@suse.de>,
+            Ralf Baechle <ralf@uni-koblenz.de>
+
+	* Makeconfig: Introduce new variable SHARED to mark code used in
+	the shared library.
+	* elf/dl-close.c: Use it instead of PIC.
+	* elf/dl-load.c: Likewise.
+	* elf/dl-open.c: Likewise.
+	* hurd/geteuids.c: Likewise.
+	* include/libc-symbols.h: Likewise.
+	* include/shlib-compat.h: Likewise.
+	* libio/freopen.c: Likewise.
+	* linuxthreads/cancel.c: Likewise.
+	* linuxthreads/pthread.c: Likewise.
+	* linuxthreads/wrapsyscall.c: Likewise.
+	* nss/nsswitch.c: Likewise.
+	* stdio-common/vfprintf.c: Likewise.
+	* sysdeps/arm/init-first.c: Likewise.
+	* sysdeps/i386/init-first.c: Likewise
+	* sysdeps/generic/init-first.c: Likewise.
+	* sysdeps/generic/libc-start.c: Likewise.
+	* sysdeps/mips/init-first.c: Likewise.
+	* sysdeps/powerpc/elf/libc-start.c: Likewise.
+	* sysdeps/unix/sysv/linux/init-first.c: Likewise.
+	* sysdeps/unix/sysv/linux/arm/siglist.c: Likewise.
+	* sysdeps/unix/sysv/linux/arm/errlist.c: Likewise.
+	* sysdeps/unix/sysv/linux/i386/chown.c: Likewise.
+
+	* sysdeps/mips/machine-gmon.h (asm): Use __PIC__ as check.
+
 2000-03-29  Andreas Jaeger  <aj@suse.de>
 
 	* sysdeps/sparc/sparc64/dl-machine.h (elf_machine_runtime_setup):
diff --git a/Makeconfig b/Makeconfig
index 56b5d3330b..70b933c5ec 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -604,7 +604,7 @@ ifeq (yes,$(build-shared))
 # Under --enable-shared, we will build a shared library of PIC objects.
 # The PIC object files are named foo.os.
 object-suffixes += .os
-CPPFLAGS-.os = -DPIC
+CPPFLAGS-.os = -DPIC -DSHARED
 CFLAGS-.os = $(filter %frame-pointer,$(+cflags)) $(pic-ccflag)
 libtype.os := lib%_pic.a
 # This can be changed by a sysdep makefile
diff --git a/elf/dl-close.c b/elf/dl-close.c
index 7740787a40..a30147976d 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -145,7 +145,7 @@ _dl_close (void *_map)
 		    imap->l_map_end - imap->l_map_start);
 
 	  /* Finally, unlink the data structure and free it.  */
-#ifdef PIC
+#ifdef SHARED
 	  /* We will unlink the first object only if this is a statically
 	     linked program.  */
 	  assert (imap->l_prev != NULL);
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 38922890d6..5d1463b48f 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -516,7 +516,7 @@ _dl_init_paths (const char *llp)
   const char *strp;
   struct r_search_path_elem *pelem, **aelem;
   size_t round_size;
-#ifdef PIC
+#ifdef SHARED
   struct link_map *l;
 #endif
 
@@ -579,7 +579,7 @@ _dl_init_paths (const char *llp)
   max_dirnamelen = SYSTEM_DIRS_MAX_LEN;
   *aelem = NULL;
 
-#ifdef PIC
+#ifdef SHARED
   /* This points to the map of the main object.  */
   l = _dl_loaded;
   if (l != NULL)
@@ -613,7 +613,7 @@ _dl_init_paths (const char *llp)
 	    l->l_rpath_dirs = NULL;
 	}
     }
-#endif	/* PIC */
+#endif	/* SHARED */
 
   if (llp != NULL && *llp != '\0')
     {
diff --git a/elf/dl-open.c b/elf/dl-open.c
index b419219069..f110a512cc 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -166,7 +166,7 @@ dl_open_worker (void *a)
     {
       if (! l->l_relocated)
 	{
-#ifdef PIC
+#ifdef SHARED
 	  if (_dl_profile != NULL)
 	    {
 	      /* If this here is the shared object which we want to profile
diff --git a/hurd/geteuids.c b/hurd/geteuids.c
index e37f9c27c2..0f3f7000ff 100644
--- a/hurd/geteuids.c
+++ b/hurd/geteuids.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 94, 96, 97, 98 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 94, 96, 97, 98, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -64,6 +64,6 @@ geteuids (int n, uid_t *uidset)
 
 /* XXX Remove this alias when we bump the libc soname.  */
 
-#if defined PIC && DO_VERSIONING
+#if defined SHARED && DO_VERSIONING
 weak_alias (geteuids, __getuids)
 #endif
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 8073fca575..f0c7284d73 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -214,7 +214,7 @@
 
 /* These are all done the same way in ELF.
    There is a new section created for each set.  */
-#  ifdef PIC
+#  ifdef SHARED
 /* When building a shared library, make the set section writable,
    because it will need to be relocated at run time anyway.  */
 #   define _elf_set_element(set, symbol) \
diff --git a/include/shlib-compat.h b/include/shlib-compat.h
index a95c1e0806..a1a4d9c15c 100644
--- a/include/shlib-compat.h
+++ b/include/shlib-compat.h
@@ -26,7 +26,7 @@
 #include <abi-versions.h>	/* header generated by abi-versions.awk */
 #endif
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
 
 /* The file abi-versions.h (generated by scripts/abi-versions.awk) defines
    symbols like `ABI_libm_GLIBC_2_0' for each version set in the source
diff --git a/libio/freopen.c b/libio/freopen.c
index 59b1726552..3f1e8f49e0 100644
--- a/libio/freopen.c
+++ b/libio/freopen.c
@@ -26,7 +26,7 @@
 #include "libioP.h"
 #include "stdio.h"
 
-#ifdef PIC
+#ifdef SHARED
 extern void *_IO_stdin_used;
 weak_extern (_IO_stdin_used);
 #endif
diff --git a/linuxthreads/cancel.c b/linuxthreads/cancel.c
index 8fd8c1e60f..e1e887e0f9 100644
--- a/linuxthreads/cancel.c
+++ b/linuxthreads/cancel.c
@@ -162,7 +162,7 @@ void __pthread_perform_cleanup(void)
     c->__routine(c->__arg);
 }
 
-#ifndef PIC
+#ifndef SHARED
 /* We need a hook to force the cancelation wrappers to be linked in when
    static libpthread is used.  */
 extern const int __pthread_provide_wrappers;
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c
index 6ac7bc9170..f8df39db02 100644
--- a/linuxthreads/pthread.c
+++ b/linuxthreads/pthread.c
@@ -871,7 +871,7 @@ void __pthread_message(char * fmt, ...)
 #endif
 
 
-#ifndef PIC
+#ifndef SHARED
 /* We need a hook to force the cancelation wrappers to be linked in when
    static libpthread is used.  */
 extern const int __pthread_provide_wrappers;
diff --git a/linuxthreads/wrapsyscall.c b/linuxthreads/wrapsyscall.c
index a8ab857d8a..7d3f8ac483 100644
--- a/linuxthreads/wrapsyscall.c
+++ b/linuxthreads/wrapsyscall.c
@@ -31,7 +31,7 @@
 #include <sys/socket.h>
 
 
-#ifndef PIC
+#ifndef SHARED
 /* We need a hook to force this file to be linked in when static
    libpthread is used.  */
 const int __pthread_provide_wrappers = 0;
diff --git a/malloc/malloc.c b/malloc/malloc.c
index 645bcbe2dd..f674f4ebfe 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -1317,11 +1317,11 @@ static void      free_atfork();
 
 /* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */
 
-#define PREV_INUSE 0x1
+#define PREV_INUSE 0x1UL
 
 /* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */
 
-#define IS_MMAPPED 0x2
+#define IS_MMAPPED 0x2UL
 
 /* Bits to mask off when extracting size */
 
diff --git a/nss/nsswitch.c b/nss/nsswitch.c
index f1250262ff..b9e283eefb 100644
--- a/nss/nsswitch.c
+++ b/nss/nsswitch.c
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#if !defined DO_STATIC_NSS || defined PIC
+#if !defined DO_STATIC_NSS || defined SHARED
 # include <gnu/lib-names.h>
 #endif
 
@@ -65,7 +65,7 @@ static struct
 
 __libc_lock_define_initialized (static, lock)
 
-#if !defined DO_STATIC_NSS || defined PIC
+#if !defined DO_STATIC_NSS || defined SHARED
 /* String with revision number of the shared object files.  */
 static const char *const __nss_shlib_revision = LIBNSS_FILES_SO + 15;
 #endif
@@ -314,7 +314,7 @@ __nss_lookup_function (service_user *ni, const char *fct_name)
 		}
 	    }
 
-#if !defined DO_STATIC_NSS || defined PIC
+#if !defined DO_STATIC_NSS || defined SHARED
 	  if (ni->library->lib_handle == NULL)
 	    {
 	      /* Load the shared library.  */
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index 51fd3115ee..a3f6754433 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -303,7 +303,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
 
 #define NOT_IN_JUMP_RANGE(Ch) ((Ch) < L_(' ') || (Ch) > L_('z'))
 #define CHAR_CLASS(Ch) (jump_table[(INT_T) (Ch) - L_(' ')])
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined PIC
+#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
   /* 'int' is enough and it saves some space on 64 bit systems.  */
 # define JUMP_TABLE_TYPE const int
 # define JUMP(ChExpr, table)						      \
@@ -1258,7 +1258,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
   /* Process whole format string.  */
   do
     {
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined PIC
+#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
 # define REF(Name) &&do_##Name - &&do_form_unknown
 #else
 # define REF(Name) &&do_##Name
@@ -1648,7 +1648,7 @@ do_positional:
     for (; (size_t) nspecs_done < nspecs; ++nspecs_done)
       {
 #undef REF
-#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined PIC
+#if defined HAVE_SUBTRACT_LOCAL_LABELS && defined SHARED
 # define REF(Name) &&do2_##Name - &&do_form_unknown
 #else
 # define REF(Name) &&do2_##Name
diff --git a/sysdeps/arm/init-first.c b/sysdeps/arm/init-first.c
index 87f9f0a749..1e90c849a1 100644
--- a/sysdeps/arm/init-first.c
+++ b/sysdeps/arm/init-first.c
@@ -39,7 +39,7 @@ init (int *data)
   __getopt_clean_environment (envp);
 }
 
-#ifdef PIC
+#ifdef SHARED
 /* This function is called to initialize the shared C library.
    It is called just before the user _start code from i386/elf/start.S,
    with the stack set up as that code gets it.  */
@@ -63,7 +63,7 @@ _init (int argc, ...)
 void
 __libc_init_first (int argc __attribute__ ((unused)), ...)
 {
-#ifndef PIC
+#ifndef SHARED
   init (&argc);
 #endif
 }
diff --git a/sysdeps/generic/init-first.c b/sysdeps/generic/init-first.c
index 76989d1351..2d7a078c43 100644
--- a/sysdeps/generic/init-first.c
+++ b/sysdeps/generic/init-first.c
@@ -25,14 +25,14 @@ int __libc_multiple_libcs = 1;
 extern void __libc_init (int, char **, char **);
 extern void __getopt_clean_environment (char **);
 
-#ifdef PIC
+#ifdef SHARED
 void
 __libc_init_first (void)
 {
 }
 #endif
 
-#ifdef PIC
+#ifdef SHARED
 /* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT
    pointer in the dynamic section based solely on that.  It is convention
    for this function to be in the `.init' section, but the symbol name is
diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c
index e3960ca818..6fabb7c41c 100644
--- a/sysdeps/generic/libc-start.c
+++ b/sysdeps/generic/libc-start.c
@@ -39,7 +39,7 @@ __libc_start_main (int (*main) (int, char **, char **), int argc,
 		   char **argv, void (*init) (void), void (*fini) (void),
 		   void (*rtld_fini) (void), void *stack_end)
 {
-#ifndef PIC
+#ifndef SHARED
   /* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
      If the address would be taken inside the expression the optimizer
      would try to be too smart and throws it away.  Grrr.  */
@@ -66,7 +66,7 @@ __libc_start_main (int (*main) (int, char **, char **), int argc,
   /* Call the initializer of the libc.  This is only needed here if we
      are compiling for the static library in which case we haven't
      run the constructors in `_dl_start_user'.  */
-#ifndef PIC
+#ifndef SHARED
   __libc_init_first (argc, argv, __environ);
 #endif
 
@@ -75,14 +75,14 @@ __libc_start_main (int (*main) (int, char **, char **), int argc,
     atexit (fini);
 
   /* Call the initializer of the program, if any.  */
-#ifdef PIC
+#ifdef SHARED
   if (_dl_debug_impcalls)
     _dl_debug_message (1, "\ninitialize program: ", argv[0], "\n\n", NULL);
 #endif
   if (init)
     (*init) ();
 
-#ifdef PIC
+#ifdef SHARED
   if (_dl_debug_impcalls)
     _dl_debug_message (1, "\ntransferring control: ", argv[0], "\n\n", NULL);
 #endif
diff --git a/sysdeps/i386/init-first.c b/sysdeps/i386/init-first.c
index 118f84201f..1ed8495cbe 100644
--- a/sysdeps/i386/init-first.c
+++ b/sysdeps/i386/init-first.c
@@ -1,5 +1,5 @@
 /* Initialization code run first thing by the ELF startup code.  For i386/Unix.
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -39,7 +39,7 @@ init (int *data)
   __getopt_clean_environment (envp);
 }
 
-#ifdef PIC
+#ifdef SHARED
 /* This function is called to initialize the shared C library.
    It is called just before the user _start code from i386/elf/start.S,
    with the stack set up as that code gets it.  */
@@ -63,7 +63,7 @@ _init (int argc, ...)
 void
 __libc_init_first (int argc __attribute__ ((unused)), ...)
 {
-#ifndef PIC
+#ifndef SHARED
   init (&argc);
 #endif
 }
diff --git a/sysdeps/mips/init-first.c b/sysdeps/mips/init-first.c
index 3fc4b7bc04..309ff8bcf1 100644
--- a/sysdeps/mips/init-first.c
+++ b/sysdeps/mips/init-first.c
@@ -34,7 +34,7 @@ init (int *data)
   __libc_init (argc, argv, envp);
 }
 
-#ifdef PIC
+#ifdef SHARED
 /* This function is called to initialize the shared C library.
    It is called just before the user _start code from mips/elf/start.S,
    with the stack set up as that code gets it.  */
@@ -58,7 +58,7 @@ _init (int argc, ...)
 void
 __libc_init_first (int argc __attribute__ ((unused)), ...)
 {
-#ifndef PIC
+#ifndef SHARED
   init (&argc);
 #endif
 }
diff --git a/sysdeps/mips/machine-gmon.h b/sysdeps/mips/machine-gmon.h
index a01b1746f4..8b35a9194d 100644
--- a/sysdeps/mips/machine-gmon.h
+++ b/sysdeps/mips/machine-gmon.h
@@ -1,5 +1,5 @@
 /* Machine-specific calling sequence for `mcount' profiling function.  MIPS
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,7 +21,7 @@
 
 /* Call __mcount with our the return PC for our caller,
    and the return PC our caller will return to.  */
-#ifdef PIC
+#ifdef __PIC__
 #define CPLOAD ".cpload $25;"
 #else
 #define CPLOAD
diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c
index 01d695bd93..31b3d050be 100644
--- a/sysdeps/powerpc/elf/libc-start.c
+++ b/sysdeps/powerpc/elf/libc-start.c
@@ -41,7 +41,7 @@ __libc_start_main (int argc, char **argv, char **envp,
 		   struct startup_info *stinfo,
 		   char **stack_on_entry)
 {
-#ifndef PIC
+#ifndef SHARED
   /* The next variable is only here to work around a bug in gcc <= 2.7.2.2.
      If the address would be taken inside the expression the optimizer
      would try to be too smart and throws it away.  Grrr.  */
@@ -80,7 +80,7 @@ __libc_start_main (int argc, char **argv, char **envp,
     atexit (rtld_fini);
 
   /* Call the initializer of the libc.  */
-#ifdef PIC
+#ifdef SHARED
   if (_dl_debug_impcalls)
     _dl_debug_message (1, "\ninitialize libc\n\n", NULL);
 #endif
@@ -91,14 +91,14 @@ __libc_start_main (int argc, char **argv, char **envp,
     atexit (stinfo->fini);
 
   /* Call the initializer of the program, if any.  */
-#ifdef PIC
+#ifdef SHARED
   if (_dl_debug_impcalls)
     _dl_debug_message (1, "\ninitialize program: ", argv[0], "\n\n", NULL);
 #endif
   if (stinfo->init)
     stinfo->init (argc, argv, __environ, auxvec);
 
-#ifdef PIC
+#ifdef SHARED
   if (_dl_debug_impcalls)
     _dl_debug_message (1, "\ntransferring control: ", argv[0], "\n\n", NULL);
 #endif
diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c
index b695ece380..63cc66daf2 100644
--- a/sysdeps/unix/sysv/linux/alpha/adjtime.c
+++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,6 +16,8 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <shlib-compat.h>
+
 struct timeval32
 {
     int tv_sec, tv_usec;
@@ -54,7 +56,7 @@ struct timex32 {
 #define TIMEX		timex32
 #define ADJTIME		__adjtime_tv32
 #define ADJTIMEX(x)	__adjtimex_tv32 (x)
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 #define LINKAGE
 #else
 #define LINKAGE		static
@@ -65,8 +67,8 @@ extern int ADJTIMEX (struct TIMEX *);
 
 #include <sysdeps/unix/sysv/linux/adjtime.c>
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
-symbol_version (__adjtime_tv32, adjtime, GLIBC_2.0);
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
+compat_symbol (libc, __adjtime_tv32, adjtime, GLIBC_2.0);
 #endif
 
 #undef TIMEVAL
@@ -117,11 +119,7 @@ __adjtime (itv, otv)
   return ret;
 }
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
-default_symbol_version (__adjtime, adjtime, GLIBC_2.1);
-#else
-weak_alias (__adjtime, adjtime);
-#endif
+versioned_symbol (libc, __adjtime, adjtime, GLIBC_2_1);
 
 extern int __syscall_adjtimex_tv64 (struct timex *tx);
 
@@ -191,11 +189,6 @@ __adjtimex_tv64 (struct timex *tx)
   return ret;
 }
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
 strong_alias (__adjtimex_tv64, __adjtimex_tv64p);
-default_symbol_version (__adjtimex_tv64, __adjtimex, GLIBC_2.1);
-default_symbol_version (__adjtimex_tv64p, adjtimex, GLIBC_2.1);
-#else
-weak_alias (__adjtimex_tv64, __adjtimex);
-weak_alias (__adjtimex_tv64, adjtimex);
-#endif
+versioned_symbol (libc, __adjtimex_tv64, __adjtimex, GLIBC_2_1);
+versioned_symbol (libc, __adjtimex_tv64p, adjtimex, GLIBC_2_1);
diff --git a/sysdeps/unix/sysv/linux/alpha/msgctl.c b/sysdeps/unix/sysv/linux/alpha/msgctl.c
index 93a9bf2618..693b4d4c2d 100644
--- a/sysdeps/unix/sysv/linux/alpha/msgctl.c
+++ b/sysdeps/unix/sysv/linux/alpha/msgctl.c
@@ -116,8 +116,6 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_msgctl, msgctl, GLIBC_2.2);
-#else
-weak_alias (__new_msgctl, msgctl);
-#endif
+#include <shlib-compat.h>
+versioned_symbol (libc, __new_msgctl, msgctl, GLIBC_2_2);
+
diff --git a/sysdeps/unix/sysv/linux/alpha/oldglob.c b/sysdeps/unix/sysv/linux/alpha/oldglob.c
index f405fbf2bc..d85c50e769 100644
--- a/sysdeps/unix/sysv/linux/alpha/oldglob.c
+++ b/sysdeps/unix/sysv/linux/alpha/oldglob.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
 
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -19,8 +19,9 @@
    became necessary since the glob_t structure changed.  */
 #include <sys/types.h>
 #include <glob.h>
+#include <shlib-compat.h>
 
-#if defined PIC && DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 
 /* This is the old structure.  The difference is that the gl_pathc and
    gl_offs elements have type `int'.  */
@@ -33,11 +34,11 @@ typedef struct
 
     /* If the GLOB_ALTDIRFUNC flag is set, the following functions
        are used instead of the normal file access functions.  */
-    void (*gl_closedir) __P ((void *));
-    struct dirent *(*gl_readdir) __P ((void *));
-    __ptr_t (*gl_opendir) __P ((__const char *));
-    int (*gl_lstat) __P ((__const char *, struct stat *));
-    int (*gl_stat) __P ((__const char *, struct stat *));
+    void (*gl_closedir) (void *);
+    struct dirent *(*gl_readdir) (void *);
+    __ptr_t (*gl_opendir) (__const char *);
+    int (*gl_lstat) (__const char *, struct stat *);
+    int (*gl_stat) (__const char *, struct stat *);
   } old_glob_t;
 
 
@@ -75,7 +76,7 @@ __old_glob (const char *pattern, int flags,
 
   return result;
 }
-symbol_version(__old_glob, glob, GLIBC_2.0);
+compat_symbol (libc, __old_glob, glob, GLIBC_2_0);
 
 
 /* Free storage allocated in PGLOB by a previous `glob' call.  */
@@ -90,6 +91,6 @@ __old_globfree (old_glob_t *pglob)
 
   globfree (&correct);
 }
-symbol_version(__old_globfree, globfree, GLIBC_2.0);
+compat_symbol (libc, __old_globfree, globfree, GLIBC_2_0);
 
 #endif
diff --git a/sysdeps/unix/sysv/linux/alpha/semctl.c b/sysdeps/unix/sysv/linux/alpha/semctl.c
index 6281e44993..a4534744d3 100644
--- a/sysdeps/unix/sysv/linux/alpha/semctl.c
+++ b/sysdeps/unix/sysv/linux/alpha/semctl.c
@@ -125,8 +125,5 @@ __new_semctl (int semid, int semnum, int cmd, ...)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_semctl, semctl, GLIBC_2.2);
-#else
-weak_alias (__new_semctl, semctl);
-#endif
+#include <shlib-compat.h>
+versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/alpha/shmctl.c b/sysdeps/unix/sysv/linux/alpha/shmctl.c
index 162afeee3d..ebda160d32 100644
--- a/sysdeps/unix/sysv/linux/alpha/shmctl.c
+++ b/sysdeps/unix/sysv/linux/alpha/shmctl.c
@@ -130,8 +130,5 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_shmctl, shmctl, GLIBC_2.2);
-#else
-weak_alias (__new_shmctl, shmctl);
-#endif
+#include <shlib-compat.h>
+versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/arm/errlist.c b/sysdeps/unix/sysv/linux/arm/errlist.c
index e249522514..c72ecd86fd 100644
--- a/sysdeps/unix/sysv/linux/arm/errlist.c
+++ b/sysdeps/unix/sysv/linux/arm/errlist.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -18,18 +18,18 @@
 
 #include <sizes.h>
 #include <errlist.h>
+#include <shlib-compat.h>
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
-
-# define SYS_ERRLIST __new_sys_errlist
-# define SYS_NERR __new_sys_nerr
+#define SYS_ERRLIST __new_sys_errlist
+#define SYS_NERR __new_sys_nerr
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 asm (".data; .globl __old_sys_errlist;  __old_sys_errlist:");
 #endif
 
 #include <sysdeps/gnu/errlist.c>
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 asm (".type __old_sys_errlist,%object;.size __old_sys_errlist,"
      OLD_ERRLIST_SIZE_STR "*" PTR_SIZE_STR);
 
@@ -44,12 +44,11 @@ symbol_version (_old_sys_nerr, sys_nerr, GLIBC_2.0);
 weak_alias (__old_sys_errlist, _old_sys_errlist);
 symbol_version (__old_sys_errlist, _sys_errlist, GLIBC_2.0);
 symbol_version (_old_sys_errlist, sys_errlist, GLIBC_2.0);
-
-weak_alias (__new_sys_nerr, _new_sys_nerr)
-default_symbol_version (__new_sys_nerr, _sys_nerr, GLIBC_2.1);
-default_symbol_version (_new_sys_nerr, sys_nerr, GLIBC_2.1);
-weak_alias (__new_sys_errlist, _new_sys_errlist)
-default_symbol_version (__new_sys_errlist, _sys_errlist, GLIBC_2.1);
-default_symbol_version (_new_sys_errlist, sys_errlist, GLIBC_2.1);
-
 #endif
+
+strong_alias (__new_sys_nerr, _new_sys_nerr)
+versioned_symbol (libc, __new_sys_nerr, _sys_nerr, GLIBC_2_1);
+versioned_symbol (libc, _new_sys_nerr, sys_nerr, GLIBC_2_1);
+strong_alias (__new_sys_errlist, _new_sys_errlist)
+versioned_symbol (libc, __new_sys_errlist, _sys_errlist, GLIBC_2_1);
+versioned_symbol (libc, _new_sys_errlist, sys_errlist, GLIBC_2_1);
diff --git a/sysdeps/unix/sysv/linux/arm/siglist.c b/sysdeps/unix/sysv/linux/arm/siglist.c
index 5d3a9afc53..3d7464e3e4 100644
--- a/sysdeps/unix/sysv/linux/arm/siglist.c
+++ b/sysdeps/unix/sysv/linux/arm/siglist.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -20,41 +20,34 @@
 #include <signal.h>
 #include <sizes.h>
 #include <libintl.h>
+#include <shlib-compat.h>
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
-# define SYS_SIGLIST	__new_sys_siglist
-# define SYS_SIGABBREV	__new_sys_sigabbrev
-#else
-# define SYS_SIGLIST	_sys_siglist
-# define SYS_SIGABBREV	_sys_sigabbrev
-#endif
-
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 asm (".data; .globl __old_sys_siglist;  __old_sys_siglist:");
 #endif
 
-const char *const SYS_SIGLIST[NSIG] =
+const char *const __new_sys_siglist[NSIG] =
 {
 #define init_sig(sig, abbrev, desc)   [sig] desc,
 #include "siglist.h"
 #undef init_sig
 };
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 asm (".type __old_sys_siglist,%object;.size __old_sys_siglist,"
         OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
 
 asm (".data; .globl __old_sys_sigabbrev;  __old_sys_sigabbrev:");
 #endif
 
-const char *const SYS_SIGABBREV[NSIG] =
+const char *const __new_sys_sigabbrev[NSIG] =
 {
 #define init_sig(sig, abbrev, desc)   [sig] abbrev,
 #include "siglist.h"
 #undef init_sig
 };
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
 asm (".type __old_sys_sigabbrev,%object;.size __old_sys_sigabbrev,"
         OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
 
@@ -62,15 +55,12 @@ extern const char *const *__old_sys_siglist;
 extern const char *const *__old_sys_sigabbrev;
 
 strong_alias (__old_sys_siglist, _old_sys_siglist)
-symbol_version (__old_sys_siglist, _sys_siglist, GLIBC_2.0);
-symbol_version (_old_sys_siglist, sys_siglist, GLIBC_2.0);
-symbol_version (__old_sys_sigabbrev, sys_sigabbrev, GLIBC_2.0);
+compat_symbol (libc, __old_sys_siglist, _sys_siglist, GLIBC_2_0);
+compat_symbol (libc, _old_sys_siglist, sys_siglist, GLIBC_2_0);
+compat_symbol (libc, __old_sys_sigabbrev, sys_sigabbrev, GLIBC_2_0);
+#endif
 
 strong_alias (__new_sys_siglist, _new_sys_siglist)
-default_symbol_version (__new_sys_siglist, _sys_siglist, GLIBC_2.1);
-default_symbol_version (_new_sys_siglist, sys_siglist, GLIBC_2.1);
-default_symbol_version (__new_sys_sigabbrev, sys_sigabbrev, GLIBC_2.1);
-#else
-weak_alias (_sys_siglist, sys_siglist)
-weak_alias (_sys_sigabbrev, sys_sigabbrev)
-#endif
+versioned_symbol (libc, __new_sys_siglist, _sys_siglist, GLIBC_2_1);
+versioned_symbol (libc, _new_sys_siglist, sys_siglist, GLIBC_2_1);
+versioned_symbol (libc, __new_sys_sigabbrev, sys_sigabbrev, GLIBC_2_1);
diff --git a/sysdeps/unix/sysv/linux/i386/chown.c b/sysdeps/unix/sysv/linux/i386/chown.c
index f6442a4ab6..5adeefb0ab 100644
--- a/sysdeps/unix/sysv/linux/i386/chown.c
+++ b/sysdeps/unix/sysv/linux/i386/chown.c
@@ -132,7 +132,7 @@ __chown_is_lchown (const char *file, uid_t owner, gid_t group)
 {
   return INLINE_SYSCALL (chown, 3, file, owner, group);
 }
-#elif defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#elif defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
 /* Compiling for compatibiity.  */
 int
 __chown_is_lchown (const char *file, uid_t owner, gid_t group)
@@ -141,7 +141,7 @@ __chown_is_lchown (const char *file, uid_t owner, gid_t group)
 }
 #endif
 
-#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+#if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING
 strong_alias (__chown_is_lchown, _chown_is_lchown)
 symbol_version (__chown_is_lchown, __chown, GLIBC_2.0);
 symbol_version (_chown_is_lchown, chown, GLIBC_2.0);
diff --git a/sysdeps/unix/sysv/linux/i386/getrlimit.c b/sysdeps/unix/sysv/linux/i386/getrlimit.c
index 4fae122038..c1af81b312 100644
--- a/sysdeps/unix/sysv/linux/i386/getrlimit.c
+++ b/sysdeps/unix/sysv/linux/i386/getrlimit.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,7 +21,7 @@
 
 #include <sysdep.h>
 #include <sys/syscall.h>
-
+#include <shlib-compat.h>
 #include "kernel-features.h"
 
 extern int __syscall_ugetrlimit (unsigned int resource,
@@ -77,8 +77,4 @@ __new_getrlimit (enum __rlimit_resource resource, struct rlimit *rlimits)
 }
 
 weak_alias (__new_getrlimit, __getrlimit);
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_getrlimit, getrlimit, GLIBC_2.2);
-#else
-weak_alias (__new_getrlimit, getrlimit);
-#endif
+versioned_symbol (libc, __new_getrlimit, getrlimit, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/i386/getrlimit64.c b/sysdeps/unix/sysv/linux/i386/getrlimit64.c
index 8e7c9c6c1e..9c4605fd43 100644
--- a/sysdeps/unix/sysv/linux/i386/getrlimit64.c
+++ b/sysdeps/unix/sysv/linux/i386/getrlimit64.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -21,8 +21,5 @@
 #include <sysdeps/generic/getrlimit64.c>
 
 #undef getrlimit64
-#if defined PIC && defined DO_VERSIONING
-default_symbol_version (__new_getrlimit64, getrlimit64, GLIBC_2.2);
-#else
-weak_alias (__new_getrlimit64, getrlimit64);
-#endif
+#include <shlib-compat.h>
+versioned_symbol (libc, __new_getrlimit64, getrlimit64, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/i386/msgctl.c b/sysdeps/unix/sysv/linux/i386/msgctl.c
index 07b5d0d720..684365a922 100644
--- a/sysdeps/unix/sysv/linux/i386/msgctl.c
+++ b/sysdeps/unix/sysv/linux/i386/msgctl.c
@@ -26,6 +26,7 @@
 #include <sys/syscall.h>
 
 #include "kernel-features.h"
+#include <shlib-compat.h>
 
 struct __old_msqid_ds
 {
@@ -46,7 +47,9 @@ struct __old_msqid_ds
 
 /* Allows to control internal state and destruction of message queue
    objects.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int __old_msgctl (int, int, struct __old_msqid_ds *);
+#endif
 int __new_msgctl (int, int, struct msqid_ds *);
 
 #ifdef __NR_getuid32
@@ -57,11 +60,14 @@ extern int __libc_missing_32bit_uids;
 # endif
 #endif
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf)
 {
   return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl, msqid, cmd, 0, buf);
 }
+compat_symbol (libc, __old_msgctl, msgctl, GLIBC_2_0);
+#endif
 
 int
 __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
@@ -143,9 +149,4 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_msgctl, msgctl, GLIBC_2.2);
-symbol_version (__old_msgctl, msgctl, GLIBC_2.0);
-#else
-weak_alias (__new_msgctl, msgctl);
-#endif
+versioned_symbol (libc, __new_msgctl, msgctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c b/sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c
index e77486494f..2f8a365d3e 100644
--- a/sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c
+++ b/sysdeps/unix/sysv/linux/i386/oldgetrlimit64.c
@@ -18,7 +18,8 @@
 
 /* This is a compatibility file.  If we don't build the libc with
    versioning don't compile this file.  */
-#if defined PIC && DO_VERSIONING
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
 
 #include <errno.h>
 #include <sys/resource.h>
@@ -48,6 +49,6 @@ __old_getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits)
   return 0;
 }
 
-symbol_version (__old_getrlimit64, getrlimit64, GLIBC_2.1);
+compat_symbol (libc, __old_getrlimit64, getrlimit64, GLIBC_2_1);
 
-#endif /* PIC && DO_VERSIONING */
+#endif /* SHLIB_COMPAT */
diff --git a/sysdeps/unix/sysv/linux/i386/semctl.c b/sysdeps/unix/sysv/linux/i386/semctl.c
index 6eb64b3a64..b553c2aa8b 100644
--- a/sysdeps/unix/sysv/linux/i386/semctl.c
+++ b/sysdeps/unix/sysv/linux/i386/semctl.c
@@ -27,6 +27,7 @@
 #include <sys/syscall.h>
 
 #include "kernel-features.h"
+#include <shlib-compat.h>
 
 struct __old_semid_ds
 {
@@ -59,9 +60,12 @@ extern int __libc_missing_32bit_uids;
 
 /* Return identifier for array of NSEMS semaphores associated with
    KEY.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int __old_semctl (int semid, int semnum, int cmd, ...);
+#endif
 int __new_semctl (int semid, int semnum, int cmd, ...);
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_semctl (int semid, int semnum, int cmd, ...)
 {
@@ -77,6 +81,8 @@ __old_semctl (int semid, int semnum, int cmd, ...)
 
   return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd, &arg);
 }
+compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#endif
 
 int
 __new_semctl (int semid, int semnum, int cmd, ...)
@@ -165,9 +171,4 @@ __new_semctl (int semid, int semnum, int cmd, ...)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_semctl, semctl, GLIBC_2.2);
-symbol_version (__old_semctl, semctl, GLIBC_2.0);
-#else
-weak_alias (__new_semctl, semctl);
-#endif
+versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/i386/setrlimit.c b/sysdeps/unix/sysv/linux/i386/setrlimit.c
index f9fd23ef54..5ceae60eb1 100644
--- a/sysdeps/unix/sysv/linux/i386/setrlimit.c
+++ b/sysdeps/unix/sysv/linux/i386/setrlimit.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -24,6 +24,7 @@
 #include <sys/syscall.h>
 
 #include "kernel-features.h"
+#include <shlib-compat.h>
 
 extern int __syscall_setrlimit (unsigned int resource,
 				const struct rlimit *rlimits);
@@ -75,8 +76,4 @@ __new_setrlimit (enum __rlimit_resource resource, const struct rlimit *rlimits)
 }
 
 weak_alias (__new_setrlimit, __setrlimit);
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_setrlimit, setrlimit, GLIBC_2.2);
-#else
-weak_alias (__new_setrlimit, setrlimit);
-#endif
+versioned_symbol (libc, __new_setrlimit, setrlimit, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/i386/shmctl.c b/sysdeps/unix/sysv/linux/i386/shmctl.c
index 957416113b..ca25ff0c7a 100644
--- a/sysdeps/unix/sysv/linux/i386/shmctl.c
+++ b/sysdeps/unix/sysv/linux/i386/shmctl.c
@@ -27,6 +27,7 @@
 #include <bits/wordsize.h>
 
 #include "kernel-features.h"
+#include <shlib-compat.h>
 
 struct __old_shmid_ds
 {
@@ -61,14 +62,19 @@ extern int __libc_missing_32bit_uids;
 #endif
 
 /* Provide operations to control over shared memory segments.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int __old_shmctl (int, int, struct __old_shmid_ds *);
+#endif
 int __new_shmctl (int, int, struct shmid_ds *);
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf)
 {
   return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, cmd, 0, buf);
 }
+compat_symbol (libc, __old_shmctl, shmctl, GLIBC_2_0);
+#endif
 
 int
 __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
@@ -163,9 +169,4 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_shmctl, shmctl, GLIBC_2.2);
-symbol_version (__old_shmctl, shmctl, GLIBC_2.0);
-#else
-weak_alias (__new_shmctl, shmctl);
-#endif
+versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c
index a04234864d..94d2749be7 100644
--- a/sysdeps/unix/sysv/linux/init-first.c
+++ b/sysdeps/unix/sysv/linux/init-first.c
@@ -128,7 +128,7 @@ init (int argc, char **argv, char **envp)
       /* Set the FPU control word to the proper default value if the
 	 kernel would use a different value.  (In a static program we
 	 don't have this information.)  */
-#ifdef PIC
+#ifdef SHARED
       if (__fpu_control != _dl_fpu_control)
 #endif
 	__setfpucw (__fpu_control);
@@ -139,7 +139,7 @@ init (int argc, char **argv, char **envp)
   __libc_argv = argv;
   __environ = envp;
 
-#ifndef PIC
+#ifndef SHARED
   __libc_init_secure ();
 #endif
 
@@ -148,12 +148,12 @@ init (int argc, char **argv, char **envp)
   /* This is a hack to make the special getopt in GNU libc working.  */
   __getopt_clean_environment (envp);
 
-#ifdef PIC
+#ifdef SHARED
   __libc_global_ctors ();
 #endif
 }
 
-#ifdef PIC
+#ifdef SHARED
 
 strong_alias (init, _init);
 
diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c
index c1983c6691..2b2b411af0 100644
--- a/sysdeps/unix/sysv/linux/msgctl.c
+++ b/sysdeps/unix/sysv/linux/msgctl.c
@@ -24,6 +24,7 @@
 #include <sysdep.h>
 #include <string.h>
 #include <sys/syscall.h>
+#include <shlib-compat.h>
 
 #include "kernel-features.h"
 
@@ -46,14 +47,19 @@ struct __old_msqid_ds
 
 /* Allows to control internal state and destruction of message queue
    objects.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int __old_msgctl (int, int, struct __old_msqid_ds *);
+#endif
 int __new_msgctl (int, int, struct msqid_ds *);
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf)
 {
   return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl, msqid, cmd, 0, buf);
 }
+compat_symbol (libc, __old_msgctl, msgctl, GLIBC_2_0);
+#endif
 
 int
 __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
@@ -120,9 +126,4 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_msgctl, msgctl, GLIBC_2.2);
-symbol_version (__old_msgctl, msgctl, GLIBC_2.0);
-#else
-weak_alias (__new_msgctl, msgctl);
-#endif
+versioned_symbol (libc, __new_msgctl, msgctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/powerpc/chown.c b/sysdeps/unix/sysv/linux/powerpc/chown.c
index 5f6c3d29ce..9adbaee6bc 100644
--- a/sysdeps/unix/sysv/linux/powerpc/chown.c
+++ b/sysdeps/unix/sysv/linux/powerpc/chown.c
@@ -1,5 +1,5 @@
 /* chown() compatibility.
-   Copyright (C) 1998 Free Software Foundation, Inc.
+   Copyright (C) 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -124,8 +124,5 @@ __chown (const char *file, uid_t owner, gid_t group)
    return -1;
 }
 
-#if defined PIC && defined DO_VERSIONING
-default_symbol_version (__chown, chown, GLIBC_2.1);
-#else
-weak_alias (__chown, chown)
-#endif
+#include <shlib-compat.h>
+versioned_symbol (libc, __chown, chown, GLIBC_2_1);
diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c
index 5b28861244..cc8a5387e1 100644
--- a/sysdeps/unix/sysv/linux/semctl.c
+++ b/sysdeps/unix/sysv/linux/semctl.c
@@ -25,9 +25,11 @@
 #include <sysdep.h>
 #include <string.h>
 #include <sys/syscall.h>
+#include <shlib-compat.h>
 
 #include "kernel-features.h"
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 struct __old_semid_ds
 {
   struct __old_ipc_perm sem_perm;	/* operation permission struct */
@@ -39,6 +41,7 @@ struct __old_semid_ds
   struct sem_undo *__undo;		/* ondo requests on this array */
   unsigned short int sem_nsems;		/* number of semaphores in set */
 };
+#endif
 
 /* Define a `union semun' suitable for Linux here.  */
 union semun
@@ -52,9 +55,12 @@ union semun
 
 /* Return identifier for array of NSEMS semaphores associated with
    KEY.  */
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int __old_semctl (int semid, int semnum, int cmd, ...);
+#endif
 int __new_semctl (int semid, int semnum, int cmd, ...);
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_semctl (int semid, int semnum, int cmd, ...)
 {
@@ -70,6 +76,8 @@ __old_semctl (int semid, int semnum, int cmd, ...)
 
   return INLINE_SYSCALL (ipc, 5, IPCOP_semctl, semid, semnum, cmd, &arg);
 }
+compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
+#endif
 
 int
 __new_semctl (int semid, int semnum, int cmd, ...)
@@ -142,9 +150,4 @@ __new_semctl (int semid, int semnum, int cmd, ...)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_semctl, semctl, GLIBC_2.2);
-symbol_version (__old_semctl, semctl, GLIBC_2.0);
-#else
-weak_alias (__new_semctl, semctl);
-#endif
+versioned_symbol (libc, __new_semctl, semctl, GLIBC_2_2);
diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c
index 4e76794eff..7514f2a689 100644
--- a/sysdeps/unix/sysv/linux/shmctl.c
+++ b/sysdeps/unix/sysv/linux/shmctl.c
@@ -25,9 +25,11 @@
 #include <string.h>
 #include <sys/syscall.h>
 #include <bits/wordsize.h>
+#include <shlib-compat.h>
 
 #include "kernel-features.h"
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 struct __old_shmid_ds
 {
   struct __old_ipc_perm shm_perm;	/* operation permission struct */
@@ -54,13 +56,17 @@ struct __old_shminfo
 
 /* Provide operations to control over shared memory segments.  */
 int __old_shmctl (int, int, struct __old_shmid_ds *);
+#endif
 int __new_shmctl (int, int, struct shmid_ds *);
 
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
 int
 __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf)
 {
   return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, cmd, 0, buf);
 }
+compat_symbol (libc, __old_shmctl, shmctl, GLIBC_2_0);
+#endif
 
 int
 __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
@@ -141,9 +147,4 @@ __new_shmctl (int shmid, int cmd, struct shmid_ds *buf)
 #endif
 }
 
-#if defined PIC && DO_VERSIONING
-default_symbol_version (__new_shmctl, shmctl, GLIBC_2.2);
-symbol_version (__old_shmctl, shmctl, GLIBC_2.0);
-#else
-weak_alias (__new_shmctl, shmctl);
-#endif
+versioned_symbol (libc, __new_shmctl, shmctl, GLIBC_2_2);