← Back to team overview

sslug-teknik team mailing list archive

Re: Fra dynamisk til statisk efter linkning til færdigt program.

 

On Thu, 12 Aug 1999, Mads Bondo Dydensborg wrote:

> ER der en måde at lave selve den binære gzip om til et statisk linket
> program? Jeg er klar over, at jeg kan hente sourcen til gzip og oversætte

> Eller er det fuldkommen sindsygt?

Næsten :) Dynamisk linkede programmer kræver et ekstra hop til de
funktioner der er i shared libraries, idet disse adresser er kun kendt når
programmet afvikles. Hop adresserne, og det er noget der styres af
linkeren vha. den information der ligger i object filerne.

Her er en dynamisk main (objdump -dS):

08048570 <main>:
 8048570:       55                      pushl  %ebp
 8048571:       89 e5                   movl   %esp,%ebp
        return printf("hello world\n");
 8048573:       68 cc 94 04 08          pushl  $0x80494cc
 8048578:       e8 a7 fe ff ff          call   8048424 <_init+0x44>
 804857d:       83 c4 04                addl   $0x4,%esp
 8048580:       89 c2                   movl   %eax,%edx
 8048582:       89 d0                   movl   %edx,%eax
 8048584:       eb 0a                   jmp    8048590 <main+0x20>
}


Her hoppes der til printf via et sted i programmet som bliver fixet med de
rigtige adresser når den dynamiske linker (altså den der kører på
runtime-tidspunktet) starter programmet.


Her er en statisk main:

08048190 <main>:
 8048190:       55                      pushl  %ebp
 8048191:       89 e5                   movl   %esp,%ebp
        return printf("hello world\n");
 8048193:       68 00 af 05 08          pushl  $0x805af00
 8048198:       e8 43 13 00 00          call   80494e0 <_IO_printf>
 804819d:       83 c4 04                addl   $0x4,%esp
 80481a0:       89 c2                   movl   %eax,%edx
 80481a2:       89 d0                   movl   %edx,%eax
 80481a4:       eb 0a                   jmp    80481b0 <main+0x20>
}


her ligger det hele i een kode segment, så man ved hvilket adresse tingene
ligger på.

Bemærk også at adressen på strengen er anderldes i de to eksempler. Det er
også noget linkeren tager sig af på kompileringstidspunktet.




-- 
==============================================================================
Erwin Andreasen   Herlev, Denmark <erw@xxxxxx>          UNIX System Programmer
<URL:http://www.andreasen.org>              <*>         (not speaking for) DDE
==============================================================================



References