"Jonathan S. Shapiro" <[EMAIL PROTECTED]> writes:

> On Fri, 2007-08-03 at 11:06 -0400, Daniel Jacobowitz wrote:
> > crtbeginT.o is used for -static; crtbegin.o is used without -static.
> > I don't recall why they have to be different.
> 
> So far as we can tell from looking at the linux versions, the only
> difference is that crtbeginT is calling
> 
>       register_frame_info_bases
>       deregister_frame_info_bases
> 
> I suspect that these are related to the exception frame walker, because
> if --static (therefore crtbeginT) is provided then --eh-frame-header is
> not applied by default. That is: I suspect that --static does not
> support exception frame walking. This smells like a Linux legacy issue
> that may not apply to us. Can anybody confirm or correct that guess?

If you pass --eh-frame-header to the linker, it will create a
PT_GNU_EH_FRAME segment in the output file.  The code in
gcc/unwind-dw2-fde-glibc.c will locate that segment by using
dl_iterate_phdr.  dl_iterate_phdr is provided by glibc.  At one time
it only worked for dynamically linked binaries, but I believe that it
currently also works for statically linked binaries.  So I believe
that in principle it would now be possible to use --eh-frame-header
and unwind-dw2-fde-glibc.c with statically linked binaries.  But I
haven't actually tried.

In order for you to use --eh-frame-header, your libc will need to
provide dl_iterate_phdr.  The advantage of this approach is that it
does not require registering the exceptions at program start time,
thus saving a bit of startup time.  Also, if everything works
correctly, the linker will create a sorted list of FDEs, which will
permit faster lookup of the required stack unwinding information when
an exception occurs.

If you don't have dl_iterate_phdr, then you will need to call
register_frame_info_bases at startup time.  And you won't want to use
--eh-frame-header.

All of this is completely ELF specific, by the way.

Ian

Reply via email to