changeset 5163:02529fb8a820

8031764: tmtools/jmap/heap_config tests fail on Linux-ia32 because it Cant attach to the core file Summary: Backport of JDK-8025812. We have to round addresses to page boundary. Reviewed-by: sla, dholmes
author dsamersoff
date Mon, 27 Jan 2014 20:29:41 +0400
parents 8816e9af562c
children 2b97745f0735
files agent/src/os/linux/ps_core.c
diffstat 1 files changed, 45 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/agent/src/os/linux/ps_core.c	Tue Jan 21 20:46:07 2014 -0800
+++ b/agent/src/os/linux/ps_core.c	Mon Jan 27 20:29:41 2014 +0400
@@ -700,55 +700,61 @@
 
 // read segments of a shared object
 static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* lib_ehdr, uintptr_t lib_base) {
-   int i = 0;
-   ELF_PHDR* phbuf;
-   ELF_PHDR* lib_php = NULL;
+  int i = 0;
+  ELF_PHDR* phbuf;
+  ELF_PHDR* lib_php = NULL;
 
-   int page_size=sysconf(_SC_PAGE_SIZE);
+  int page_size = sysconf(_SC_PAGE_SIZE);
 
-   if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL)
-      return false;
+  if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL) {
+    return false;
+  }
 
-   // we want to process only PT_LOAD segments that are not writable.
-   // i.e., text segments. The read/write/exec (data) segments would
-   // have been already added from core file segments.
-   for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
-      if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
-         uintptr_t target_vaddr = lib_php->p_vaddr + lib_base;
-         map_info *existing_map = core_lookup(ph, target_vaddr);
+  // we want to process only PT_LOAD segments that are not writable.
+  // i.e., text segments. The read/write/exec (data) segments would
+  // have been already added from core file segments.
+  for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
+    if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
 
-         if (existing_map == NULL) {
-            if (add_map_info(ph, lib_fd, lib_php->p_offset,
-                              target_vaddr, lib_php->p_filesz) == NULL) {
-                goto err;
-            }
-         } else {
-            if ((existing_map->memsz != page_size) &&
-                (existing_map->fd != lib_fd) &&
-                (existing_map->memsz != lib_php->p_filesz)) {
+      uintptr_t target_vaddr = lib_php->p_vaddr + lib_base;
+      map_info *existing_map = core_lookup(ph, target_vaddr);
 
-                print_debug("address conflict @ 0x%lx (size = %ld, flags = %d\n)",
-                            target_vaddr, lib_php->p_filesz, lib_php->p_flags);
-                goto err;
-            }
+      if (existing_map == NULL){
+        if (add_map_info(ph, lib_fd, lib_php->p_offset,
+                          target_vaddr, lib_php->p_memsz) == NULL) {
+          goto err;
+        }
+      } else {
+        // Coredump stores value of p_memsz elf field
+        // rounded up to page boundary.
 
-            /* replace PT_LOAD segment with library segment */
-            print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
-                            existing_map->memsz, lib_php->p_filesz);
+        if ((existing_map->memsz != page_size) &&
+            (existing_map->fd != lib_fd) &&
+            (ROUNDUP(existing_map->memsz, page_size) != ROUNDUP(lib_php->p_memsz, page_size))) {
 
-            existing_map->fd = lib_fd;
-            existing_map->offset = lib_php->p_offset;
-            existing_map->memsz = lib_php->p_filesz;
-         }
+          print_debug("address conflict @ 0x%lx (existing map size = %ld, size = %ld, flags = %d)\n",
+                        target_vaddr, existing_map->memsz, lib_php->p_memsz, lib_php->p_flags);
+          goto err;
+        }
+
+        /* replace PT_LOAD segment with library segment */
+        print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
+                     existing_map->memsz, ROUNDUP(lib_php->p_memsz, page_size));
+
+        existing_map->fd = lib_fd;
+        existing_map->offset = lib_php->p_offset;
+        existing_map->memsz = ROUNDUP(lib_php->p_memsz, page_size);
       }
-      lib_php++;
-   }
+    }
 
-   free(phbuf);
-   return true;
+    lib_php++;
+  }
+
+  free(phbuf);
+  return true;
 err:
-   free(phbuf);
-   return false;
+  free(phbuf);
+  return false;
 }
 
 // process segments from interpreter (ld.so or ld-linux.so)