NetBSD Dokumentation:NetBSD ELF FAQ |
Es gibt eine Standardliste von Verzeichnissen, die vom Laufzeitlader (ld.elf_so) durchsucht werden, wobei das bei den meisten Systemen nur /usr/lib ist. Ältere Versionen (vor 1.4) durchsuchten auch /usr/local/lib.
Der primäre Mechanismus um das Verzeichnis einer shared library zu finden, ist die ``rpath''-Liste, die in dem Programm eingebettet ist. Diese Liste wird durch die -R Option von ld(1) gesetzt. Die Posix-syntax, um ld optionen vom Compiler durchzureichen ist
-Wl,option,option,...
Zum Beispiel: -Wl,-R/usr/something/lib
.
Einer Anwendung können mehrere -R-Direktiven
übergeben werden, um eine Suchliste aufzubauen.
Diese Direktive ist auch als -rpath bekannt. Die Benutzung von -R hat den Vorteil, dass diese Direktive auch auf älteren Versionen von NetBSD funktioniert.
Der Gedanke dabei ist, dass Makefiles nur mit der .so Datei binden wollen werden (Wer will sich schon durch alle Makefiles lesen und sie verändern nur weil eine neue Version einer library installiert wurde?). Sobald das Programm gebunden ist, wird es die major Version einer library kennen wollen, jedoch wird es die minor Version einer library nicht beachten wollen.
Konsequenterweise weiss die library dass sie selbst libgizmo.so.4 ist, weil während ihrer Erschaffung eine -soname libgizmo.so.4 benutzt wurde. Das Programm weiss, dass es libgizmo in der major Version 4 bekommen hat, weil der Binder den libgizmo.so.4 DT_SONAME string aus der library in die ausführbare Programmdatei kopiert und gespeichert hat.
Man benutzt normalerweise nicht -soname libgizmo.so, weil sonst das Programm immer die neueste major Version benutzen würde und nicht mehr funktionieren würde, sobald jene geändert würde. (Bemerkung: Die major Version einer library wird nur geändert, wenn die neue library mit der alten inkompatibel ist.) Genauso benutzt man nicht -soname libgizmo.so.4.2, weil dann bei Installation einer kompatiblen Änderung der library unnötigerweise die damit gebundenen Programme nicht mehr funktionieren würden.
cc -O -Werror -c -fpic -DPIC f.c -o f.so
ar cq libf_pic.a `NM=nm lorder f.so | tsort -q`
ld -x -shared -R/my/directory/lib -soname libf.so.4 -o
libf.so.4.9 /usr/lib/crtbeginS.o --whole-archive
libf_pic.a /usr/lib/crtendS.o
Oder:
% cat Makefile
LIB=f
SRCS=f.c
.include <bsd.lib.mk>
% cat shlib_version
major=4
minor=9
% make
Sie können einige der Makefile
targets mit NOPROFILE=1
und NOSTATICLIB=1 ausblenden.
Und noch eine Möglichkeit:
libtool
- Daslibtool
Paket ist ein umfangreiches Shellskript, das benutzt wird um plattformunabhängig shared und static libraris zu handhaben. Es gibt ein NetBSD libtool Paket, und sogar einelibtool
home page.
Tatsächich haben einige der ELF-Entwickler solch eine Datei vorgesehen, aber mit unterschiedlichen Resultaten. Der ELF-Mechanismus wurde geschaffen, um existierende Probleme zu lösen, und die Unterstützung des alten Mechanismus würde einige der alten Probleme wiedererwecken.
Im Moment unterstützen wir sogar die /etc/ld.so.conf Funktionalität in unserem ELF Binder, aber es ist alles andere als offensichtlich, dass solch ein Hybrid-mechanismus die richtige Lösung ist. Aus diesem Grund weisen wir nicht auf dessen Existenz hin, empfehlen weder dessen Benutzung, noch installieren wir eine Standard Schablone für diese Datei. Es wird nur für jene unterstützt, die meinen ohne es nicht leben zu können, oder denken es wirklich zu brauchen.
Das sind einige der Probleme:
Die ELF Werkzeuge sind standardisierte Pakete, welche von Drittanbietern gewartet werden; diese Werkzeuge werden konsisten auf verschiedenen Betriebssystemen und Plattformen eingesetzt. Auf Dauer wird die Standardisierung durch die Benutzung von ELF die Qualität von Systemen und Anwendungen erhöhen.
#!/bin/sh -x -e SRC=/usr/src # if the src is an update, eg: to -current, as well as config, # you might need to rebuild make: ### cp /usr/bin/make /usr/bin/make.old ### cd $SRC/usr.bin/make && make && make install # and at times in the past, /bin/sh, flex, etc # magic build variables export DESTDIR=/../. # hack from Hell export OBJECT_FMT=a.out export BOOTSTRAP_ELF=YESSIREE # update .mk files for new magic cd $SRC/share/mk && make install # Clean any old objects cd $SRC && make cleandir # You may need this: ### cd $SRC/gnu && make depend # update compiler tools cd $SRC/gnu/usr.bin/binutils && make cd ../gas.new && make cd ../ld.new && make cd ../egcs && make # (you may want to copy the old a.out tools here, just in case) cd $SRC/gnu/usr.bin/binutils && make install cd ../gas.new && make install cd ../ld.new && make install cd ../egcs && make install # You may need this: ### cd $SRC/gnu/lib/libbfd && make # now building ELF natively export OBJECT_FMT=ELF # update include files and base libraries cd $SRC && make includes cd $SRC/lib/csu && make && make install cd $SRC/lib && make && make install # build the dynamic linker (needs libc_pic.a) cd $SRC/libexec/ld.elf_so && make && make install # finish the build cd $SRC/gnu/lib && make && make install cd $SRC && make && make install
Sollten Sie irgendwelche Änderungen an obigem Skript vornehmen müssen, teilen Sie uns das bitte unter <www@NetBSD.org> mit.
if echo __ELF__ | ${CC:-cc} -E - | grep -q __ELF__ then echo "Kein ELF System" else echo "Dies ist ein ELF System" fi
|
|