forked from Imagelibrary/binutils-gdb
Use kinfo_getvmmap on FreeBSD to enumerate memory regions.
Use kinfo_getvmmap from libutil on FreeBSD to enumerate memory
regions in a running process instead of /proc/<pid>/map. FreeBSD systems
do not mount procfs by default, but kinfo_getvmmap uses a sysctl that
is always available.
Skip memory regions for devices as well as regions an application has
requested to not be dumped via the MAP_NOCORE flag to mmap or
MADV_NOCORE advice to madvise.
gdb/ChangeLog:
* configure.ac: AC_CHECK_LIB(util, kinfo_getvmmap).
* configure: Regenerate.
* config.in: Regenerate.
* fbsd-nat.c [!HAVE_KINFO_GETVMMAP] (fbsd_read_mapping): Don't
define.
(fbsd_find_memory_regions): Use kinfo_getvmmap to
enumerate memory regions if present.
This commit is contained in:
@@ -1,3 +1,13 @@
|
|||||||
|
2015-03-13 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
|
* configure.ac: AC_SEARCH_LIBS(kinfo_getvmmap, util).
|
||||||
|
* config.in: Regenerate.
|
||||||
|
* configure: Regenerate.
|
||||||
|
* fbsd-nat.c [!HAVE_KINFO_GETVMMAP] (fbsd_read_mapping): Don't
|
||||||
|
define.
|
||||||
|
(fbsd_find_memory_regions): Use kinfo_getvmmap to
|
||||||
|
enumerate memory regions if present.
|
||||||
|
|
||||||
2015-03-13 John Baldwin <jhb@FreeBSD.org>
|
2015-03-13 John Baldwin <jhb@FreeBSD.org>
|
||||||
|
|
||||||
* amd64fbsd-tdep.c (amd64fbsd_sigtramp_p): Style fixes.
|
* amd64fbsd-tdep.c (amd64fbsd_sigtramp_p): Style fixes.
|
||||||
|
|||||||
@@ -213,6 +213,9 @@
|
|||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||||
#undef HAVE_INTTYPES_H
|
#undef HAVE_INTTYPES_H
|
||||||
|
|
||||||
|
/* Define to 1 if your system has the kinfo_getvmmap function. */
|
||||||
|
#undef HAVE_KINFO_GETVMMAP
|
||||||
|
|
||||||
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
|
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
|
||||||
#undef HAVE_LANGINFO_CODESET
|
#undef HAVE_LANGINFO_CODESET
|
||||||
|
|
||||||
|
|||||||
60
gdb/configure
vendored
60
gdb/configure
vendored
@@ -7159,6 +7159,66 @@ if test "$ac_res" != no; then :
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# On FreeBSD we may need libutil for kinfo_getvmmap (used by fbsd-nat.c).
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing kinfo_getvmmap" >&5
|
||||||
|
$as_echo_n "checking for library containing kinfo_getvmmap... " >&6; }
|
||||||
|
if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_func_search_save_LIBS=$LIBS
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any GCC internal prototype to avoid an error.
|
||||||
|
Use char because int might match the return type of a GCC
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
char kinfo_getvmmap ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return kinfo_getvmmap ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
for ac_lib in '' util; do
|
||||||
|
if test -z "$ac_lib"; then
|
||||||
|
ac_res="none required"
|
||||||
|
else
|
||||||
|
ac_res=-l$ac_lib
|
||||||
|
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
|
||||||
|
fi
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
ac_cv_search_kinfo_getvmmap=$ac_res
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext
|
||||||
|
if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
|
||||||
|
|
||||||
|
else
|
||||||
|
ac_cv_search_kinfo_getvmmap=no
|
||||||
|
fi
|
||||||
|
rm conftest.$ac_ext
|
||||||
|
LIBS=$ac_func_search_save_LIBS
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_kinfo_getvmmap" >&5
|
||||||
|
$as_echo "$ac_cv_search_kinfo_getvmmap" >&6; }
|
||||||
|
ac_res=$ac_cv_search_kinfo_getvmmap
|
||||||
|
if test "$ac_res" != no; then :
|
||||||
|
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -537,6 +537,11 @@ AM_ZLIB
|
|||||||
# On HP/UX we may need libxpdl for dlgetmodinfo (used by solib-pa64.c).
|
# On HP/UX we may need libxpdl for dlgetmodinfo (used by solib-pa64.c).
|
||||||
AC_SEARCH_LIBS(dlgetmodinfo, [dl xpdl])
|
AC_SEARCH_LIBS(dlgetmodinfo, [dl xpdl])
|
||||||
|
|
||||||
|
# On FreeBSD we may need libutil for kinfo_getvmmap (used by fbsd-nat.c).
|
||||||
|
AC_SEARCH_LIBS(kinfo_getvmmap, util,
|
||||||
|
[AC_DEFINE(HAVE_KINFO_GETVMMAP, 1,
|
||||||
|
[Define to 1 if your system has the kinfo_getvmmap function. ])])
|
||||||
|
|
||||||
AM_ICONV
|
AM_ICONV
|
||||||
|
|
||||||
# GDB may fork/exec the iconv program to get the list of supported character
|
# GDB may fork/exec the iconv program to get the list of supported character
|
||||||
|
|||||||
@@ -26,6 +26,10 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/procfs.h>
|
#include <sys/procfs.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
#ifdef HAVE_KINFO_GETVMMAP
|
||||||
|
#include <sys/user.h>
|
||||||
|
#include <libutil.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "elf-bfd.h"
|
#include "elf-bfd.h"
|
||||||
#include "fbsd-nat.h"
|
#include "fbsd-nat.h"
|
||||||
@@ -62,6 +66,64 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_KINFO_GETVMMAP
|
||||||
|
/* Iterate over all the memory regions in the current inferior,
|
||||||
|
calling FUNC for each memory region. OBFD is passed as the last
|
||||||
|
argument to FUNC. */
|
||||||
|
|
||||||
|
int
|
||||||
|
fbsd_find_memory_regions (struct target_ops *self,
|
||||||
|
find_memory_region_ftype func, void *obfd)
|
||||||
|
{
|
||||||
|
pid_t pid = ptid_get_pid (inferior_ptid);
|
||||||
|
struct kinfo_vmentry *vmentl, *kve;
|
||||||
|
uint64_t size;
|
||||||
|
struct cleanup *cleanup;
|
||||||
|
int i, nitems;
|
||||||
|
|
||||||
|
vmentl = kinfo_getvmmap (pid, &nitems);
|
||||||
|
if (vmentl == NULL)
|
||||||
|
perror_with_name (_("Couldn't fetch VM map entries."));
|
||||||
|
cleanup = make_cleanup (free, vmentl);
|
||||||
|
|
||||||
|
for (i = 0; i < nitems; i++)
|
||||||
|
{
|
||||||
|
kve = &vmentl[i];
|
||||||
|
|
||||||
|
/* Skip unreadable segments and those where MAP_NOCORE has been set. */
|
||||||
|
if (!(kve->kve_protection & KVME_PROT_READ)
|
||||||
|
|| kve->kve_flags & KVME_FLAG_NOCOREDUMP)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Skip segments with an invalid type. */
|
||||||
|
if (kve->kve_type != KVME_TYPE_DEFAULT
|
||||||
|
&& kve->kve_type != KVME_TYPE_VNODE
|
||||||
|
&& kve->kve_type != KVME_TYPE_SWAP
|
||||||
|
&& kve->kve_type != KVME_TYPE_PHYS)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
size = kve->kve_end - kve->kve_start;
|
||||||
|
if (info_verbose)
|
||||||
|
{
|
||||||
|
fprintf_filtered (gdb_stdout,
|
||||||
|
"Save segment, %ld bytes at %s (%c%c%c)\n",
|
||||||
|
(long) size,
|
||||||
|
paddress (target_gdbarch (), kve->kve_start),
|
||||||
|
kve->kve_protection & KVME_PROT_READ ? 'r' : '-',
|
||||||
|
kve->kve_protection & KVME_PROT_WRITE ? 'w' : '-',
|
||||||
|
kve->kve_protection & KVME_PROT_EXEC ? 'x' : '-');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Invoke the callback function to create the corefile segment.
|
||||||
|
Pass MODIFIED as true, we do not know the real modification state. */
|
||||||
|
func (kve->kve_start, size, kve->kve_protection & KVME_PROT_READ,
|
||||||
|
kve->kve_protection & KVME_PROT_WRITE,
|
||||||
|
kve->kve_protection & KVME_PROT_EXEC, 1, obfd);
|
||||||
|
}
|
||||||
|
do_cleanups (cleanup);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
static int
|
static int
|
||||||
fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
|
fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
|
||||||
char *protection)
|
char *protection)
|
||||||
@@ -137,3 +199,4 @@ fbsd_find_memory_regions (struct target_ops *self,
|
|||||||
do_cleanups (cleanup);
|
do_cleanups (cleanup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user