elf_update(3E) elf_update(3E)
NAME
elfupdate - ELF-Deskriptor aktualisieren
SYNTAX
cc [option ...] datei ... -lelf [bibliothek ...]
#include <libelf.h>
offt elfupdate(Elf *elf, ElfCmd cmd);
BESCHREIBUNG
elfupdate() veranlaßt die Bibliothek zur Prüfung der Informationen,
die mit dem ELF-Deskriptor elf verknüpft sind, und zur Neuberechnung
der strukturellen Daten, die zur Generierung der Dateidarstellung not-
wendig sind.
cmd kann folgende Werte annehmen:
ELFCNULL
Dieser Wert teilt elfupdate() mit, die verschiedenen Werte neu
zu berechnen und nur die Speicherstrukturen des ELF-Deskriptors
zu aktualisieren. Alle modifizierten Strukturen werden mit dem
ELFFDIRTY-Bit markiert. Ein Programm kann daher die strukturel-
len Informationen aktualisieren und sie dann erneut überprüfen,
ohne daß die Datei, die mit dem ELF- Deskriptor verknüpft ist,
verändert wird. Da dies die Datei nicht ändert, kann der ELF-
Deskriptor zum Lesen, Schreiben oder zu beidem geöffnet sein
[siehe elfbegin(3E)].
ELFCWRITE
Enthält cmd diesen Wert, so geht elfupdate() genauso vor wie bei
ELFCNULL und schreibt zusätzlich sämtliche markierten ("dirty")
Informationen, die mit dem ELF-Deskriptor verknüpft sind, in die
Datei. Wenn also ein Programm elfgetdata() oder elfflag()
benutzt hat, um neue Informationen für den ELF-Deskriptor anzule-
gen (oder alte Informationen zu aktualisieren), so werden diese
Daten geprüft, abgestimmt, bei Bedarf umgesetzt [siehe
elfxlate(3E)] und dann in die Datei geschrieben. Wenn Teile der
Datei geschrieben werden, werden deren ELFFDIRTY-Bits gelöscht;
dies bedeutet, daß diese Objekte nicht länger in die Datei
geschrieben werden müssen [siehe elfflag(3E)]. Die Abschnittsda-
ten werden in der Reihenfolge der Abschnittskopfeinträge
geschrieben, und die Abschnittskopftabelle wird an das Dateiende
geschrieben.
Wurde der ELF-Deskriptor mit elfbegin() angelegt, muß er das
Schreiben der Datei erlauben. Dies bedeutet, daß das entspre-
chende Kommando für elfbegin() entweder ELFCRDWR oder
ELFCWRITE sein muß.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
elf_update(3E) elf_update(3E)
Wenn elfupdate() erfolgreich ausgeführt wird, wird die Gesamtlänge
der Dateidarstellung zurückgeliefert (nicht der Speicherdarstellung).
Ansonsten ist ein Fehler aufgetreten, und die Funktion liefert -1.
Beim Aktualisieren der internen Strukturen setzt elfupdate() selbst
einige Komponenten. Die unten aufgelisteten Komponenten unterliegen
der Verantwortung des Anwendungsprogramms und beinhalten diejenigen
Werte, welche durch das Programm vorgegeben wurden.
Komponente | Hinweise
__________________|______________________________________________
eident[EIDATA]| Bibliothek kontrolliert andere eident-Werte
etype |
emachine |
eversion |
ELF-Kopf eentry |
ephoff | nur bei Angabe von ELFFLAYOUT
eshoff | nur bei Angabe von ELFFLAYOUT
eflags |
eshstrndx |
_________________|______________________________________________
Komponente| Hinweise
___________|_____________________________________
pty | Das Anwendungsprogramm kontrolliert
poffset | alle Programmkopfeinträge
pvaddr |
ppaddr |
Programmkopf pfilesz |
pmemsz |
pflags |
palign |
___________|_____________________________________
Komponente | Hinweise
______________|_________________________________
shname |
shtype |
shflags |
shaddr |
Abschnittskopf shoffset | nur bei Angabe von ELFFLAYOUT
shsize | nur bei Angabe von ELFFLAYOUT
shlink |
shinfo |
shaddralign| nur bei Angabe von ELFFLAYOUT
shentsize |
_____________|_________________________________
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
elf_update(3E) elf_update(3E)
Komponente| Hinweise
____________|_________________________________
dbuf |
dtype |
Datendeskriptor dsize |
doff | nur bei Angabe von ELFFLAYOUT
dalign |
dversion |
___________|_________________________________
Zu beachten ist, daß das Programm für zwei besonders wichtige Komponen-
ten (neben den anderen) im ELF-Kopf verantwortlich ist. Die Komponente
eversion kontrolliert die Version der Datenstrukturen, die in die
Datei geschrieben werden. Ist die Version EVNONE, so verwendet die
Bibliothek die eigene interne Version. Der Eintrag eident[EIDATA]
kontrolliert die Datencodierung der Datei. Als Spezialfall darf dieser
Wert ELFDATANONE annehmen, um die herkömmliche Datencodierung der loka-
len Maschine auszuwählen. Ein Fehler tritt dann auf, wenn die herkömm-
liche Dateicodierung keiner Dateicodierung entspricht, die die Biblio-
thek kennt.
Weiterhin ist zu beachten, daß das Programm für die Komponente
shentsize des Abschnittskopfs verantwortlich ist. Obwohl die Biblio-
thek diese Komponente für Abschnitte bekannten Typs setzt, ist nicht
garantiert, daß der korrekte Wert für alle Abschnitte bekannt ist.
Daher verläßt sich die Bibliothek darauf, daß das Programm die ent-
sprechenden Werte für unbekannte Abschnittstypen selbst einträgt. Wenn
die Eintragsgröße unbekannt oder nicht anwendbar ist, sollte der Wert
auf Null gesetzt werden.
Bei der Entscheidung, wie die Ausgabedatei erzeugt werden soll, rich-
tet sich elfupdate() bei der Erzeugung der Ausgabeabschnitte nach den
Ausrichtungen der einzelnen Datenpuffer. Der Datenpuffer mit der
strengsten Ausrichtungsbeschränkung kontrolliert die Ausrichtung des
gesamten Abschnitts. Falls notwendig, fügt die Bibliothek auch Leer-
räume zwischen Puffern ein, um somit die korrekte Ausrichtung jedes
Puffers zu garantieren.
HINWEISE
Wie bereits erwähnt, übersetzt das Kommando ELFCWRITE bei Bedarf die
Daten, bevor sie in die Datei geschrieben werden. Diese Übersetzung
ist für das Anwendungsprogramm nicht immer transparent. Wenn ein Pro-
gramm Zeiger für den Zugriff auf Daten einer Datei unterhält [siehe
beispielsweise elfgetehdr(3E) und elfgetdata(3E)], sollte das Pro-
gramm die Zeiger nach dem Aufruf von elfupdate() neu aufbauen.
Wie unter elfbegin(3E) beschrieben, kann ein Programm eine COFF-Datei
"aktualisieren", um das Abbild konsistent mit dem ELF-Format darstel-
len zu können. Das Kommando ELFCNULL aktualisiert nur die Speiche-
rabbildung; man kann das Kommando ELFCWRITE dazu verwenden, die
Datei zu modifizieren. Absolute, ausführbare Dateien (a.out-Dateien)
erfordern eine spezielle Ausrichtung, welche zwischen dem COFF- und
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
elf_update(3E) elf_update(3E)
dem ELF-Format nicht beibehalten werden kann. Daher kann eine ausführ-
bare COFF-Datei mit dem Kommando ELFCWRITE nicht aktualisiert werden
(ELFCNULL ist jedoch erlaubt).
SIEHE AUCH
elf(3E), elfbegin(3E), elfflag(3E), elffsize(3E), elfgetdata(3E),
elfgetehdr(3E), elfgetshdr(3E), elfxlate(3E).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98