3 # Copyright (C) 2008 Anders Kaseorg <andersk@mit.edu>,
4 # Jeffrey Brian Arnold <jbarnold@mit.edu>,
5 # Tim Abbott <tabbott@mit.edu>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License, version 2.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22 use lib
'KSPLICE_DATA_DIR';
25 $Verbose::level
= $ENV{KSPLICE_VERBOSE
} if (defined $ENV{KSPLICE_VERBOSE
});
29 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
30 unlink "$obj.KSPLICE_primary" if (-e
"$obj.KSPLICE_primary");
31 unlink "$obj.KSPLICE_helper" if (-e
"$obj.KSPLICE_helper");
32 open OUT
, '>', "$out.tmp";
34 rename "$out.tmp", $out;
39 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
41 unlink "$obj.KSPLICE_pre" if (-e
"$obj.KSPLICE_pre");
47 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
48 my $obj_old = "$obj.KSPLICE_pre";
50 die "Patch creates new object $obj" if (!-e
$obj_old);
51 if (system('cmp', '-s', '--', $obj_old, $obj) == 0) {
53 return empty_diff
($out);
56 my $objdiff = runsuc
("objdiff", $obj_old, $obj);
57 return empty_diff
($out) if($objdiff !~ m/\S/);
59 runsuc_in
($objdiff, "objmanip", $obj, "$obj.KSPLICE_primary", "keep-primary", $ENV{KSPLICE_KID
});
61 open OUT
, '>', "$out.tmp";
64 rename "$out.tmp", $out;
66 runsuc
("objmanip", $obj_old, "$obj.KSPLICE_helper", "keep-helper");
71 my ($obj) = $out =~ /^(.*)\.KSPLICE_helper$/ or die;
72 my $obj_old = "$obj.KSPLICE_pre";
73 -e
$obj_old or $obj_old = $obj;
74 runsuc
("objmanip", $obj_old, "$obj.KSPLICE_helper", "keep-helper");
80 runval
(shellwords
($ENV{AR
}), "rcs", $out);
84 runval
(shellwords
($ENV{LD
}), "-r", "-o", $out, @ins);
92 foreach my $in (@ins) {
93 if (my ($obj) = $in =~ /^(.*)\.KSPLICE$/) {
95 push @primaries, "$obj.KSPLICE_primary";
96 push @helpers, "$obj.KSPLICE_helper";
97 } elsif (($obj) = $in =~ /^(.*)\.KSPLICE_helper$/) {
98 push @helpers, "$obj.KSPLICE_helper"
99 unless (@helpers && $helpers[$#helpers] eq "$obj.KSPLICE_helper");
105 return empty_diff
($out) unless (@helpers);
107 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
108 link_objs
("$obj.KSPLICE_primary", @primaries);
109 link_objs
("$obj.KSPLICE_helper", @helpers);
111 open OUT
, '>', "$out.tmp";
114 rename "$out.tmp", $out;
119 runsuc
("objmanip", $in, $out, "finalize");
123 my ($in, $out, @rmsyms) = @_;
124 my $relocs = runsuc_in
("@rmsyms\n", "objmanip", $in, $out, "rmsyms");
127 sub do_system_map_lookup
{
129 open(SYMS
, "<", "$ENV{KSPLICE_CONFIG_DIR}/System.map") or die;
131 while (defined($line = <SYMS
>)) {
132 my ($addr, $type, $sym, $mod) = split(/\s+/, $line);
133 if ($sym eq $symarg) { print $addr; last; }
141 'helper' => \
&do_helper
,
142 'combine' => \
&do_combine
,
143 'finalize' => \
&do_finalize
,
144 'rmsyms' => \
&do_rmsyms
,
145 'system_map_lookup' => \
&do_system_map_lookup
,
148 my ($cmd, @args) = @ARGV;
149 if (exists $handlers{$cmd}) {
150 my $handler = $handlers{$cmd};
153 print "Usage: ksplice-obj.pl ", join('|', keys %handlers), " ...\n";