diff options
Diffstat (limited to 'winsup/cygwin/mkimport')
-rwxr-xr-x | winsup/cygwin/mkimport | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/winsup/cygwin/mkimport b/winsup/cygwin/mkimport index 1dfcab3f4..2b08dfe3d 100755 --- a/winsup/cygwin/mkimport +++ b/winsup/cygwin/mkimport @@ -5,8 +5,8 @@ use File::Spec; use Getopt::Long; my $dir = tempdir(CLEANUP => 1); -my ($ar, $as, $nm, $objcopy, %replace); -GetOptions('ar=s'=>\$ar, 'as=s'=>\$as,'nm=s'=>\$nm, 'objcopy=s'=>\$objcopy, 'replace=s'=>\%replace); +my ($cpu, $ar, $as, $nm, $objcopy, %replace); +GetOptions('cpu=s'=>\$cpu, 'ar=s'=>\$ar, 'as=s'=>\$as,'nm=s'=>\$nm, 'objcopy=s'=>\$objcopy, 'replace=s'=>\%replace); # Args:: # 1) import lib to create @@ -22,6 +22,10 @@ open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', $inpdll; my %text = (); my %import = (); my %symfile = (); + +my $is64bit = ($cpu eq 'x86_64' ? 1 : 0); +my $sym_prefix = ($is64bit ? '' : '_'); + while (<$nm_fd>) { chomp; my ($fn, $type, $sym) = /^$inpdll:(.*?):\S+\s+(\S)\s+(\S+)$/o; @@ -34,12 +38,12 @@ close $nm_fd or exit 1; for my $sym (keys %replace) { my $fn; - my $_sym = '_' . $sym; + my $_sym = $sym_prefix . $sym; if (!defined($fn = $symfile{$_sym})) { $fn = "$sym.o"; $text{$fn} = $_sym; } - my $imp_sym = '__imp__' . $replace{$sym}; + my $imp_sym = '__imp_' . $sym_prefix . $replace{$sym}; $import{$fn} = $imp_sym; } @@ -48,18 +52,28 @@ for my $f (keys %text) { my $glob_sym = $text{$f}; if (!defined $imp_sym) { delete $text{$f}; - } elsif ($imp_sym eq '__imp__') { + } elsif ($imp_sym eq '__imp_' . $sym_prefix) { $text{$f} = 0; } else { $text{$f} = 1; open my $as_fd, '|-', $as, '-o', "$dir/t-$f", "-"; - print $as_fd <<EOF; + if ($is64bit) { + print $as_fd <<EOF; + .text + .extern $imp_sym + .global $glob_sym +$glob_sym: + jmp *$imp_sym(%rip) +EOF + } else { + print $as_fd <<EOF; .text .extern $imp_sym .global $glob_sym $glob_sym: jmp *$imp_sym EOF + } close $as_fd or exit 1; } } |