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.