Hallo,
[Sorry, ich verwende verschiedene emails in suse-linux und hier, das
CC kam hier also nicht an]
Erstmal wuensche ich allen ein gutes neues Jahr!
Am Sat, 31 Dec 2005, Philipp Thomas schrieb:
Am Sa, 31 Dez 2005 04:43:09 +0100 schrieb David Haller:
Warum eigentlich? Bzw. koennte man die libnss_* (rein theoretisch) auch
als statische libs erstellen?
Nein.
Schade[tm].
aber ich weiss, dass du dich mit der GNU libc besser auskennst als ich,
vielleicht weisst du das ja ohne in den Sourcen/Dokus zu wuehlen, wie
ich es muesste.
So gut kenne ich mich damit nicht aus. Aber wenn man für SUSE arbeitet,
bekommt man halt eine Menge "so nebenbei" mit :)
Eben :))
oder beisst sich dlopen generell mit statisch gelinkt?)...
Ja, dlopen funktioniert nicht mit statisch gelinkten binaries.
Hm. Also, das hat mir jetzt keine Ruhe gelassen:
==== dlopen-static.c ====
#include
#include
int main(void) {
const char * (*funch)(void);
void * libh = dlopen("libz.so", RTLD_LAZY);
if( ! libh ) {
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
funch = dlsym(libh, "zlibVersion");
if( ! funch ) {
fprintf(stderr, "%s\n", dlerror());
dlclose(libh);
exit(1);
}
printf("found zlib version: %s\n", funch());
dlclose(libh);
return 0;
}
====
$ gcc -Wall -W -static -o dlopen-static dlopen-static.c -ldl
$ ldd ./dlopen-static
not a dynamic executable
$ file ./dlopen-static
./dlopen-static: ELF 32-bit LSB executable, Intel 80386, version 1, statically linked, not stripped
$ ./dlopen-static
found zlib version: 1.1.4
$ LANG=C ltrace ./dlopen-static
found zlib version: 1.1.4
+++ exited (status 0) +++
$ nm ./dlopen-static | grep -i 'zlib\|libz'
$ objdump -tC ./dlopen-static | grep -i 'zlib\|libz'
$ strings ./dlopen-static | grep '1\.1\.4\|zlib\|libz'
libz.so
zlibVersion
found zlib version: %s
$
Speziell die Ergebnisse von nm, objdump und strings bestaetigen mir,
dass die libz eben nicht dazugelinkt ist. Sondern per (statisch
gelinkten) 'dlopen' dazugeladen werden:
$ nm ./dlopen-static | grep -i 'dlopen\|dlsym'
080482d0 T __dlopen_check
080482d0 W dlopen
080482a0 t dlopen_doit
08048490 T dlsym
08048360 t dlsym_doit
$ LANG=C strace -eopen ./dlopen-static 2>&1 | grep -v ENOENT
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libz.so", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/lib/ld-linux.so.2", O_RDONLY) = 3
found zlib version: 1.1.4
Jetzt bin ich verwirrt ob deiner Aussage und meinem deiner Aussage
widersprechendem Experiment. Dass das mit libnss* statt libz was
anderes ergeben kann ist klar.
Wenn das so weitergeht kruschtel ich mal die libnss* Sourcen raus (wg.
"Signatur" der internen Funktionen wie '_nss_files_gethostbyname') und
versuche das mal mit denen per dlopen in einem statischen binary
und/oder die nss-libs statisch zu backen... Aeh, zumindest mit dem
libnss* aus meiner glibc-2.1.3...
Interessant ist das Thema ;)
Hm. Im Moment (ich habe nach wie vor noch keine glibc-Quellen / Doku
bzgl. libnss gelesen) habe ich den Eindruck, als sei libnss* der
gescheiterte Versuch Plugins zu implementieren... Demonstriert
'libpam' wie man's besser macht? Dass Drepper und Co. manchmal
eigenartige Ansichten haben duerfte ja bekannt sein...
Vielleicht liest ja Thorsten Kukuk auch mit? Der sollte sich damit
besser auskennen als wir beide zusammen ;) *winkewinke*
Danke dir Philipp soweit aber! Mit dir zu diskutieren ist immer wieder
eine Freude!
-dnh
PS: mit gcc-3.3.5 bekomme ich das gleiche Ergebnis.
PPS: jetzt nochmal im chroot der SUSE 9.1:
dh@slarty: /tmp (0)$ gcc -Wall -W -static -o dlopen-static dlopen-static.c -ldl
dlopen-static.c: In function `main':
dlopen-static.c:9: warning: implicit declaration of function `exit'
/tmp/ccu8UHZ5.o(.text+0x1b): In function `main':
: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
dh@slarty: /tmp (0)$ file ./dlopen-static; ldd ./dlopen-static; ./dlopen-static
./dlopen-static: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, statically linked, not stripped
not a dynamic executable
found zlib version: 1.2.1
dh@slarty: /tmp (0)$ LANG=C ltrace ./dlopen-static
found zlib version: 1.2.1
+++ exited (status 0) +++
dh@slarty: /tmp (0)$ nm ./dlopen-static | grep -i 'zlib\|libz'
dh@slarty: /tmp (1)$ objdump -tC ./dlopen-static | grep -i 'zlib\|libz'
dh@slarty: /tmp (1)$ strings ./dlopen-static | grep '1\.1\.4\|zlib\|libz'
libz.so
zlibVersion
found zlib version: %s
dh@slarty: /tmp (0)$ nm ./dlopen-static | grep -i 'dlopen\|dlsym'
08048330 W dlopen
08048330 T __dlopen_check
08048370 t dlopen_doit
080483d0 T dlsym
08048430 t dlsym_doit
0807f800 t do_dlopen
0807f730 t do_dlsym
0807f790 t do_dlsym_private
0808f440 t __evoke_link_warning_dlopen
0807f6b0 T __libc_dlopen_mode
0807f660 T __libc_dlsym
dh@slarty: /tmp (0)$ LANG=C strace -eopen ./dlopen-static 2>&1 | grep -v ENOENT
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/usr/lib/libz.so", O_RDONLY) = 3
open("/lib/i686/libc.so.6", O_RDONLY) = 3
open("/lib/ld-linux.so.2", O_RDONLY) = 3
found zlib version: 1.2.1
dh@slarty: /tmp (0)$
Das passt zur Warnung des gcc-3.3.3 der SuSE 9.1
(__evoke_link_warning_dlopen ist das wohl), aber das "dlopen" an
sich funktioniert wohl wie erwartet... Und die libdl ist statisch
mit drin im Binary...
Ich kapiere aber nicht ganz, warum ich "at runtime" die dyn. glibc
brauche... Irgendwie kommt mir das ganze komisch und etwas
willkuerlich vor. Aber ich lese eben nicht die entsprechenden
Mailinglisten, wo sowas diskutiert wird.
Hm. Einen Test mit der dietlibc koennte ich vielleicht auch noch
machen...
Das ganze erinnert mich ein bisschen auch ans Thema "Kernel-
Header" wo die Praxis bei mir (Motto: lieber compile-time-errors
als runtime-errors) von der Theorie (Linus _und_ Drepper IIRC,
sowie von dir, Philipp, und auch von Thorsten) abweicht (konkretes
Beispiel war bei mir IIRC 'kcmjoy' aus KDE 1.1.2 mit Kernel 2.2.x
und 2.4.x ;). *SCNR*
--
"We're sysadmins. Sanity happens to other people." -- Chris King