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)!