On Friday 07 March 2008 Ian Lance Taylor wrote:
> "Philipp Marek" <[EMAIL PROTECTED]> writes:
> >>   Shouldn't this be done in the linker instead?
> >
> > Well, can the linker change the instruction sequences? Ie. put a JMP
> > instead of other code?
>
> Sure.  The linker can do whatever it likes.  The usual problem is that
> by the time the linker sees the code, it no longer knows about PC
> relative references within the same section.  So if you have
>
>     call foo
>     ...
>     sequence to remove
>     ...
> foo:
>
> and the call is PC-relative, then when the linker removes the sequence
> of instructions it will not know that it needs to adjust the call to
> foo.
Right.

> What you are describing is a type of linker relaxation, and the same
> issues arise there.  The usual solution is to force the assembler to
> emit all PC-relative relocations, so that the linker knows about them
> and is able to adjust them.
But what we'd need above is to have the compiler make a reference to 
[removed_sequence + offset] instead, and that could be done by the linker 
again.

So when the compiler removes a piece of code by a "jump <symbol>", it can use 
offsets in there as usual.

> Linker relaxation is used routinely in special sections, such as the
> .eh_frame section used to hold stack unwind information for throwing
> exceptions.  It is also used for code sequences on some processors,
> but normally not on the i386/x86_64.
Thank you very much for this information!


Another idea: if we find out that such sequences are *very* common (eg. by 
comparing many different binaries and libraries), libc (or a libcommon or 
something like that) could have a set of these "abbreviations" - eg. indexed 
by symbol, which is defined as MD5_hex(removed section).


-- 
Versioning your /etc, /home or even your whole installation?
             Try fsvs (fsvs.tigris.org)!

Reply via email to