Merge
authorsspitsyn
Mon, 13 Feb 2017 22:43:50 +0000
changeset 43953 e7ebd1507bd7
parent 43952 8c42125f77c4 (current diff)
parent 43951 c23519aaccc1 (diff)
child 43955 ba1071ebd14b
Merge
--- a/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/elfmacros.h	Mon Feb 13 14:39:50 2017 -0800
+++ b/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/elfmacros.h	Mon Feb 13 22:43:50 2017 +0000
@@ -33,6 +33,7 @@
 #define ELF_NHDR        Elf64_Nhdr
 #define ELF_DYN         Elf64_Dyn
 #define ELF_ADDR        Elf64_Addr
+#define ELF_AUXV        Elf64_auxv_t
 
 #define ELF_ST_TYPE     ELF64_ST_TYPE
 
@@ -45,6 +46,7 @@
 #define ELF_NHDR        Elf32_Nhdr
 #define ELF_DYN         Elf32_Dyn
 #define ELF_ADDR        Elf32_Addr
+#define ELF_AUXV        Elf32_auxv_t
 
 #define ELF_ST_TYPE     ELF32_ST_TYPE
 
--- a/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c	Mon Feb 13 14:39:50 2017 -0800
+++ b/hotspot/src/jdk.hotspot.agent/linux/native/libsaproc/ps_core.c	Mon Feb 13 22:43:50 2017 +0000
@@ -642,6 +642,18 @@
         if (core_handle_prstatus(ph, descdata, notep->n_descsz) != true) {
           return false;
         }
+      } else if (notep->n_type == NT_AUXV) {
+        // Get first segment from entry point
+        ELF_AUXV *auxv = (ELF_AUXV *)descdata;
+        while (auxv->a_type != AT_NULL) {
+          if (auxv->a_type == AT_ENTRY) {
+            // Set entry point address to address of dynamic section.
+            // We will adjust it in read_exec_segments().
+            ph->core->dynamic_addr = auxv->a_un.a_val;
+            break;
+          }
+          auxv++;
+        }
       }
       p = descdata + ROUNDUP(notep->n_descsz, 4);
    }
@@ -832,7 +844,13 @@
 
     // from PT_DYNAMIC we want to read address of first link_map addr
     case PT_DYNAMIC: {
-      ph->core->dynamic_addr = exec_php->p_vaddr;
+      if (exec_ehdr->e_type == ET_EXEC) {
+        ph->core->dynamic_addr = exec_php->p_vaddr;
+      } else { // ET_DYN
+        // dynamic_addr has entry point of executable.
+        // Thus we should substract it.
+        ph->core->dynamic_addr += exec_php->p_vaddr - exec_ehdr->e_entry;
+      }
       print_debug("address of _DYNAMIC is 0x%lx\n", ph->core->dynamic_addr);
       break;
     }
@@ -1030,8 +1048,9 @@
     goto err;
   }
 
-  if (read_elf_header(ph->core->exec_fd, &exec_ehdr) != true || exec_ehdr.e_type != ET_EXEC) {
-    print_debug("executable file is not a valid ELF ET_EXEC file\n");
+  if (read_elf_header(ph->core->exec_fd, &exec_ehdr) != true ||
+      ((exec_ehdr.e_type != ET_EXEC) && (exec_ehdr.e_type != ET_DYN))) {
+    print_debug("executable file is not a valid ELF file\n");
     goto err;
   }
 
--- a/hotspot/src/share/vm/ci/ciMethod.cpp	Mon Feb 13 14:39:50 2017 -0800
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp	Mon Feb 13 22:43:50 2017 +0000
@@ -1428,8 +1428,12 @@
 
   if (!invoke_through_mh_intrinsic) {
     // Method name & descriptor should stay the same.
+    // Signatures may reference unloaded types and thus they may be not strictly equal.
+    ciSymbol* declared_signature = declared_method->signature()->as_symbol();
+    ciSymbol* resolved_signature = resolved_method->signature()->as_symbol();
+
     return (declared_method->name()->equals(resolved_method->name())) &&
-           (declared_method->signature()->equals(resolved_method->signature()));
+           (declared_signature->equals(resolved_signature));
   }
 
   ciMethod* linker = declared_method;