strace -f -ttt -o out echo
egrep 'open|access\(' out
27261 1181497445.070474 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
27261 1181497445.070605 open("/etc/ld.so.cache", O_RDONLY) = 3
27261 1181497445.070964 open("/lib/libc.so.6", O_RDONLY) = 3
27261 1181497445.073607 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
ktrace -d -i echo
kdump | egrep -A1 'CALL.*open|access\('
25355 echo CALL open(0x28069088,0,0x1b6)
25355 echo NAMI "/etc/libmap.conf"
--
25355 echo CALL open(0x280682e0,0,0)
25355 echo NAMI "/var/run/ld-elf.so.hints"
--
25355 echo CALL access(0x28079000,0)
25355 echo NAMI "/lib/libc.so.6"
--
25355 echo CALL open(0x280730e0,0,0)
25355 echo NAMI "/lib/libc.so.6"
Nézőpont kérdése, hogy kit tekintünk jobbnak, mindenesetre azt hiszem abban megegyezhetünk, hogy a Linuxnál több fájlt nyit meg alapból (egy default FreeBSD telepítésben nincs libmap.conf).
Nézzük a stoppert:
less out
26670 1181497445.045361 open("/etc/ld.so.cache", O_RDONLY) = 3
26670 1181497445.045698 close(3) = 0
1181497445.045698-1181497445.045361=0.000337
kdump -T | less (ez most itt a libmap.conf-ra fog vonatkozni, aminek parse-olásával turul16-nak akkora gondja van)
25355 echo 1181497763.340305 RET open 3
25355 echo 1181497763.340424 CALL close(0x3)
1181497763.340424-1181497763.340305=0.000119
Hüm, hüm.
FreeBSD:Linux=1:0
De nézzük még tovább:
27261 1181497445.069527 execve("/bin/echo", ["echo"], [/* 21 vars */]) = 0
27261 1181497445.076522 exit_group(0) = ?
1181497445.076522-1181497445.069527=0.006995
25355 echo 1181497763.340027 RET execve 0
25355 echo 1181497763.342038 CALL exit(0)
1181497763.342038-1181497763.340027=0.002011
Oh boy, FreeBSD kollega 3,4783-szer elindítja az echo-t és 2,8319-szer felparse-olja a több kB-os szöveges libmap.conf-ot, míg Linux kollega egyszer kinyög magából egy \n-t, illetve beröffenti a bináris ld.so.cache-t.
Nem is beszélve arról, hogy a libmap.conf mennyivel elegánsabb a szánalmas megoldásodhoz képest. :)