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:
John Baldwin
2015-02-17 19:15:45 -05:00
parent 773eacf5b0
commit 25268153a1
5 changed files with 141 additions and 0 deletions

60
gdb/configure vendored
View File

@ -7159,6 +7159,66 @@ if test "$ac_res" != no; then :
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