Compare commits

...

2 Commits

Author SHA1 Message Date
Pedro Alves
929b345a6f Fix gnulib's lstat replacement in C++ namespace mode
Fixes:

 unittests/string_view-selftests.c: In member function 'gnulib::_gl_lstat_wrapper::operator gnulib::_gl_lstat_wrapper::type() const':
 unittests/string_view-selftests.c:11432:22: error: expected primary-expression before ';' token
      return ::rpl_stat;
		       ^

The problem is that the lstat replacement depends on the stat
(function) declaration, which is only declared afterwards.  The fix is
simply to declare lstat after stat.
2020-01-20 15:39:33 +00:00
Pedro Alves
36dc9e2447 Handle different "struct stat" between GDB and BFD 2020-01-20 15:39:31 +00:00
7 changed files with 90 additions and 43 deletions

View File

@@ -34,7 +34,6 @@
#undef PACKAGE_TARNAME
#include <config.h>
#include "bfd.h"
#include <sys/types.h>
#include <limits.h>

View 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,

View 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. */

View File

@@ -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;
}

View 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

View 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;

View File

@@ -536,40 +536,6 @@ _GL_WARN_ON_USE (lchmod, "lchmod is unportable - "
#endif
#if @GNULIB_LSTAT@
# if ! @HAVE_LSTAT@
/* mingw does not support symlinks, therefore it does not have lstat. But
without links, stat does just fine. */
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# define lstat stat
# endif
_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf));
# elif @REPLACE_LSTAT@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef lstat
# define lstat rpl_lstat
# endif
_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf)
_GL_ARG_NONNULL ((1, 2)));
_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf));
# else
_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf));
# endif
# if @HAVE_LSTAT@
_GL_CXXALIASWARN (lstat);
# endif
#elif @GNULIB_OVERRIDES_STRUCT_STAT@
# undef lstat
# define lstat lstat_used_without_requesting_gnulib_module_lstat
#elif defined GNULIB_POSIXCHECK
# undef lstat
# if HAVE_RAW_DECL_LSTAT
_GL_WARN_ON_USE (lstat, "lstat is unportable - "
"use gnulib module lstat for portability");
# endif
#endif
#if @REPLACE_MKDIR@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef mkdir
@@ -781,6 +747,38 @@ _GL_WARN_ON_USE (stat, "stat is unportable - "
# endif
#endif
#if @GNULIB_LSTAT@
# if ! @HAVE_LSTAT@
/* mingw does not support symlinks, therefore it does not have lstat. But
without links, stat does just fine. */
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# define lstat stat
# endif
_GL_CXXALIAS_RPL_1 (lstat, stat, int, (const char *name, struct stat *buf));
# elif @REPLACE_LSTAT@
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
# undef lstat
# define lstat rpl_lstat
# endif
_GL_FUNCDECL_RPL (lstat, int, (const char *name, struct stat *buf)
_GL_ARG_NONNULL ((1, 2)));
_GL_CXXALIAS_RPL (lstat, int, (const char *name, struct stat *buf));
# else
_GL_CXXALIAS_SYS (lstat, int, (const char *name, struct stat *buf));
# endif
# if @HAVE_LSTAT@
_GL_CXXALIASWARN (lstat);
# endif
#elif @GNULIB_OVERRIDES_STRUCT_STAT@
# undef lstat
# define lstat lstat_used_without_requesting_gnulib_module_lstat
#elif defined GNULIB_POSIXCHECK
# undef lstat
# if HAVE_RAW_DECL_LSTAT
_GL_WARN_ON_USE (lstat, "lstat is unportable - "
"use gnulib module lstat for portability");
# endif
#endif
#if @GNULIB_UTIMENSAT@
/* Use the rpl_ prefix also on Solaris <= 9, because on Solaris 9 our utimensat