diff -ru ExtUtils-CBuilder-0.09_01.orig/lib/ExtUtils/CBuilder/Platform/VMS.pm ExtUtils-CBuilder-0.09_01/lib/ExtUtils/CBuilder/Platform/VMS.pm
--- ExtUtils-CBuilder-0.09_01.orig/lib/ExtUtils/CBuilder/Platform/VMS.pm	2005-03-06 10:47:42.000000000 -0500
+++ ExtUtils-CBuilder-0.09_01/lib/ExtUtils/CBuilder/Platform/VMS.pm	2005-03-10 15:45:33.998024000 -0500
@@ -6,20 +6,47 @@
 use vars qw(@ISA);
 @ISA = qw(ExtUtils::CBuilder::Base);
 
-sub need_prelink { 1 }
+sub need_prelink { 0 }
 
 sub arg_include_dirs {
   my $self = shift;
   return '/include=(' . join(',', @_) . ')';
 }
 
-sub arg_nolink { }
+sub arg_nolink {
+  my $self = shift;
+  return '';
+}
 
 sub arg_object_file {
   my ($self, $file) = @_;
   return "/obj=$file";
 }
 
+sub _do_link {
+  my ($self, $type, %args) = @_;
+
+  my $cf = $self->{config}; # For convenience
+
+  my $objects = delete $args{objects};
+  $objects = [$objects] unless ref $objects;
+  my $out = $args{$type} || $self->$type($objects->[0]);
+
+  my @temp_files;
+  @temp_files =
+    $self->prelink(%args,
+                   dl_name => $args{module_name}) if $self->need_prelink;
+
+  my @linker_flags = $self->split_like_shell($args{extra_linker_flags});
+  my @lddlflags = $args{lddl} ? ($cf->{lddlflags}."=$out") : ("/exe=$out");
+  my @shrp = $self->split_like_shell($cf->{shrpenv});
+  my @ld = $self->split_like_shell($cf->{ld});
+  $self->do_system(@shrp, @ld, @lddlflags, @$objects, @linker_flags)
+    or die "error building $out from @$objects";
+
+  return wantarray ? ($out, @temp_files) : $out;
+}
+
 
 
 1;
diff -ru ExtUtils-CBuilder-0.09_01.orig/t/02-link.t ExtUtils-CBuilder-0.09_01/t/02-link.t
--- ExtUtils-CBuilder-0.09_01.orig/t/02-link.t	2005-03-06 10:47:42.000000000 -0500
+++ ExtUtils-CBuilder-0.09_01/t/02-link.t	2005-03-10 15:46:03.105026000 -0500
@@ -32,11 +32,18 @@
 # Link
 my ($exe_file, @temps);
 ($exe_file, @temps) = $b->link_executable(objects => $object_file);
-ok $exe_file;
+ok -e $exe_file;
 
 # Try the executable
-my $retval = system($exe_file);
-ok $retval >> 8, 11;
+my $retval;
+if ($^O eq 'VMS') {
+  $retval = system("mcr $exe_file");
+  ok $retval, 0;
+}
+else {
+  $retval = system($exe_file);
+  ok $retval >> 8, 11;
+}
 
 # Clean up
 for ($source_file, $exe_file, $object_file, @temps) {
