Populate the auxillary vector using /proc/pid/auxv.

Signed-off-by: Suzuki K. Poulose <suz...@in.ibm.com>
Signed-off-by: Janani Venkataraman <janan...@linux.vnet.ibm.com>
---
 src/elf.c |   73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/src/elf.c b/src/elf.c
index 18bbeeb..b7fd6d0 100644
--- a/src/elf.c
+++ b/src/elf.c
@@ -26,12 +26,16 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 #include <sys/uio.h>
 #include <sys/procfs.h>
 #include <linux/elf.h>
 #include "elf-compat.h"
 #include "coredump.h"
 
+#define PAGESIZE getpagesize()
+
 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
 
 /* Appending the note to the list */
@@ -240,6 +244,70 @@ static int get_prpsinfo(int pid, struct core_proc *cp)
        return add_note("CORE", NT_PRPSINFO, sizeof(prps), &prps, cp);
 }
 
+/* Populate auxillary vector */
+static int get_auxv(int pid, struct core_proc *cp)
+{
+       unsigned char buff[PAGESIZE];
+       char filename[40];
+       int ret, fd, pages;
+       unsigned char *ptr, *auxv;
+       unsigned int auxv_size;
+
+       snprintf(filename, 40, "/proc/%d/auxv", pid);
+
+       fd = open(filename, O_RDONLY);
+       if (fd < 0) {
+               status = errno;
+               gencore_log("Failure while fetching auxv data from %s.\n",
+                                                               filename);
+               return -1;
+       }
+
+       auxv = malloc(PAGESIZE);
+       if (!auxv) {
+               status = errno;
+               gencore_log("Could not allocate memory for the auxv_buffer.\n");
+               close(fd);
+               return -1;
+       }
+       /* Position to copy the auxv data */
+       ptr = auxv;
+       pages = 1;
+       /*
+        * We read the auxv data page by page and also we don't not
+        * know the size of auxv, hence we read till ret becomes
+        * lesser than PAGESIZE.
+        */
+       while ((ret = read(fd, buff, PAGESIZE)) > 0) {
+               memcpy(ptr, buff, ret);
+               if (ret < PAGESIZE)   /* Finished reading */
+                       break;
+               else {
+                       /* We have more data to read */
+                       pages++;
+                       auxv = realloc(auxv, pages * PAGESIZE);
+                       ptr = auxv + ((pages - 1) * PAGESIZE);
+               }
+       }
+       if (ret >= 0)
+               auxv_size = ((pages - 1) * PAGESIZE) + ret;
+       else {
+               status = errno;
+               gencore_log("Failure while fetching auxv data from %s.\n", 
filename);
+               close(fd);
+               free(auxv);
+               return -1;
+       }
+
+       /* Adding AUXV */
+       ret = add_note("CORE", NT_AUXV, auxv_size, auxv, cp);
+
+       close(fd);
+       free(auxv);
+
+       return ret;
+}
+
 int do_elf_coredump(int pid, struct core_proc *cp)
 {
        int ret;
@@ -254,5 +322,10 @@ int do_elf_coredump(int pid, struct core_proc *cp)
        if (ret)
                return -1;
 
+       /* Get Auxillary Vector */
+       ret = get_auxv(pid, cp);
+       if (ret)
+               return -1;
+
        return 0;
 }

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to