Handle different "struct stat" between GDB and BFD

This commit is contained in:
Pedro Alves
2020-01-20 15:39:31 +00:00
parent 67b10306d1
commit 36dc9e2447
6 changed files with 58 additions and 9 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;