mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-21 00:07:36 +08:00
* Makefile.in: Perform some minor cleanup. Revamp speclib handling.
* speclib: Rewrite to create libraries with dlltool rather than attempting surgery on libcygwin.a.
This commit is contained in:
parent
6f0c3cc88a
commit
0390592140
@ -1,3 +1,9 @@
|
||||
2009-03-28 Christopher Faylor <me+cygwin@cgf.cx>
|
||||
|
||||
* Makefile.in: Perform some minor cleanup. Revamp speclib handling.
|
||||
* speclib: Rewrite to create libraries with dlltool rather than
|
||||
attempting surgery on libcygwin.a.
|
||||
|
||||
2009-03-27 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* net.cc (inet_ntop6): Convert to lowercase hex digits on the fly.
|
||||
|
@ -15,7 +15,7 @@ srcdir:=@srcdir@
|
||||
objdir:=.
|
||||
|
||||
CONFIG_DIR:=$(srcdir)/config/@CONFIG_DIR@
|
||||
VPATH:=$(srcdir):$(CONFIG_DIR):$(srcdir)/regex:$(srcdir)/regexp:$(srcdir)/lib:$(srcdir)/libc
|
||||
VPATH:=$(srcdir):$(CONFIG_DIR):$(srcdir)/regex:$(srcdir)/lib:$(srcdir)/libc
|
||||
|
||||
target_alias:=@target_alias@
|
||||
build_alias:=@build_alias@
|
||||
@ -72,7 +72,6 @@ OBJDUMP:=@OBJDUMP@
|
||||
STRIP:=@STRIP@
|
||||
LDSCRIPT:=cygwin.sc
|
||||
MKDIRP:=$(INSTALL) -m 755 -d
|
||||
|
||||
#
|
||||
# Include common definitions for winsup directory
|
||||
#
|
||||
@ -106,6 +105,8 @@ LIBGMON_A:=libgmon.a
|
||||
CYGWIN_START:=crt0.o
|
||||
GMON_START:=gcrt0.o
|
||||
|
||||
speclib=${word 1, $^} "${NM}" "$(DLLTOOL)" $(wordlist 2, $(words $^), $^)
|
||||
|
||||
# Some things want these from libc, but they have their own static
|
||||
# data which apps can get to, which is a pain in the dll, so we
|
||||
# include them directly into the library.
|
||||
@ -225,10 +226,9 @@ NEW_FUNCTIONS:=open _open64 \
|
||||
|
||||
API_VER:=$(srcdir)/include/cygwin/version.h
|
||||
|
||||
PWD:=${shell pwd}
|
||||
LIB_NAME:=$(PWD)/libcygwin.a
|
||||
LIB_NAME:=libcygwin.a
|
||||
LIBSERVER:=@LIBSERVER@
|
||||
SUBLIBS:=$(PWD)/libpthread.a $(PWD)/libutil.a $(PWD)/libm.a $(PWD)/libc.a $(PWD)/libdl.a $(PWD)/libresolv.a
|
||||
SUBLIBS:=libpthread.a libutil.a ${CURDIR}/libm.a ${CURDIR}/libc.a libdl.a libresolv.a
|
||||
EXTRALIBS:=libautomode.a libbinmode.a libtextmode.a libtextreadmode.a
|
||||
INSTOBJS:=automode.o binmode.o textmode.o textreadmode.o
|
||||
TARGET_LIBS:=$(LIB_NAME) $(CYGWIN_START) $(GMON_START) $(LIBGMON_A) $(SUBLIBS) $(INSTOBJS) $(EXTRALIBS)
|
||||
@ -407,7 +407,6 @@ ${STATIC_LIB_NAME}: mkstatic ${TEST_DLL_NAME}
|
||||
|
||||
# Rule to make stub library used by testsuite
|
||||
# dependency set to $(LIB_NAME) to accommodate make -j2.
|
||||
# Otherwise dlltool gets confused. cgf (11-16-2000)
|
||||
$(TEST_LIB_NAME): $(LIB_NAME)
|
||||
perl -p -e 'BEGIN{binmode(STDIN); binmode(STDOUT);}; s/cygwin1/cygwin0/g' < $? > $@
|
||||
|
||||
@ -440,31 +439,28 @@ dcrt0.o sigproc.o: child_info_magic.h
|
||||
|
||||
shared.o: shared_info_magic.h
|
||||
|
||||
$(srcdir)/qevices.cc: cygwin-gperf devices.gperf devices.h
|
||||
$^ > $@
|
||||
|
||||
$(srcdir)/devices.cc: gendevices devices.in devices.h
|
||||
${wordlist 1,2,$^} $@
|
||||
|
||||
$(PWD)/libpthread.a: speclib $(LIB_NAME) pthread.o thread.o
|
||||
${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
${CURDIR}/libc.a: speclib ${DEF_FILE} ./libm.a libpthread.a libutil.a
|
||||
${speclib} -v ${@F}
|
||||
|
||||
$(PWD)/libutil.a: speclib $(LIB_NAME) bsdlib.o
|
||||
${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
${CURDIR}/libm.a: speclib ${DEF_FILE} $(LIBM)
|
||||
${speclib} ${@F}
|
||||
|
||||
$(PWD)/libm.a: speclib $(LIB_NAME) $(LIBM)
|
||||
${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
libpthread.a: speclib ${DEF_FILE} pthread.o thread.o
|
||||
${speclib} ${@F}
|
||||
|
||||
$(PWD)/libc.a: speclib $(LIB_NAME) $(PWD)/libm.a libpthread.a libutil.a
|
||||
${word 1, $^} -v $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
libutil.a: speclib ${DEF_FILE} bsdlib.o
|
||||
${speclib} ${@F}
|
||||
|
||||
$(PWD)/libdl.a: speclib $(LIB_NAME) dlfcn.o
|
||||
${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
libdl.a: speclib ${DEF_FILE} dlfcn.o
|
||||
${speclib} ${@F}
|
||||
|
||||
$(PWD)/libresolv.a: speclib $(LIB_NAME) minires.o
|
||||
${word 1, $^} $@ "${NM}" "$(AR)" ${wordlist 2, 99, $^}
|
||||
libresolv.a: speclib ${DEF_FILE} minires.o
|
||||
${speclib} ${@F}
|
||||
|
||||
lib%.a: %.o
|
||||
${EXTRALIBS}: lib%.a: %.o
|
||||
$(AR) cru $@ $?
|
||||
|
||||
winver_stamp: mkvers.sh include/cygwin/version.h winver.rc $(DLL_OFILES)
|
||||
|
@ -4,88 +4,49 @@ use File::Temp qw'tempdir';
|
||||
use File::Basename;
|
||||
use strict;
|
||||
|
||||
sub dllname($;$);
|
||||
|
||||
my $verbose;
|
||||
my $static;
|
||||
my $exclude;
|
||||
|
||||
GetOptions('static!'=>\$static, 'v|exclude!'=>\$exclude);
|
||||
|
||||
my $lib = shift;
|
||||
my $nm = shift;
|
||||
my $ar = shift;
|
||||
my $libdll = shift;
|
||||
my $dlltool = shift;
|
||||
my $def = shift;
|
||||
my $lib = pop;
|
||||
|
||||
open my $nm_fd, '-|', $nm, '-Ap', '--defined-only', @ARGV, $libdll or
|
||||
my $inverse;
|
||||
if ($ARGV[$#ARGV] ne '-v') {
|
||||
$inverse = 0;
|
||||
} else {
|
||||
$inverse = 1;
|
||||
$#ARGV--;
|
||||
}
|
||||
|
||||
open my $def_fd, '<', $def or die "$0: couldn't open \"$def\" - $!\n";
|
||||
my %defsyms = ();
|
||||
my $newdef = '';
|
||||
while (<$def_fd>) {
|
||||
if (/^\s*(?:EXPORTS\b|LIBRARY\b|\s*$)/o) {
|
||||
$newdef .= $_;
|
||||
} else {
|
||||
my $sym = (split ' ')[0];
|
||||
$defsyms{$sym} = $_;
|
||||
}
|
||||
}
|
||||
close $def_fd;
|
||||
|
||||
open my $nm_fd, '-|', $nm, '-pg', '--defined-only', @ARGV or
|
||||
die "$0: execution of $nm for object files failed - $!\n";
|
||||
|
||||
my %match_syms = ();
|
||||
my $symfiles = ();
|
||||
my $lastfn;
|
||||
my @headtail = ();
|
||||
my %extract = ();
|
||||
my $libdllname;
|
||||
while (<$nm_fd>) {
|
||||
study;
|
||||
m%^\Q$libdll\E:([^:]*):\d+ i \.idata\$([56])% and do {
|
||||
if ($2 eq 5) {
|
||||
push @headtail, $1;
|
||||
} else {
|
||||
pop @headtail;
|
||||
}
|
||||
next;
|
||||
};
|
||||
m%^\Q$libdll\E:[^:]*:\d+ I (__head_.*)$% and do {
|
||||
$libdllname = $1;
|
||||
next;
|
||||
};
|
||||
next unless m%^([^:]*):([^:]*(?=:))?.* [DTI] (.*)%o;
|
||||
if ($1 ne $libdll) {
|
||||
$match_syms{$3} = 1;
|
||||
} elsif ($match_syms{$3} ? !$exclude : $exclude) {
|
||||
$extract{$2} = 1;
|
||||
}
|
||||
next unless /\S+\s+[A-Z]+\s+_(.*)$/o;
|
||||
if ($inverse) {
|
||||
delete $defsyms{$1};
|
||||
} else {
|
||||
$newdef .= $defsyms{$1} if exists $defsyms{$1};
|
||||
}
|
||||
}
|
||||
close $nm_fd;
|
||||
|
||||
%extract or die "$0: couldn't find symbols for $lib\n";
|
||||
defined($libdllname) or die "$0: couldn't determine __head_<NAME> - malformed import archive?\n";
|
||||
for (@headtail) {
|
||||
$extract{$_} = 1;
|
||||
}
|
||||
$newdef .= join '', sort values %defsyms if $inverse;
|
||||
|
||||
my $dir = tempdir(CLEANUP => 1);
|
||||
|
||||
chdir $dir;
|
||||
# print join(' ', '+', $ar, 'x', sort keys %extract), "\n";
|
||||
my $res = system $ar, 'x', $libdll, sort keys %extract;
|
||||
die "$0: $ar extraction exited with non-zero status\n" if $res;
|
||||
unlink $lib;
|
||||
$res = system $ar, 'crus', $lib, sort keys %extract;
|
||||
die "$0: $ar creation exited with non-zero status\n" if $res;
|
||||
|
||||
open my $lib_fd, '<', $lib or die "$0: couldn't open $lib for input - $!\n";
|
||||
binmode $lib_fd;
|
||||
|
||||
my $libname = dllname($lib, 'lib');
|
||||
my $pad = length($libdllname) - length($libname);
|
||||
die "$0: library name too long (" . length($libname) . ")\n" if $pad < 0;
|
||||
$libname .= "\0" x $pad;
|
||||
|
||||
$res = sysread($lib_fd, $_, -s $lib);
|
||||
close $lib_fd;
|
||||
|
||||
die "$0: couldn't read $lib - $!\n" if $res != -s _;
|
||||
0 while s/$libdllname/$libname/sog;
|
||||
|
||||
open $lib_fd, '>', $lib or die "$0: couldn't open $lib for output - $!\n";
|
||||
syswrite($lib_fd, $_) == length($_) or die "$0: write to $lib failed - $!\n";
|
||||
close $lib_fd;
|
||||
open my $dlltool_fd, '|-', $dlltool, '-d', '/proc/self/fd/0', '-D', 'cygwin1.dll', '-l', $lib or
|
||||
die "$0: couldn't start dlltool - $dlltool - $!\n";
|
||||
print $dlltool_fd $newdef;
|
||||
close $dlltool_fd or exit 1;
|
||||
exit 0;
|
||||
|
||||
sub dllname($;$) {
|
||||
my $x = basename($_[0], '.a');
|
||||
$x =~ s/^lib//o;
|
||||
return '__head_' . $_[1] . $x;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user