jacob navia writes:
 > Hi
 > 
 > Context:
 > 
 > I am writing a JIT and need to register the frame information about
 > the generated program within the context of a larger C++ program
 > compiled with g++. Stack layout is like this:
 > 
 >         catch established by C++
 >         JITTED code generated dynamically
 >         JITTED code
 >         JITTED code calls a C++ routine
 >         C++ routine calls other C++ routines
 >         C++ routine makes a THROW
 > 
 > The throw must go past the JITTED code to the established C++ catch.
 > 
 > Problem.
 > 
 > The stack unwinder stops with END_OF_STACK at the Jitted code. Why?
 > Following the code with the debugger I see that the unwider looks
 > for the next frame using the structures established by the dynamic loader,
 > specifically in the function "__dl_iterate_phdr" in the file
 > "dl-iteratephdr.c" in the glibc.
 > 
 > So, this means:
 > 
 > 1) I am cooked and what I want to do is impossible. This means I will 
 > probably
 >    get cooked at work for proposing something stupid like this :-)
 > 
 > 2) There is an API or a way of adding at run time a routine to the lists
 >    of loaded objects in the same way as the dynamic loader does.
 > 
 > PLEEEEEEZE do not answer with:
 > 
 > "Just look at the code of the dynamic loader!"
 > 
 > because I have several megabytes of code to understand already!!!!!!!!!
 > 
 > I am so near the end that it would be a shame to stop now. My byte
 > codes for the DWARF interpreter LOAD into the interpreter
 > successfully, and they are executed OK, what has costed me several
 > weeks of efforts, wading through MBs of code and missing/wrong
 > specs.
 > 
 > I just would like to know a way of registering (and deregistering
 > obviously) code that starts at address X and is Y bytes long. JUst
 > that.

The way you do not reply to mails replying to your questions doesn't
encourage people to help you.  Please try harder to answer.

I suspect that the gcc unwinder is relying on __dl_iterate_phdr to
scan the loaded libraries and isn't using the region that you have
registered.

But this is odd, becasue when I look at _Unwind_Find_FDE in
unwind-dw2-fde-glibc.c, I see:

  ret = _Unwind_Find_registered_FDE (pc, bases);

  ...

  
  if (dl_iterate_phdr (_Unwind_IteratePhdrCallback, &data) < 0)
    return NULL;

So, it looks to me as though we do call _Unwind_Find_registered_FDE
first.  If you have registered your EH data, it should be found.

So, what happens when _Unwind_Find_registered_FDE is called?  Does it
find the EH data you have registered?

Andrew.

Reply via email to