| #!/usr/bin/perl | |
| # Copyright © 2009 IBM Corporation | |
| # This program is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU General Public License | |
| # as published by the Free Software Foundation; either version | |
| # 2 of the License, or (at your option) any later version. | |
| # This script checks the relcoations of a vmlinux for "suspicious" | |
| # relocations. | |
| use strict; | |
| use warnings; | |
| if ($#ARGV != 1) { | |
| die "$0 [path to objdump] [path to vmlinux]\n"; | |
| } | |
| # Have Kbuild supply the path to objdump so we handle cross compilation. | |
| my $objdump = shift; | |
| my $vmlinux = shift; | |
| my $bad_relocs_count = 0; | |
| my $bad_relocs = ""; | |
| my $old_binutils = 0; | |
| open(FD, "$objdump -R $vmlinux|") or die; | |
| while (<FD>) { | |
| study $_; | |
| # Only look at relcoation lines. | |
| next if (!/\s+R_/); | |
| # These relocations are okay | |
| next if (/R_PPC64_RELATIVE/ or /R_PPC64_NONE/ or | |
| /R_PPC64_ADDR64\s+mach_/); | |
| # If we see this type of relcoation it's an idication that | |
| # we /may/ be using an old version of binutils. | |
| if (/R_PPC64_UADDR64/) { | |
| $old_binutils++; | |
| } | |
| $bad_relocs_count++; | |
| $bad_relocs .= $_; | |
| } | |
| if ($bad_relocs_count) { | |
| print "WARNING: $bad_relocs_count bad relocations\n"; | |
| print $bad_relocs; | |
| } | |
| if ($old_binutils) { | |
| print "WARNING: You need at binutils >= 2.19 to build a ". | |
| "CONFIG_RELCOATABLE kernel\n"; | |
| } |