#!/usr/bin/perl # use GNU ld mapfile to resolve library dependencies. # usage: # 1. use make to compile everything. # 2. remove the binaries (not the object files and libraries) # 3. run this script. It will dump the expanded dependencies to stdout # (i.e. no libraries, only the object files) opendir DIR,"." || die; foreach $i (readdir DIR) { if ($i =~ m/mapfile\..*/) { unlink $i || die; } } closedir DIR; (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)=stat("load")) || die "can't stat load!\n"; open FILE,"load" || die; $load = join '',; close FILE; rename "load","load.old" || die "rename failed\n"; open FILE,">load" || die; print FILE "main=\"\$1\"; shift\necho \${1+\"\$\@\"} > deps.\"\$main\"\n"; print FILE "exec gcc -Wl,-Map,mapfile.\"\$main\" -o \"\$main\" \"\$main\".o \${1+\"\$\@\"}\n"; close FILE; chmod 0755,"load" || die; utime $atime,$mtime,"load"; system "make"; unlink "load"; rename "load.old","load" || die; opendir DIR,"." || die; foreach $i (readdir DIR) { if ($i =~ m/mapfile\.(.*)/) { $deps="deps.$1"; $doto="$1.o"; print "$1: \\\n"; open FILE,$i || die; $line="load "; while () { if (m/^(\w+\.a)\((\w+\.o)\) +/) { if (length("$line$2 ")>72) { print "$line \\\n"; $line = "$2 "; } else { $line .= "$2 "; } } } close FILE; open FILE,$deps; while () { chomp; foreach $j (split) { if (length("$line$j ")>72) { print "$line \\\n"; $line = "$j "; } else { $line .= "$j "; } } } close FILE; unlink "$deps"; if (length("$line$doto ")>72) { print "$line \\\n$doto\n\n"; } else { print "$line$doto\n\n"; } unlink $i || die; } } closedir DIR;