Re: syscalls mittels ld -wrap abfangen
- From: Rainer Weikusat <rainer.weikusat@xxxxxxxxx>
- Date: Sun, 23 Apr 2006 14:26:05 +0200
Thomas Maier-Komor <thomas@xxxxxxxxxxxxxx> writes:
Rainer Weikusat wrote:
Thomas Maier-Komor <thomas@xxxxxxxxxxxxxx> writes:
[...]
Warum dynamisch linken und nicht statisch? Es gibt auf PCs keinen Grund
mehr überhaupt noch statisch zu linken, denn die einzigen Vorteile die
man dadurch bekommt, sind marginal schnellere Startzeiten und
vernachlässigbare Einsparungen beim Speicherbedarf.
Das ist nicht ganz richtig. Bei einer dynamisch zu einem binary
dazugelinkten Bibliothek geht jeder Aufruf einer Routine aus dieser
Bibliothek zu einem bestimmten Ort in der procedure linkage table
(PLT), die die aufzurufende Routine indirekt ueber ihre in der global
offset table gespeicherte Adresse aufruft, dh jeder solche Aufruf ist
de facto ein indirekter Aufruf (ueber function pointer).
[...]
Ja, stimmt. Es muss aber nicht so sein. Ein neuerer ld.so könnte es
anders machen.
Aussagen im Irrealis sind immer ein wenig zweckfrei. Der Solaris
Linker and Libraries Guide' meint dazu:
[...]
If a shared object is built from position-dependent code, the
text segment can require modification at runtime. This
modification allows relocatable references to be assigned to
the location that the object has been loaded. The relocation
of the text segment requires the segment to be remapped as
writable. This modification requires a swap space reservation,
and results in a private copy of the text segment for the
process. The text segment is no longer sharable between
multiple processes. Position-dependent code typically requires
more runtime relocations than the corresponding
position-independent code. Overall, the overhead of processing
text relocations can cause serious performance degradation.
When a shared object is built from position-independent code,
relocatable references are generated as indirections through
data in the shared object's data segment. The code within the
text segment requires no modification.
(UR:<http://docs.sun.com/app/docs/doc/817-1984/6mhm7pl1r?a=view#chapter4-29405>)
Und das Programm möchte ich sehen, bei dem dieses Verfahren zu einem
_messbaren_ und _nennenswerten_ Geschwindigkeitsverlust führt.
Hierzu muesste man erst mal ein Verfahren definieren, mit dessen Hilfe
man den overhead dieser Vorgehensweise in einem 'real world program'
ueberhaupt messen kann und ich bezweifle, dass dies moeglich ist, ohne
das Verhalten dieses Programms selber soweit zu veraendern, dass die
Resultate nichts mehr aussagen. Daraus, dass man etwas nicht sinnvoll
messen kann, folgt aber nicht, dass es nicht existiert und einen
realen Einfluss hat. Der 'nennenswerte Verlust' fuehrt auch in die
Irre: Eine ausreichend grosse Summe einzeln nicht nennenswerter
'Verluste' langt aus, um ein Regiment vollstaendig aufzureiben, obwohl
zu jedem Beobachtungszeitpunkt vielleicht nur ein 1/3000 der
Sollstaerke das Zeitliche gesegnet hatte.
Aber ich wollte eigentlich gar nicht etwas gegen dynamisches Linken
sagen, sondern nur darauf hinweisen, dass das (wie alles) auch nicht
umsonst ist. Man gewinnt verschiedene Vorteile (die Du genannt
hattest), bezahlt aber dafuer den Preis aufwendigerer
Kontrolltransfers.
Je nachdem, was man vorhat, kann man Vorteile oder Nachteile fuer
gewichtiger halten, aber um das zu koennen, muss man ueberhaupt erst
mal von ihnen wissen.
Außerdem muss das Programm so gelinkt sein, dass nur die notwendigen
Symbole ins Binary übernommen werden und nicht die ganze Bibliothek (das
macht der GNU ld nicht automatisch!).
Aber ganz sicher doch: Es werden alle members das statischen Archivs
eingebunden, aus denen Code oder Daten mittels der diesen zugeordneten
Symbolen referenziert wurden. Das ist auch wenigstens schon 'seit
ewigen Zeiten' so (mit 'seit ewigen Zeiten' ::= 'wenigstens seit 1995'
als ich das in der Dokumentation zu meinem ersten Linux gelesen habe
[RH2.0]).
Dann kannst Du mir sicher erklären was ich hier falsch gemacht habe:
[...]
thomas@smaug:~$ gcc -static h.o
thomas@smaug:~$ size a.out
text data bss dec hex filename
412816 3752 3220 419788 667cc a.out
thomas@smaug:~$ nm a.out | wc -l
1376
thomas@smaug:~$ ls -l a.out
-rwxr-xr-x 1 thomas thomas 4607673 2006-04-22 22:14 a.out*
Nichts. Nur die Schlussfolgerung ist nicht ganz korrekt: Das ist keine
Folge fehlender features im Linker, sondern eine der Struktur der Gnu
C-Library, die eben nennenswerte Teile von sich selber auch selber
benoetigt (Uli D. ist 'by design' eigenlich C++-Programmierer ...)
.
- Follow-Ups:
- Re: syscalls mittels ld -wrap abfangen
- From: Thomas Maier-Komor
- Re: syscalls mittels ld -wrap abfangen
- References:
- syscalls mittels ld -wrap abfangen
- From: Martin Mois
- Re: syscalls mittels ld -wrap abfangen
- From: Martin Mois
- Re: syscalls mittels ld -wrap abfangen
- From: Thomas Maier-Komor
- Re: syscalls mittels ld -wrap abfangen
- From: Rainer Weikusat
- Re: syscalls mittels ld -wrap abfangen
- From: Thomas Maier-Komor
- syscalls mittels ld -wrap abfangen
- Prev by Date: Re: syscalls mittels ld -wrap abfangen
- Next by Date: Re: Probleme mit GLUT, X11 und Debian
- Previous by thread: Re: syscalls mittels ld -wrap abfangen
- Next by thread: Re: syscalls mittels ld -wrap abfangen
- Index(es):
Relevant Pages
|