elf: Fix 64 time_t support for installed statically binaries
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 29 Dec 2021 13:20:46 +0000 (10:20 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 17 Jan 2022 13:57:09 +0000 (10:57 -0300)
The usage of internal static symbol for statically linked binaries
does not work correctly for objects built with -D_TIME_BITS=64,
since the internal definition does not provide the expected aliases.

This patch makes it to use the default stat functions instead (which
uses the default 64 time_t alias and types).

Checked on i686-linux-gnu.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Tested-by: Carlos O'Donell <carlos@redhat.com>
elf/cache.c
elf/chroot_canon.c
elf/ldconfig.c
elf/readlib.c
elf/sln.c
sysdeps/generic/ldconfig.h

index 15a5b74..dbf4c83 100644 (file)
@@ -318,8 +318,8 @@ print_cache (const char *cache_name)
   if (fd < 0)
     error (EXIT_FAILURE, errno, _("Can't open cache file %s\n"), cache_name);
 
-  struct stat64 st;
-  if (__fstat64 (fd, &st) < 0
+  struct stat st;
+  if (fstat (fd, &st) < 0
       /* No need to map the file if it is empty.  */
       || st.st_size == 0)
     {
@@ -932,7 +932,7 @@ init_aux_cache (void)
 }
 
 int
-search_aux_cache (struct stat64 *stat_buf, int *flags,
+search_aux_cache (struct stat *stat_buf, int *flags,
                  unsigned int *osversion, unsigned int *isa_level,
                  char **soname)
 {
@@ -994,7 +994,7 @@ insert_to_aux_cache (struct aux_cache_entry_id *id, int flags,
 }
 
 void
-add_to_aux_cache (struct stat64 *stat_buf, int flags,
+add_to_aux_cache (struct stat *stat_buf, int flags,
                  unsigned int osversion, unsigned int isa_level,
                  const char *soname)
 {
@@ -1017,8 +1017,8 @@ load_aux_cache (const char *aux_cache_name)
       return;
     }
 
-  struct stat64 st;
-  if (__fstat64 (fd, &st) < 0 || st.st_size < sizeof (struct aux_cache_file))
+  struct stat st;
+  if (fstat (fd, &st) < 0 || st.st_size < sizeof (struct aux_cache_file))
     {
       close (fd);
       init_aux_cache ();
@@ -1134,8 +1134,8 @@ save_aux_cache (const char *aux_cache_name)
   char *dir = strdupa (aux_cache_name);
   dir = dirname (dir);
 
-  struct stat64 st;
-  if (stat64 (dir, &st) < 0)
+  struct stat st;
+  if (stat (dir, &st) < 0)
     {
       if (mkdir (dir, 0700) < 0)
        goto out_fail;
index c7f12ca..e5d7518 100644 (file)
@@ -67,7 +67,7 @@ chroot_canon (const char *chroot, const char *name)
 
   for (start = end = name; *start; start = end)
     {
-      struct stat64 st;
+      struct stat st;
 
       /* Skip sequence of multiple path-separators.  */
       while (*start == '/')
@@ -114,7 +114,7 @@ chroot_canon (const char *chroot, const char *name)
          dest = mempcpy (dest, start, end - start);
          *dest = '\0';
 
-         if (lstat64 (rpath, &st) < 0)
+         if (lstat (rpath, &st) < 0)
            {
              if (*end == '\0')
                goto done;
index 057c3dd..d14633f 100644 (file)
@@ -337,7 +337,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
    inode data from *ST.  */
 static struct dir_entry *
 new_sub_entry (const struct dir_entry *entry, const char *path,
-              const struct stat64 *st)
+              const struct stat *st)
 {
   struct dir_entry *new_entry = xmalloc (sizeof (struct dir_entry));
   new_entry->from_file = entry->from_file;
@@ -427,8 +427,8 @@ add_glibc_hwcaps_subdirectories (struct dir_entry *entry, const char *path)
            continue;
 
          /* See if this entry eventually resolves to a directory.  */
-         struct stat64 st;
-         if (fstatat64 (dirfd (dir), e->d_name, &st, 0) < 0)
+         struct stat st;
+         if (fstatat (dirfd (dir), e->d_name, &st, 0) < 0)
            /* Ignore unreadable entries.  */
            continue;
 
@@ -512,8 +512,8 @@ add_dir_1 (const char *line, const char *from_file, int from_line)
   if (opt_chroot != NULL)
     path = chroot_canon (opt_chroot, path);
 
-  struct stat64 stat_buf;
-  if (path == NULL || stat64 (path, &stat_buf))
+  struct stat stat_buf;
+  if (path == NULL || stat (path, &stat_buf))
     {
       if (opt_verbose)
        error (0, errno, _("Can't stat %s"), entry->path);
@@ -541,15 +541,15 @@ add_dir (const char *line)
 }
 
 static int
-chroot_stat (const char *real_path, const char *path, struct stat64 *st)
+chroot_stat (const char *real_path, const char *path, struct stat *st)
 {
   int ret;
   char *canon_path;
 
   if (!opt_chroot)
-    return stat64 (real_path, st);
+    return stat (real_path, st);
 
-  ret = lstat64 (real_path, st);
+  ret = lstat (real_path, st);
   if (ret || !S_ISLNK (st->st_mode))
     return ret;
 
@@ -557,7 +557,7 @@ chroot_stat (const char *real_path, const char *path, struct stat64 *st)
   if (canon_path == NULL)
     return -1;
 
-  ret = stat64 (canon_path, st);
+  ret = stat (canon_path, st);
   free (canon_path);
   return ret;
 }
@@ -569,7 +569,7 @@ create_links (const char *real_path, const char *path, const char *libname,
 {
   char *full_libname, *full_soname;
   char *real_full_libname, *real_full_soname;
-  struct stat64 stat_lib, stat_so, lstat_so;
+  struct stat stat_lib, stat_so, lstat_so;
   int do_link = 1;
   int do_remove = 1;
   /* XXX: The logics in this function should be simplified.  */
@@ -604,7 +604,7 @@ create_links (const char *real_path, const char *path, const char *libname,
          && stat_lib.st_ino == stat_so.st_ino)
        /* Link is already correct.  */
        do_link = 0;
-      else if (lstat64 (full_soname, &lstat_so) == 0
+      else if (lstat (full_soname, &lstat_so) == 0
               && !S_ISLNK (lstat_so.st_mode))
        {
          error (0, 0, _("%s is not a symbolic link\n"), full_soname);
@@ -612,7 +612,7 @@ create_links (const char *real_path, const char *path, const char *libname,
          do_remove = 0;
        }
     }
-  else if (lstat64 (real_full_soname, &lstat_so) != 0
+  else if (lstat (real_full_soname, &lstat_so) != 0
           || !S_ISLNK (lstat_so.st_mode))
     /* Unless it is a stale symlink, there is no need to remove.  */
     do_remove = 0;
@@ -656,7 +656,7 @@ manual_link (char *library)
   char *real_library;
   char *libname;
   char *soname;
-  struct stat64 stat_buf;
+  struct stat stat_buf;
   int flag;
   unsigned int osversion;
   unsigned int isa_level;
@@ -710,7 +710,7 @@ manual_link (char *library)
     }
 
   /* Do some sanity checks first.  */
-  if (lstat64 (real_library, &stat_buf))
+  if (lstat (real_library, &stat_buf))
     {
       error (0, errno, _("Cannot lstat %s"), library);
       goto out;
@@ -885,18 +885,18 @@ search_dir (const struct dir_entry *entry)
          sprintf (real_file_name, "%s/%s", dir_name, direntry->d_name);
        }
 
-      struct stat64 lstat_buf;
+      struct stat lstat_buf;
       /* We optimize and try to do the lstat call only if needed.  */
       if (direntry->d_type != DT_UNKNOWN)
        lstat_buf.st_mode = DTTOIF (direntry->d_type);
       else
-       if (__glibc_unlikely (lstat64 (real_file_name, &lstat_buf)))
+       if (__glibc_unlikely (lstat (real_file_name, &lstat_buf)))
          {
            error (0, errno, _("Cannot lstat %s"), file_name);
            continue;
          }
 
-      struct stat64 stat_buf;
+      struct stat stat_buf;
       bool is_dir;
       int is_link = S_ISLNK (lstat_buf.st_mode);
       if (is_link)
@@ -914,7 +914,7 @@ search_dir (const struct dir_entry *entry)
                  continue;
                }
            }
-         if (__glibc_unlikely (stat64 (target_name, &stat_buf)))
+         if (__glibc_unlikely (stat (target_name, &stat_buf)))
            {
              if (opt_verbose)
                error (0, errno, _("Cannot stat %s"), file_name);
@@ -950,7 +950,7 @@ search_dir (const struct dir_entry *entry)
        {
          if (!is_link
              && direntry->d_type != DT_UNKNOWN
-             && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
+             && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
            {
              error (0, errno, _("Cannot lstat %s"), file_name);
              continue;
@@ -979,10 +979,10 @@ search_dir (const struct dir_entry *entry)
       else
        real_name = real_file_name;
 
-      /* Call lstat64 if not done yet.  */
+      /* Call lstat if not done yet.  */
       if (!is_link
          && direntry->d_type != DT_UNKNOWN
-         && __builtin_expect (lstat64 (real_file_name, &lstat_buf), 0))
+         && __builtin_expect (lstat (real_file_name, &lstat_buf), 0))
        {
          error (0, errno, _("Cannot lstat %s"), file_name);
          continue;
index 05c1577..3651dcd 100644 (file)
@@ -74,10 +74,10 @@ int
 process_file (const char *real_file_name, const char *file_name,
              const char *lib, int *flag, unsigned int *osversion,
              unsigned int *isa_level, char **soname, int is_link,
-             struct stat64 *stat_buf)
+             struct stat *stat_buf)
 {
   FILE *file;
-  struct stat64 statbuf;
+  struct stat statbuf;
   void *file_contents;
   int ret;
   ElfW(Ehdr) *elf_header;
@@ -97,7 +97,7 @@ process_file (const char *real_file_name, const char *file_name,
       return 1;
     }
 
-  if (fstat64 (fileno (file), &statbuf) < 0)
+  if (fstat (fileno (file), &statbuf) < 0)
     {
       error (0, 0, _("Cannot fstat file %s.\n"), file_name);
       fclose (file);
index 00f8f7c..5347338 100644 (file)
--- a/elf/sln.c
+++ b/elf/sln.c
@@ -153,11 +153,11 @@ makesymlinks (const char *file)
 static int
 makesymlink (const char *src, const char *dest)
 {
-  struct stat64 stats;
+  struct stat stats;
   const char *error;
 
   /* Destination must not be a directory. */
-  if (lstat64 (dest, &stats) == 0)
+  if (lstat (dest, &stats) == 0)
     {
       if (S_ISDIR (stats.st_mode))
        {
index ea11827..94f008b 100644 (file)
@@ -78,11 +78,11 @@ extern void init_aux_cache (void);
 
 extern void load_aux_cache (const char *aux_cache_name);
 
-extern int search_aux_cache (struct stat64 *stat_buf, int *flags,
+extern int search_aux_cache (struct stat *stat_buf, int *flags,
                             unsigned int *osversion,
                             unsigned int *isa_level, char **soname);
 
-extern void add_to_aux_cache (struct stat64 *stat_buf, int flags,
+extern void add_to_aux_cache (struct stat *stat_buf, int flags,
                              unsigned int osversion,
                              unsigned int isa_level, const char *soname);
 
@@ -93,7 +93,7 @@ extern int process_file (const char *real_file_name, const char *file_name,
                         const char *lib, int *flag,
                         unsigned int *osversion, unsigned int *isa_level,
                         char **soname, int is_link,
-                        struct stat64 *stat_buf);
+                        struct stat *stat_buf);
 
 extern char *implicit_soname (const char *lib, int flag);