gdb/fbsd-nat.c - gdb
Functions defined
Source code
- #include "defs.h"
- #include "gdbcore.h"
- #include "inferior.h"
- #include "regcache.h"
- #include "regset.h"
- #include "gdbthread.h"
- #include <sys/types.h>
- #include <sys/procfs.h>
- #include <sys/sysctl.h>
- #include "elf-bfd.h"
- #include "fbsd-nat.h"
- char *
- fbsd_pid_to_exec_file (struct target_ops *self, int pid)
- {
- ssize_t len = PATH_MAX;
- static char buf[PATH_MAX];
- char name[PATH_MAX];
- #ifdef KERN_PROC_PATHNAME
- int mib[4];
- mib[0] = CTL_KERN;
- mib[1] = KERN_PROC;
- mib[2] = KERN_PROC_PATHNAME;
- mib[3] = pid;
- if (sysctl (mib, 4, buf, &len, NULL, 0) == 0)
- return buf;
- #endif
- xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
- len = readlink (name, buf, PATH_MAX - 1);
- if (len != -1)
- {
- buf[len] = '\0';
- return buf;
- }
- return NULL;
- }
- static int
- fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
- char *protection)
- {
-
- char buf[256];
- int resident, privateresident;
- unsigned long obj;
- int ret = EOF;
-
- if (fgets (buf, sizeof buf, mapfile) != NULL)
- ret = sscanf (buf, "%lx %lx %d %d %lx %s", start, end,
- &resident, &privateresident, &obj, protection);
- return (ret != 0 && ret != EOF);
- }
- int
- fbsd_find_memory_regions (struct target_ops *self,
- find_memory_region_ftype func, void *obfd)
- {
- pid_t pid = ptid_get_pid (inferior_ptid);
- char *mapfilename;
- FILE *mapfile;
- unsigned long start, end, size;
- char protection[4];
- int read, write, exec;
- struct cleanup *cleanup;
- mapfilename = xstrprintf ("/proc/%ld/map", (long) pid);
- cleanup = make_cleanup (xfree, mapfilename);
- mapfile = fopen (mapfilename, "r");
- if (mapfile == NULL)
- error (_("Couldn't open %s."), mapfilename);
- make_cleanup_fclose (mapfile);
- if (info_verbose)
- fprintf_filtered (gdb_stdout,
- "Reading memory regions from %s\n", mapfilename);
-
- while (fbsd_read_mapping (mapfile, &start, &end, &protection[0]))
- {
- size = end - start;
- read = (strchr (protection, 'r') != 0);
- write = (strchr (protection, 'w') != 0);
- exec = (strchr (protection, 'x') != 0);
- if (info_verbose)
- {
- fprintf_filtered (gdb_stdout,
- "Save segment, %ld bytes at %s (%c%c%c)\n",
- size, paddress (target_gdbarch (), start),
- read ? 'r' : '-',
- write ? 'w' : '-',
- exec ? 'x' : '-');
- }
-
- func (start, size, read, write, exec, 1, obfd);
- }
- do_cleanups (cleanup);
- return 0;
- }