#!/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 relocations 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 relocation lines. next if (!/\s+R_/); # These relocations are okay # On PPC64: # R_PPC64_RELATIVE, R_PPC64_NONE, R_PPC64_ADDR64 # On PPC: # R_PPC_RELATIVE, R_PPC_ADDR16_HI, # R_PPC_ADDR16_HA,R_PPC_ADDR16_LO, # R_PPC_NONE next if (/\bR_PPC64_RELATIVE\b/ or /\bR_PPC64_NONE\b/ or /\bR_PPC64_ADDR64\s+mach_/); next if (/\bR_PPC_ADDR16_LO\b/ or /\bR_PPC_ADDR16_HI\b/ or /\bR_PPC_ADDR16_HA\b/ or /\bR_PPC_RELATIVE\b/ or /\bR_PPC_NONE\b/); # If we see this type of relocation 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 least binutils >= 2.19 to build a ". "CONFIG_RELOCATABLE kernel\n"; }