3 # Copyright (C) 2008-2009 Ksplice, Inc.
4 # Authors: Anders Kaseorg, Jeff Arnold, Tim Abbott
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License, version 2.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 use lib
'KSPLICE_DATA_DIR';
24 $Verbose::level
= $ENV{KSPLICE_VERBOSE
} if (defined $ENV{KSPLICE_VERBOSE
});
28 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
29 unlink "$obj.KSPLICE_new_code" if (-e
"$obj.KSPLICE_new_code");
30 unlink "$obj.KSPLICE_old_code" if (-e
"$obj.KSPLICE_old_code");
31 open OUT
, '>', "$out.tmp";
33 rename "$out.tmp", $out;
38 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
40 unlink "$obj.KSPLICE_pre" if (-e
"$obj.KSPLICE_pre");
46 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
47 my $obj_pre = "$obj.KSPLICE_pre";
49 die "Patch creates new object $obj" if (!-e
$obj_pre);
50 if (system('cmp', '-s', '--', $obj_pre, $obj) == 0) {
52 return empty_diff
($out);
55 runval
("$libexecdir/ksplice-objmanip", $obj, "$obj.KSPLICE_new_code", "keep-new-code", "$obj.KSPLICE_pre", $ENV{KSPLICE_KID
});
56 return empty_diff
($out) if (!-e
"$obj.KSPLICE_new_code");
58 open OUT
, '>', "$out.tmp";
61 rename "$out.tmp", $out;
63 runval
("$libexecdir/ksplice-objmanip", $obj_pre, "$obj.KSPLICE_old_code", "keep-old-code");
68 my ($obj) = $out =~ /^(.*)\.KSPLICE_old_code$/ or die;
69 my $obj_pre = "$obj.KSPLICE_pre";
70 -e
$obj_pre or $obj_pre = $obj;
71 runval
("$libexecdir/ksplice-objmanip", $obj_pre, "$obj.KSPLICE_old_code", "keep-old-code");
77 runval
(shellwords
($ENV{AR
}), "rcs", $out);
81 runval
(shellwords
($ENV{LD
}), "-r", "-o", $out, @ins);
89 foreach my $in (@ins) {
90 if (my ($obj) = $in =~ /^(.*)\.KSPLICE$/) {
92 push @new_code_objs, "$obj.KSPLICE_new_code";
93 push @old_code_objs, "$obj.KSPLICE_old_code";
94 } elsif (($obj) = $in =~ /^(.*)\.KSPLICE_old_code$/) {
95 push @old_code_objs, "$obj.KSPLICE_old_code"
96 unless (@old_code_objs && $old_code_objs[$#old_code_objs] eq "$obj.KSPLICE_old_code");
102 return empty_diff
($out) unless (@old_code_objs);
104 my ($obj) = $out =~ /^(.*)\.KSPLICE$/ or die;
105 link_objs
("$obj.KSPLICE_new_code", @new_code_objs);
106 link_objs
("$obj.KSPLICE_old_code", @old_code_objs);
108 open OUT
, '>', "$out.tmp";
111 rename "$out.tmp", $out;
115 my ($in, $out, $target) = @_;
116 my $ret = runval_raw
("$libexecdir/ksplice-objmanip", $in, $out, "finalize", $target);
118 } elsif ($ret >> 8 == 66) {
119 runval
(shellwords
($ENV{AR
}), "rcs", $out);
126 my ($in, $out, @rmsyms) = @_;
127 runval_in
("@rmsyms\n", "$libexecdir/ksplice-objmanip", $in, $out, "rmsyms");
130 sub do_system_map_lookup
{
132 open(SYMS
, "<", "$ENV{KSPLICE_CONFIG_DIR}/System.map") or die;
134 while (defined($line = <SYMS
>)) {
135 my ($addr, $type, $sym, $mod) = split(/\s+/, $line);
136 if ($sym eq $symarg) { print $addr; last; }
144 'old_code' => \
&do_old_code
,
145 'combine' => \
&do_combine
,
146 'finalize' => \
&do_finalize
,
147 'rmsyms' => \
&do_rmsyms
,
148 'system_map_lookup' => \
&do_system_map_lookup
,
151 my ($cmd, @args) = @ARGV;
152 if (exists $handlers{$cmd}) {
153 my $handler = $handlers{$cmd};
156 print "Usage: ksplice-obj.pl ", join('|', keys %handlers), " ...\n";