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/