This is the mail archive of the frysk@sourceware.org mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Quick pc hack for exe loading


Hi Rick,

I wanted to test some libunwind lookup changes I made locally and the
exe target is nice for that since it is so simple. The attached patch
sets up the PC value and makes it possible to see where the exe would
start:

(fhpd) load /bin/bash
Loaded executable file: /bin/bash
(fhpd) where
[0.0]
DebugInfoStackFactory.printStackTrace() numberOfFrames 0
#0 0x0000000000419150 in _start () from /bin/bash

It still cannot actually do the other way around though:

(fhpd) print _start
[0.0]
Error: Object _start was not found

Haven't looked into why that was since I was only interested in the
stack thing.

2007-11-23  Mark Wielaard  <mwielaard@redhat.com>

        * LinuxExeTask.java (bankBuffers): New final field.
        (LinuxExeTask): Setup bankBuffers and explicitly set pc.
        (sendrecRegisterBanks): Use cached bankBuffers.

It is a bit of a hack (as the comment explains), but it seems to work
great and all tests still pass with this applied. Feel free to rip it
out and completely replace with a real, less hacky, solution though.

Cheers,

Mark
diff --git a/frysk-core/frysk/proc/dead/LinuxExeTask.java b/frysk-core/frysk/proc/dead/LinuxExeTask.java
index 3eb584c..1302be5 100644
--- a/frysk-core/frysk/proc/dead/LinuxExeTask.java
+++ b/frysk-core/frysk/proc/dead/LinuxExeTask.java
@@ -47,17 +47,44 @@ import frysk.proc.TaskId;
 import frysk.proc.TaskState;
 import frysk.isa.ISA;
 
+import lib.dwfl.*;
 
 public class LinuxExeTask extends DeadTask
 {
 
   LinuxExeProc proc = null;
   TaskId id = null;
+
+  // Holds all the register values, setup once in the constructor.
+  private final ByteBuffer[] bankBuffers;
   
   protected LinuxExeTask(LinuxExeProc proc, TaskId id, TaskState state) {
       super(proc, id, state);
       this.proc = proc;
       this.id = id;
+      this.bankBuffers = sendrecRegisterBuffersFIXME();
+
+      // Fake PC.  XXX should be done in Proc instead of creating Elf
+      // object in the Task itself.
+      long pc;
+      Elf e = null;
+      try
+	{
+	  e = new Elf(getProc().getExe(), ElfCommand.ELF_C_READ);
+	  ElfEHeader h = e.getEHeader();
+	  pc = h.entry;
+	}
+      catch (ElfException ee)
+	{
+	  // Nice try, just give up.
+	  pc = 0;
+	}
+      finally
+	{
+	  if (e != null)
+	    e.close();
+	}
+      getIsa().setPC(this, pc);
   }
   
   protected ISA sendrecISA() {
@@ -93,6 +120,6 @@ public class LinuxExeTask extends DeadTask
 
   protected RegisterBanks sendrecRegisterBanks() {
       return CorefileRegisterBanksFactory.create
-      	  (getISA(), sendrecRegisterBuffersFIXME());
+      	  (getISA(), bankBuffers);
   }
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]