#!/usr/bin/perl $|++; use strict; PACKAGE: for my $package (@ARGV) { print $package, "... "; my @symbols; if (open(DPKG, "dpkg -L '$package' |")) { while (my $file = ) { chomp($file); if (`file "$file" 2>/dev/null` =~ /Mach-O/) { system("nm -g '$file' >/tmp/$$.before"); system("c++filt < /tmp/$$.before > /tmp/$$.after"); if (open(DIFF, "diff -uNb /tmp/$$.before /tmp/$$.after |")) { while (my $diffline = ) { chomp($diffline); if ($diffline =~ /^\+\s*(.*?)\s*$/) { push(@symbols, $1); } else { #print "did not match: $diffline\n"; } } close(DIFF); } else { warn "unable to run diff: $!\n"; } } } close(DPKG); if (@symbols) { print int(@symbols), " symbols mangled\n"; } else { print "not mangled\n"; } } else { warn "unable to run dpkg -L '$package': $!\n"; } } unlink("/tmp/$$.before"); unlink("/tmp/$$.after"); __END__ for PACKAGE in "$@"; do MATCH=0 echo -e "${PACKAGE}: \c" dpkg -L "$PACKAGE" | while read FILE; do if [ "$MATCH" -eq 0 ] && [ -f "$FILE" ]; then if [ `file "$FILE" 2>/dev/null | grep -c "Mach-O"` -gt 0 ]; then nm -g "$FILE" > /tmp/$$.before c++filt < /tmp/$$.before > /tmp/$$.after COUNT=`diff /tmp/$$.before /tmp/$$.after | wc -l` if [ "$COUNT" -gt 0 ]; then echo "$PACKAGE: mangled" MATCH=1 break 3 fi fi fi done if [ "$MATCH" -eq 0 ]; then echo "$PACKAGE: not mangled" fi done