Upstream-Status: Inappropriate [embedded specific]

enable standalone building of ldconfig

---
 cache.c        |   11 +-
 chroot_canon.c |    7 +
 dl-cache.c     |  235 ---------------------------------------------------------
 dl-cache.h     |    3 
 ldconfig.c     |   27 ++++--
 readlib.c      |    7 +
 xstrdup.c      |   11 --
 7 files changed, 45 insertions(+), 256 deletions(-)

Index: ldconfig-native-2.12.1/cache.c
===================================================================
--- ldconfig-native-2.12.1.orig/cache.c
+++ ldconfig-native-2.12.1/cache.c
@@ -16,6 +16,9 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
+#define _LARGEFILE64_SOURCE
+#define _GNU_SOURCE
+
 #include <errno.h>
 #include <error.h>
 #include <dirent.h>
@@ -31,8 +34,10 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
-#include <ldconfig.h>
-#include <dl-cache.h>
+#include "ldconfig.h"
+#include "dl-cache.h"
+# define N_(msgid)  msgid
+#define _(msg) msg
 
 struct cache_entry
 {
Index: ldconfig-native-2.12.1/chroot_canon.c
===================================================================
--- ldconfig-native-2.12.1.orig/chroot_canon.c
+++ ldconfig-native-2.12.1/chroot_canon.c
@@ -17,6 +17,9 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
+#define _LARGEFILE64_SOURCE
+#define _GNU_SOURCE
+
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
@@ -27,7 +30,9 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <ldconfig.h>
+#include "ldconfig.h"
+
+#define __set_errno(Val) errno = (Val)
 
 #ifndef PATH_MAX
 #define PATH_MAX 1024
Index: ldconfig-native-2.12.1/dl-cache.c
===================================================================
--- ldconfig-native-2.12.1.orig/dl-cache.c
+++ ldconfig-native-2.12.1/dl-cache.c
@@ -20,12 +20,12 @@
 
 #include <assert.h>
 #include <unistd.h>
-#include <ldsodefs.h>
+//#include "ldsodefs.h"
 #include <sys/mman.h>
 #include <dl-cache.h>
 #include <dl-procinfo.h>
 
-#include <stdio-common/_itoa.h>
+//#include "_itoa.h"
 
 #ifndef _DL_PLATFORMS_COUNT
 # define _DL_PLATFORMS_COUNT 0
@@ -39,103 +39,7 @@ static size_t cachesize;
 /* 1 if cache_data + PTR points into the cache.  */
 #define _dl_cache_verify_ptr(ptr) (ptr < cache_data_size)
 
-#define SEARCH_CACHE(cache) \
-/* We use binary search since the table is sorted in the cache file.	      \
-   The first matching entry in the table is returned.			      \
-   It is important to use the same algorithm as used while generating	      \
-   the cache file.  */							      \
-do									      \
-  {									      \
-    left = 0;								      \
-    right = cache->nlibs - 1;						      \
-									      \
-    while (left <= right)						      \
-      {									      \
-	__typeof__ (cache->libs[0].key) key;				      \
-									      \
-	middle = (left + right) / 2;					      \
-									      \
-	key = cache->libs[middle].key;					      \
-									      \
-	/* Make sure string table indices are not bogus before using	      \
-	   them.  */							      \
-	if (! _dl_cache_verify_ptr (key))				      \
-	  {								      \
-	    cmpres = 1;							      \
-	    break;							      \
-	  }								      \
-									      \
-	/* Actually compare the entry with the key.  */			      \
-	cmpres = _dl_cache_libcmp (name, cache_data + key);		      \
-	if (__builtin_expect (cmpres == 0, 0))				      \
-	  {								      \
-	    /* Found it.  LEFT now marks the last entry for which we	      \
-	       know the name is correct.  */				      \
-	    left = middle;						      \
-									      \
-	    /* There might be entries with this name before the one we	      \
-	       found.  So we have to find the beginning.  */		      \
-	    while (middle > 0)						      \
-	      {								      \
-		__typeof__ (cache->libs[0].key) key;			      \
-									      \
-		key = cache->libs[middle - 1].key;			      \
-		/* Make sure string table indices are not bogus before	      \
-		   using them.  */					      \
-		if (! _dl_cache_verify_ptr (key)			      \
-		    /* Actually compare the entry.  */			      \
-		    || _dl_cache_libcmp (name, cache_data + key) != 0)	      \
-		  break;						      \
-		--middle;						      \
-	      }								      \
-									      \
-	    do								      \
-	      {								      \
-		int flags;						      \
-		__typeof__ (cache->libs[0]) *lib = &cache->libs[middle];      \
-									      \
-		/* Only perform the name test if necessary.  */		      \
-		if (middle > left					      \
-		    /* We haven't seen this string so far.  Test whether the  \
-		       index is ok and whether the name matches.  Otherwise   \
-		       we are done.  */					      \
-		    && (! _dl_cache_verify_ptr (lib->key)		      \
-			|| (_dl_cache_libcmp (name, cache_data + lib->key)    \
-			    != 0)))					      \
-		  break;						      \
-									      \
-		flags = lib->flags;					      \
-		if (_dl_cache_check_flags (flags)			      \
-		    && _dl_cache_verify_ptr (lib->value))		      \
-		  {							      \
-		    if (best == NULL || flags == GLRO(dl_correct_cache_id))   \
-		      {							      \
-			HWCAP_CHECK;					      \
-			best = cache_data + lib->value;			      \
-									      \
-			if (flags == GLRO(dl_correct_cache_id))		      \
-			  /* We've found an exact match for the shared	      \
-			     object and no general `ELF' release.  Stop	      \
-			     searching.  */				      \
-			  break;					      \
-		      }							      \
-		  }							      \
-	      }								      \
-	    while (++middle <= right);					      \
-	    break;							      \
-	}								      \
-									      \
-	if (cmpres < 0)							      \
-	  left = middle + 1;						      \
-	else								      \
-	  right = middle - 1;						      \
-      }									      \
-  }									      \
-while (0)
-
-
 int
-internal_function
 _dl_cache_libcmp (const char *p1, const char *p2)
 {
   while (*p1 != '\0')
@@ -172,139 +76,3 @@ _dl_cache_libcmp (const char *p1, const 
     }
   return *p1 - *p2;
 }
-
-
-/* Look up NAME in ld.so.cache and return the file name stored there,
-   or null if none is found.  */
-
-const char *
-internal_function
-_dl_load_cache_lookup (const char *name)
-{
-  int left, right, middle;
-  int cmpres;
-  const char *cache_data;
-  uint32_t cache_data_size;
-  const char *best;
-
-  /* Print a message if the loading of libs is traced.  */
-  if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_LIBS, 0))
-    _dl_debug_printf (" search cache=%s\n", LD_SO_CACHE);
-
-  if (cache == NULL)
-    {
-      /* Read the contents of the file.  */
-      void *file = _dl_sysdep_read_whole_file (LD_SO_CACHE, &cachesize,
-					       PROT_READ);
-
-      /* We can handle three different cache file formats here:
-	 - the old libc5/glibc2.0/2.1 format
-	 - the old format with the new format in it
-	 - only the new format
-	 The following checks if the cache contains any of these formats.  */
-      if (file != MAP_FAILED && cachesize > sizeof *cache
-	  && memcmp (file, CACHEMAGIC, sizeof CACHEMAGIC - 1) == 0)
-	{
-	  size_t offset;
-	  /* Looks ok.  */
-	  cache = file;
-
-	  /* Check for new version.  */
-	  offset = ALIGN_CACHE (sizeof (struct cache_file)
-				+ cache->nlibs * sizeof (struct file_entry));
-
-	  cache_new = (struct cache_file_new *) ((void *) cache + offset);
-	  if (cachesize < (offset + sizeof (struct cache_file_new))
-	      || memcmp (cache_new->magic, CACHEMAGIC_VERSION_NEW,
-			 sizeof CACHEMAGIC_VERSION_NEW - 1) != 0)
-	    cache_new = (void *) -1;
-	}
-      else if (file != MAP_FAILED && cachesize > sizeof *cache_new
-	       && memcmp (file, CACHEMAGIC_VERSION_NEW,
-			  sizeof CACHEMAGIC_VERSION_NEW - 1) == 0)
-	{
-	  cache_new = file;
-	  cache = file;
-	}
-      else
-	{
-	  if (file != MAP_FAILED)
-	    __munmap (file, cachesize);
-	  cache = (void *) -1;
-	}
-
-      assert (cache != NULL);
-    }
-
-  if (cache == (void *) -1)
-    /* Previously looked for the cache file and didn't find it.  */
-    return NULL;
-
-  best = NULL;
-
-  if (cache_new != (void *) -1)
-    {
-      uint64_t platform;
-
-      /* This is where the strings start.  */
-      cache_data = (const char *) cache_new;
-
-      /* Now we can compute how large the string table is.  */
-      cache_data_size = (const char *) cache + cachesize - cache_data;
-
-      platform = _dl_string_platform (GLRO(dl_platform));
-      if (platform != (uint64_t) -1)
-	platform = 1ULL << platform;
-
-#define _DL_HWCAP_TLS_MASK (1LL << 63)
-      uint64_t hwcap_exclude = ~((GLRO(dl_hwcap) & GLRO(dl_hwcap_mask))
-				 | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK);
-
-      /* Only accept hwcap if it's for the right platform.  */
-#define HWCAP_CHECK \
-      if (lib->hwcap & hwcap_exclude)					      \
-	continue;							      \
-      if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion))	      \
-	continue;							      \
-      if (_DL_PLATFORMS_COUNT						      \
-	  && (lib->hwcap & _DL_HWCAP_PLATFORM) != 0			      \
-	  && (lib->hwcap & _DL_HWCAP_PLATFORM) != platform)		      \
-	continue
-      SEARCH_CACHE (cache_new);
-    }
-  else
-    {
-      /* This is where the strings start.  */
-      cache_data = (const char *) &cache->libs[cache->nlibs];
-
-      /* Now we can compute how large the string table is.  */
-      cache_data_size = (const char *) cache + cachesize - cache_data;
-
-#undef HWCAP_CHECK
-#define HWCAP_CHECK do {} while (0)
-      SEARCH_CACHE (cache);
-    }
-
-  /* Print our result if wanted.  */
-  if (__builtin_expect (GLRO_dl_debug_mask & DL_DEBUG_LIBS, 0)
-      && best != NULL)
-    _dl_debug_printf ("  trying file=%s\n", best);
-
-  return best;
-}
-
-#ifndef MAP_COPY
-/* If the system does not support MAP_COPY we cannot leave the file open
-   all the time since this would create problems when the file is replaced.
-   Therefore we provide this function to close the file and open it again
-   once needed.  */
-void
-_dl_unload_cache (void)
-{
-  if (cache != NULL && cache != (struct cache_file *) -1)
-    {
-      __munmap (cache, cachesize);
-      cache = NULL;
-    }
-}
-#endif
Index: ldconfig-native-2.12.1/dl-cache.h
===================================================================
--- ldconfig-native-2.12.1.orig/dl-cache.h
+++ ldconfig-native-2.12.1/dl-cache.h
@@ -101,5 +101,4 @@ struct cache_file_new
 (((addr) + __alignof__ (struct cache_file_new) -1)	\
  & (~(__alignof__ (struct cache_file_new) - 1)))
 
-extern int _dl_cache_libcmp (const char *p1, const char *p2)
-     internal_function;
+extern int _dl_cache_libcmp (const char *p1, const char *p2);
Index: ldconfig-native-2.12.1/ldconfig.c
===================================================================
--- ldconfig-native-2.12.1.orig/ldconfig.c
+++ ldconfig-native-2.12.1/ldconfig.c
@@ -16,6 +16,9 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
+#define _LARGEFILE64_SOURCE
+#define _GNU_SOURCE
+
 #define PROCINFO_CLASS static
 #include <alloca.h>
 #include <argp.h>
@@ -39,10 +42,20 @@
 #include <glob.h>
 #include <libgen.h>
 
-#include <ldconfig.h>
-#include <dl-cache.h>
+#include "ldconfig.h"
+#include "dl-cache.h"
+
+#include "dl-procinfo.h"
+
+#include "argp.h"
+
+
+#define SYSCONFDIR "/etc"
+#define LIBDIR "/usr/lib"
+#define SLIBDIR "/lib"
+# define N_(msgid)  msgid
+#define _(msg) msg
 
-#include <dl-procinfo.h>
 
 #ifdef _DL_FIRST_PLATFORM
 # define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT)
@@ -55,7 +68,7 @@
 #endif
 
 /* Get libc version number.  */
-#include <version.h>
+#include "version.h"
 
 #define PACKAGE _libc_intl_domainname
 
@@ -152,8 +165,8 @@ static const struct argp_option options[
   { NULL, 0, NULL, 0, NULL, 0 }
 };
 
-#define PROCINFO_CLASS static
-#include <dl-procinfo.c>
+//#define PROCINFO_CLASS static
+//#include <dl-procinfo.c>
 
 /* Short description of program.  */
 static const char doc[] = N_("Configure Dynamic Linker Run Time Bindings.");
@@ -291,6 +304,7 @@ parse_opt (int key, char *arg, struct ar
   return 0;
 }
 
+#define REPORT_BUGS_TO "mailing list : poky@lists.yoctoproject.org"
 /* Print bug-reporting information in the help message.  */
 static char *
 more_help (int key, const char *text, void *input)
@@ -315,7 +329,7 @@ For bug reporting instructions, please s
 static void
 print_version (FILE *stream, struct argp_state *state)
 {
-  fprintf (stream, "ldconfig %s%s\n", PKGVERSION, VERSION);
+  fprintf (stream, "ldconfig (Hacked Poky Version)\n");
   fprintf (stream, gettext ("\
 Copyright (C) %s Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.  There is NO\n\
@@ -1233,6 +1247,7 @@ set_hwcap (void)
     hwcap_mask = strtoul (mask, NULL, 0);
 }
 
+const char _libc_intl_domainname[] = "libc";
 
 int
 main (int argc, char **argv)
Index: ldconfig-native-2.12.1/readlib.c
===================================================================
--- ldconfig-native-2.12.1.orig/readlib.c
+++ ldconfig-native-2.12.1/readlib.c
@@ -22,6 +22,9 @@
    development version.  Besides the simplification, it has also been
    modified to read some other file formats.  */
 
+#define _LARGEFILE64_SOURCE
+#define _GNU_SOURCE
+
 #include <a.out.h>
 #include <elf.h>
 #include <error.h>
@@ -35,7 +38,9 @@
 #include <sys/stat.h>
 #include <gnu/lib-names.h>
 
-#include <ldconfig.h>
+#include "ldconfig.h"
+
+#define _(msg) msg
 
 #define Elf32_CLASS ELFCLASS32
 #define Elf64_CLASS ELFCLASS64
Index: ldconfig-native-2.12.1/xstrdup.c
===================================================================
--- ldconfig-native-2.12.1.orig/xstrdup.c
+++ ldconfig-native-2.12.1/xstrdup.c
@@ -16,15 +16,10 @@
    along with this program; if not, write to the Free Software Foundation,
    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#define _GNU_SOURCE
+
+#include <string.h>
 
-#if defined STDC_HEADERS || defined HAVE_STRING_H || _LIBC
-# include <string.h>
-#else
-# include <strings.h>
-#endif
 void *xmalloc (size_t n) __THROW;
 char *xstrdup (char *string) __THROW;
 
