[arch-dev-public] Fwd: lddd from devtools rewritten
Allan McRae
allan at archlinux.org
Tue Jul 28 10:40:21 EDT 2009
Hi devs,
I thought I would forward this here so we all see it. From my testing
of this, it runs much faster (~5x) than the current lddd. It also gives
me no false positives (although the results from the current lddd can be
restored with the -L flag).
I have not spent much time looking at the code, but this seems a great
candidate to replace the current lddd after some review.
Cheers,
Allan
-------- Original Message --------
I rewrote lddd from extra/devtools. The intent was to make it faster
and remove false positives, as well as support for ignoring certain
files completely, filtering the list of missing libs to handle optional
dependencies, take /etc/ld.so.conf into account and in general make it
more usable. NB: uses bash-4 features.
URL: http://ino-waiting.gmxhome.de/files/lddd-c.sh
Here's the help screen:
$ lddd-c.sh -h
Use lddd-c.sh [options] [paths]
Default-paths: $PATH, /lib:/usr/lib:/opt/qt/lib:/opt/kde/lib:/usr/lib/libfakeroot:/opt/NX/lib:/usr/local/lib:/usr/local/libexec
options:
-d <item>: do not check glob <item>, can be given multiple times.
-l <item>: ignore missing library glob <item>, multiple times.
-L: do not use LD_LIBRARY_PATH running ldd(1)[1].
-v: be more and more chatty.
-D <glob>: trigger tracing on meeting <glob>, debugging aid.
Environment variables:
$LDDD_LIB_IGNORE: globs of missing lib-names to ignore[2].
$LDDD_DONT_CHECK: globs of file names to completely ignore[2].
[1] risks false positives, but finds all broken ELF dependencies.
[2] space separated list of globs, needs to be quoted to the shell.
NB: A broken ELF file will be reported unless it is ignored ('-d' option
or $LDDD_DONT_CHECK) or _ALL_ of its missing libs are ignored ('-l'
or $LDDD_LIB_IGNORE)!
_version: 20090727-2016_
The "new and improved" algorithm goes like this:
1. All files executable by the user or matching the customary *.so
patterns are collected after verifying their ELFness.
2. The file paths are checked to see if their base directories contain
any libraries and these directories are collected into
LD_LIBRARY_PATH.
3. In a third loop, the files from step one are checked by ldd(1)
prefixed with this LD_LIBRARY_PATH to see if any prerequisites are
missing. This step is repeated without the path to check the odd
customer.
4. Suspects aquired this way are sent to a co-process to determine the
packages they belong to.
5. Results are collected into files in /tmp/lddd-c.sh-$UID and
a summary listed to stdout. This makes it easy to use in cron-jobs.
Detail is controlled by the number of '-v' options.
Step four was intended to speed up the process, but as it turns out it
doesn't help all that much. The pacman call is indeed expensive and can
be done in parallel, but it obviously competes for disk access.
Therefore the co-process caches the file list of any broken package
expecting to find more broken files in it, but this only helps big
packages with several broken executables.
All in all lddd-c.sh is an improvement over the simpler lddd and the
terribly hacked findbrokenpkgs[1]. As there should be no false
positives, it should report b0rked packages after botched or incomplete
updates in a reliable way.
Valuable testing was done by Allan McRae and AttilaH. Some nasty bugs
would still stink the code without their patience.
[1] http://bbs.archlinux.org/viewtopic.php?id=13882
clemens
More information about the arch-dev-public
mailing list