public inbox for frysk@sourceware.org
 help / color / mirror / Atom feed
* Quick pc hack for exe loading
@ 2007-11-23 11:35 Mark Wielaard
  2007-11-23 17:14 ` Rick Moseley
  0 siblings, 1 reply; 8+ messages in thread
From: Mark Wielaard @ 2007-11-23 11:35 UTC (permalink / raw)
  To: frysk; +Cc: rmosely

[-- Attachment #1: Type: text/plain, Size: 1070 bytes --]

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

[-- Attachment #2: exe-pc.patch --]
[-- Type: text/x-patch, Size: 1541 bytes --]

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);
   }
 }

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2007-11-28  9:15 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-11-23 11:35 Quick pc hack for exe loading Mark Wielaard
2007-11-23 17:14 ` Rick Moseley
2007-11-23 17:30   ` Andrew Cagney
2007-11-26 10:40     ` Mark Wielaard
2007-11-26 16:52       ` Andrew Cagney
2007-11-27  8:25         ` Mark Wielaard
2007-11-27 14:40           ` Andrew Cagney
2007-11-28  9:15             ` Mark Wielaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).