* mkimport: Specify .text for stub explicitly.
* speclib: Add a dummy '.idata$7' section referring to the dll associated with the real import library.
This commit is contained in:
parent
855762d6f4
commit
b978c43ea0
|
@ -1,3 +1,9 @@
|
||||||
|
2009-04-18 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
|
* mkimport: Specify .text for stub explicitly.
|
||||||
|
* speclib: Add a dummy '.idata$7' section referring to the dll
|
||||||
|
associated with the real import library.
|
||||||
|
|
||||||
2009-04-18 Corinna Vinschen <corinna@vinschen.de>
|
2009-04-18 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* dcrt0.cc (globify): Only call mbtowc for non-ascii chars.
|
* dcrt0.cc (globify): Only call mbtowc for non-ascii chars.
|
||||||
|
|
|
@ -54,6 +54,7 @@ for my $f (keys %text) {
|
||||||
$text{$f} = 1;
|
$text{$f} = 1;
|
||||||
open my $as_fd, '|-', $as, '-o', "$dir/t-$f", "-";
|
open my $as_fd, '|-', $as, '-o', "$dir/t-$f", "-";
|
||||||
print $as_fd <<EOF;
|
print $as_fd <<EOF;
|
||||||
|
.text
|
||||||
.extern $imp_sym
|
.extern $imp_sym
|
||||||
.global $glob_sym
|
.global $glob_sym
|
||||||
$glob_sym:
|
$glob_sym:
|
||||||
|
|
|
@ -19,6 +19,8 @@ $_ = File::Spec->rel2abs($_) for @ARGV;
|
||||||
|
|
||||||
my $libdll = shift;
|
my $libdll = shift;
|
||||||
my $lib = pop;
|
my $lib = pop;
|
||||||
|
(my $iname = basename $lib) =~ s/\.a$//o;
|
||||||
|
$iname = '_' . $iname . '_dll_iname';
|
||||||
|
|
||||||
open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', @ARGV, $libdll or
|
open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', @ARGV, $libdll or
|
||||||
die "$0: execution of $nm for object files failed - $!\n";
|
die "$0: execution of $nm for object files failed - $!\n";
|
||||||
|
@ -29,17 +31,23 @@ my $lastfn;
|
||||||
my %extract = ();
|
my %extract = ();
|
||||||
my $exclude_regex = @exclude ? join('|', @exclude) : '\\UnLiKeLy//';
|
my $exclude_regex = @exclude ? join('|', @exclude) : '\\UnLiKeLy//';
|
||||||
$exclude_regex = qr/$exclude_regex/;
|
$exclude_regex = qr/$exclude_regex/;
|
||||||
|
my $dllname;
|
||||||
while (<$nm_fd>) {
|
while (<$nm_fd>) {
|
||||||
study;
|
study;
|
||||||
my ($file, $member, $symbol) = m%^([^:]*):([^:]*(?=:))?.* T (.*)%o;
|
if (/ I _(.*)_dll_iname/o) {
|
||||||
next if !defined($symbol) || $symbol =~ $exclude_regex;
|
$dllname ||= $1;
|
||||||
if ($file ne $libdll) {
|
} else {
|
||||||
$match_syms{$symbol} = 1;
|
my ($file, $member, $symbol) = m%^([^:]*):([^:]*(?=:))?.* T (.*)%o;
|
||||||
} elsif ($match_syms{$symbol} ? !$inverse : $inverse) {
|
next if !defined($symbol) || $symbol =~ $exclude_regex;
|
||||||
$extract{$member} = 1;
|
if ($file ne $libdll) {
|
||||||
}
|
$match_syms{$symbol} = 1;
|
||||||
|
} elsif ($match_syms{$symbol} ? !$inverse : $inverse) {
|
||||||
|
$extract{$member} = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
close $nm_fd;
|
close $nm_fd;
|
||||||
|
|
||||||
|
|
||||||
%extract or die "$0: couldn't find symbols for $lib\n";
|
%extract or die "$0: couldn't find symbols for $lib\n";
|
||||||
|
|
||||||
|
@ -50,6 +58,20 @@ chdir $dir;
|
||||||
my $res = system $ar, 'x', $libdll, sort keys %extract;
|
my $res = system $ar, 'x', $libdll, sort keys %extract;
|
||||||
die "$0: $ar extraction exited with non-zero status\n" if $res;
|
die "$0: $ar extraction exited with non-zero status\n" if $res;
|
||||||
unlink $lib;
|
unlink $lib;
|
||||||
|
|
||||||
|
# Add a dummy .idata object for libtool so that it will think
|
||||||
|
# this library is an import library.
|
||||||
|
my $iname_o = 'd000000.o';
|
||||||
|
$extract{$iname_o} = 1;
|
||||||
|
open my $as_fd, '|-', $as, '-R', '-o', $iname_o, "-";
|
||||||
|
print $as_fd <<EOF;
|
||||||
|
.section .idata\$7
|
||||||
|
.global $iname
|
||||||
|
$iname: .asciz "$dllname.dll"
|
||||||
|
EOF
|
||||||
|
close $as_fd or exit 1;
|
||||||
|
system $objcopy, '-j', '.idata$7', $iname_o;
|
||||||
|
|
||||||
$res = system $ar, 'crus', $lib, sort keys %extract;
|
$res = system $ar, 'crus', $lib, sort keys %extract;
|
||||||
unlink keys %extract;
|
unlink keys %extract;
|
||||||
die "$0: ar creation of $lib exited with non-zero status\n" if $res;
|
die "$0: ar creation of $lib exited with non-zero status\n" if $res;
|
||||||
|
|
Loading…
Reference in New Issue