]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Handle different "struct stat" between GDB and BFD
authorPedro Alves <palves@redhat.com>
Mon, 20 Jan 2020 15:39:31 +0000 (15:39 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 20 Jan 2020 15:39:31 +0000 (15:39 +0000)
gdb/defs.h
gdb/gdb_bfd.c
gdb/gdb_bfd.h
gdb/jit.c
gdb/symfile.c
gdbsupport/common-types.h

index 1ad52feb1f80d00cc6ba8029e9564e2a46a553c0..f38b9dc6ff5c949805d692fb1210f17e5377e4af 100644 (file)
@@ -34,7 +34,6 @@
 #undef PACKAGE_TARNAME
 
 #include <config.h>
-#include "bfd.h"
 
 #include <sys/types.h>
 #include <limits.h>
index 5a6dee2d51a8eb861768bc4aaf0b3b1a36bbc69a..82b6a6bbaa2c4d8631e6374b44067af9ec985f4d 100644 (file)
@@ -66,7 +66,7 @@ struct gdb_bfd_data
       needs_relocations (0),
       crc_computed (0)
   {
-    struct stat buf;
+    sys_stat buf;
 
     if (bfd_stat (abfd, &buf) == 0)
       {
@@ -355,24 +355,61 @@ gdb_bfd_iovec_fileio_close (struct bfd *abfd, void *stream)
   return 0;
 }
 
+/* Convert between a struct stat (potentially a gnulib replacement)
+   and a sys_stat (the system's struct stat).  */
+
+static sys_stat
+to_sys_stat (struct stat *st)
+{
+  sys_stat sst {};
+
+#define COPY(FIELD) \
+  sst.FIELD = st->FIELD
+
+  COPY (st_dev);
+  COPY (st_ino);
+  COPY (st_mode);
+  COPY (st_nlink);
+  COPY (st_uid);
+  COPY (st_gid);
+  COPY (st_rdev);
+
+  /* Check for overflow?  */
+  COPY (st_size);
+
+  // Should probably check _GL_WINDOWS_STAT_TIMESPEC and refer to
+  // st_atim, etc. instead.
+  COPY (st_atime);
+  COPY (st_mtime);
+  COPY (st_ctime);
+
+#undef COPY
+
+  return sst;
+}
+
 /* Wrapper for target_fileio_fstat suitable for passing as the
    STAT_FUNC argument to gdb_bfd_openr_iovec.  */
 
 static int
 gdb_bfd_iovec_fileio_fstat (struct bfd *abfd, void *stream,
-                           struct stat *sb)
+                           sys_stat *sb)
 {
   int fd = *(int *) stream;
   int target_errno;
   int result;
 
-  result = target_fileio_fstat (fd, sb, &target_errno);
+  struct stat st;
+
+  result = target_fileio_fstat (fd, &st, &target_errno);
   if (result == -1)
     {
       errno = fileio_errno_to_host (target_errno);
       bfd_set_error (bfd_error_system_call);
     }
 
+  *sb = to_sys_stat (&st);
+
   return result;
 }
 
@@ -818,7 +855,7 @@ gdb_bfd_openr_iovec (const char *filename, const char *target,
                                        void *stream),
                     int (*stat_func) (struct bfd *abfd,
                                       void *stream,
-                                      struct stat *sb))
+                                      sys_stat *sb))
 {
   bfd *result = bfd_openr_iovec (filename, target,
                                 open_func, open_closure,
index 9b1e292bf18f680bcbe0560871a4ed2cba3c69ec..f0ad4814a80e76d9061438f9e55d803dc3a49873 100644 (file)
@@ -154,7 +154,7 @@ gdb_bfd_ref_ptr gdb_bfd_openr_iovec (const char *filename, const char *target,
                                                        void *stream),
                                     int (*stat_func) (struct bfd *abfd,
                                                       void *stream,
-                                                      struct stat *sb));
+                                                      sys_stat *sb));
 
 /* A wrapper for bfd_openr_next_archived_file that initializes the
    gdb-specific reference count.  */
index eeaab70bfe0e649fd900b3f9514bbab90aad19fb..976f85552509040cddc18e564e5432f2756c7b6f 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -124,11 +124,11 @@ mem_bfd_iovec_pread (struct bfd *abfd, void *stream, void *buf,
 /* For statting the file, we only support the st_size attribute.  */
 
 static int
-mem_bfd_iovec_stat (struct bfd *abfd, void *stream, struct stat *sb)
+mem_bfd_iovec_stat (struct bfd *abfd, void *stream, sys_stat *sb)
 {
   struct target_buffer *buffer = (struct target_buffer*) stream;
 
-  memset (sb, 0, sizeof (struct stat));
+  memset (sb, 0, sizeof (sys_stat));
   sb->st_size = buffer->size;
   return 0;
 }
index f7bada75f3501bc8358f638df51d5968bccdeed9..65d342a53dd0fd3c2b408f58cfa56a4bdabb463b 100644 (file)
@@ -1260,7 +1260,7 @@ separate_debug_file_exists (const std::string &name, unsigned long crc,
 {
   unsigned long file_crc;
   int file_crc_p;
-  struct stat parent_stat, abfd_stat;
+  sys_stat parent_stat, abfd_stat;
   int verified_as_different;
 
   /* Find a separate debug info file as if symbols would be present in
index 61099b4e25d8c47f36696f84270399436927a448..8c136212c8022e5804b7ca795bf499338bd735a3 100644 (file)
@@ -32,8 +32,21 @@ typedef unsigned long long ULONGEST;
 
 #else /* GDBSERVER */
 
+/* Gnulib may replace struct stat with its own version.  Bfd does not
+   use gnulib, so when we call into bfd, we must use the system struct
+   stat.  */
+#define __need_system_sys_stat_h 1
+
+#include <sys/stat.h>
+
 #include "bfd.h"
 
+typedef struct stat sys_stat;
+
+#undef __need_system_sys_stat_h
+
+#include <sys/stat.h>
+
 /* * A byte from the program being debugged.  */
 typedef bfd_byte gdb_byte;