Subject: Re: New idea on ELF prebinding
To: Luke Mewburn <lukem@netbsd.org>
From: Bang Jun-Young <junyoung@netbsd.org>
List: tech-userlevel
Date: 11/22/2002 16:27:30
On Fri, Nov 22, 2002 at 05:48:43PM +1100, Luke Mewburn wrote:
> On Fri, Nov 22, 2002 at 03:18:28PM +0900, Bang Jun-Young wrote:
>   | Here's the summary of what I have been thinking about ELF prebinding
>   | since a couple times of objections from people against my previous
>   | not-good implementation ;-):
> 
> some minor issues.
> 
> 
>   | - Every binary, including executable and shared object, has .csum
>   |   section inserted by ld(1) at compile time. It is 32-bit long and
>   |   used for storing checksum (CRC32) of the binary.
> 
> i'd prefer md5 or sha1 as a hash.

The basic idea is to use the checksum as a filename to lookup. For
example, if the checksum is FB369ADB, then ld.elf_so(1) tries to
find a file of the same name in /usr/libdata/reloc. So you don't
have to worry about moving binaries.

I thought about MD5 as well, but it is too long to be used as a file
name. Probably a better method would be needed...

> 
> 
>   | - Actual prebinding and prerelocation is done by ld.elf_so(1). After 
>   |   ld.elf_so(1) loads a binary for the first time, it creates a disk
>   |   file in /usr/libexec/reloc (say it "cache") and writes all of the
> 
> /var/db/reloc (persistent) or /var/run/reloc (lost at reboot) are
> better locations...

(Euch, it was a typo. /usr/libexec/reloc -> /usr/libdata/reloc).

/var/db/reloc is good.

> 
> 
>   |   relocated GOT and PLT sections in memory to the file (checksum and
>   |   other necessary information as well). In any subsequent execution
>   |   of the same binary, ld.elf_so(1) no longer performs relocation.
>   |   Instead it loads cache from the disk file previously created and
>   |   compares cache information and in-memory data. If they don't differ,
>   |   it patches GOT/PLT pointers so that they point to locations in the
>   |   cache. But if they differ, ld.elf_so(1) will do the same job. 
>   | 
>   | - As time goes by, there will be more caches stored in /usr/libexec/reloc.
>   |   If needed, elfreld(1) daemon regularly check if they are still valid, and
>   |   removes invalid files. Or you can remove all of them, and ld.elf_so(1)
>   |   will perform the same job again for each binary it loads.
> 
> do we even need an elfreld daemon?  does it matter if the cache grows.

So that someone won't complain about ever-growing cache directory. ;-)

Thanks for your comments,

Jun-Young

-- 
Bang Jun-Young <junyoung@netbsd.org>