Blame SOURCES/dyninst-9.2.0-proccontrol-attach-no-exe.patch

43d1af
commit 6e1b36f62c0830978ab4db44f763e030cc74a18d (from 6cca9d0ee6a4676028e511e2c5384ed959b1816f)
43d1af
Merge: 6cca9d0ee6a4 0be0ab88a5d9
43d1af
Author: Josh Stone <cuviper@gmail.com>
43d1af
Date:   Tue Aug 9 16:33:52 2016 -0700
43d1af
43d1af
    Merge pull request #147 from cuviper/attach-no-exe
43d1af
    
43d1af
    proccontrol: fix process attachment without an exe
43d1af
43d1af
diff --git a/proccontrol/src/linux.C b/proccontrol/src/linux.C
43d1af
index 4502e357f79f..407a77ec6ecf 100644
43d1af
--- a/proccontrol/src/linux.C
43d1af
+++ b/proccontrol/src/linux.C
43d1af
@@ -884,8 +884,9 @@ int linux_process::computeAddrWidth()
43d1af
     * of name word will be 0x0 on 64 bit processes.  On 32-bit process this
43d1af
     * word will contain a value, of which some should be non-zero.
43d1af
     *
43d1af
-    * We'll thus check every word that is 1 mod 4.  If all are 0x0 we assume we're
43d1af
-    * looking at a 64-bit process.
43d1af
+    * We'll thus check every word that is 1 mod 4 for little-endian machines,
43d1af
+    * or 0 mod 4 for big-endian.  If all words of either stripe are 0x0, we
43d1af
+    * assume we're looking at a 64-bit process.
43d1af
     **/
43d1af
    uint32_t buffer[256];
43d1af
    char auxv_name[64];
43d1af
@@ -898,25 +899,21 @@ int linux_process::computeAddrWidth()
43d1af
       return -1;
43d1af
    }
43d1af
 
43d1af
-   long int result = read(fd, buffer, sizeof(buffer));
43d1af
-   long int words_read = result / sizeof(uint32_t);
43d1af
-   int word_size = 8;
43d1af
+   ssize_t result = read(fd, buffer, sizeof(buffer));
43d1af
+   ssize_t words_read = (result / sizeof(uint32_t)) & ~3;
43d1af
+   close(fd);
43d1af
 
43d1af
    // We want to check the highest 4 bytes of each integer
43d1af
    // On big-endian systems, these come first in memory
43d1af
-   SymReader *objSymReader = getSymReader()->openSymbolReader(getExecutable());
43d1af
-   int start_index = objSymReader->isBigEndianDataEncoding() ? 0 : 1;
43d1af
-
43d1af
-   for (long int i=start_index; i
43d1af
+   bool be_zero = true, le_zero = true;
43d1af
+   for (ssize_t i=0; i
43d1af
    {
43d1af
-      if (buffer[i] != 0) {
43d1af
-         word_size = 4;
43d1af
-         break;
43d1af
-      }
43d1af
+     be_zero &= buffer[i] == 0;
43d1af
+     le_zero &= buffer[i+1] == 0;
43d1af
    }
43d1af
-   close(fd);
43d1af
 
43d1af
-   pthrd_printf("computeAddrWidth: Offset set to %d, word size is %d\n", start_index, word_size);
43d1af
+   int word_size = (be_zero || le_zero) ? 8 : 4;
43d1af
+   pthrd_printf("computeAddrWidth: word size is %d\n", word_size);
43d1af
    return word_size;
43d1af
 }
43d1af
 
43d1af
diff --git a/proccontrol/src/loadLibrary/codegen.C b/proccontrol/src/loadLibrary/codegen.C
43d1af
index 9d545a7a5f70..a29b61450a04 100644
43d1af
--- a/proccontrol/src/loadLibrary/codegen.C
43d1af
+++ b/proccontrol/src/loadLibrary/codegen.C
43d1af
@@ -33,9 +33,11 @@ bool Codegen::generate() {
43d1af
 
43d1af
    buffer_.initialize(codeStart_, size);
43d1af
 
43d1af
-   SymReader *objSymReader = proc_->llproc()->getSymReader()->openSymbolReader(proc_->llproc()->getExecutable());
43d1af
    abimajversion_ = abiminversion_ = 0;
43d1af
-   objSymReader->getABIVersion(abimajversion_, abiminversion_);
43d1af
+   auto exe = proc_->libraries().getExecutable();
43d1af
+   SymReader *objSymReader = proc_->llproc()->getSymReader()->openSymbolReader(exe->getName());
43d1af
+   if (objSymReader)
43d1af
+      objSymReader->getABIVersion(abimajversion_, abiminversion_);
43d1af
 
43d1af
    if (!generateInt()) return false;
43d1af