[parisc-linux] Program counter from sigcontext, constructurs and -fPIC

Carlos O'Donell carlos@baldric.uwo.ca
Fri, 25 Apr 2003 14:54:14 -0400


Hans,

What code are you porting? :)

> 1) I need to retrieve the pc value from the sigcontext structure passed to a timer signal handler.  In an earlier message, Paul Bame pointed me at sc_iaoq.  After a bit more reading, my conclusion was that sc_iaoq[0] should be a reasonable value to use as a sampled pc.  However I have been unable to see anything reasonable in that slot (or sc_iaoq[1] for that matter).  Presumably a struct sigcontext pointer is always passed as the third parameter to a signal handler?  And it's filled in for timer interrrupts?  What does profil() do?  (I tried to read the code, but it's hard to trace through all the configuration stuff.)

A. What kernel are you using?
 
The reason I ask is that 64-bit kernels return broken sigcontext
pointers (for now it stuffs 64-bit values into a 32-bit values within
the sigcontext, rather it should take into account the fact that
userspace or the calling threads personality is 32-bit and truncate the
register values).

What is there to understand about profil()? Based on your PC it uses
modular arithmetic (the shift, scale, and division) to track on a coarse
scale which parts of your code are being executed.

> 2) If I mark a C function as a constructor function, and compile it with -fPIC, it seems to run before globals are properly accessible.  The retrieval of the address of a global through the global offset table seems to return a bad address and the access faults.  Are there known issues in this area?  (The offending function actually ends up in the main program, if that matters.)

B. Can we see the code?

c.