* mkimport: New script to perform all operations necessary to create

libcygwin.a.
* rmsym: Delete.
* newsym: Delete.
* Makefile.in (toolopts): New variable which holds options relating to
binutils/gcc tools.
(speclib): Use toolopts.  Add symbols to avoid copying to special libraries.
(OBSOLETE_FUNCTIONS): Delete.
(NEW_FUNCTIONS): Change to represent an argument to new mkimport script.
(libcygwin.a): Use only new mkimport script to create libcygwin.a.  Only rely
on ${LIBCOS}.
(*/lib*.a): Simplify speclib dependencies.
(speclib): Accept toolchain options.  Convert every argument to absolute path.
Simplify parsing of nm output.  Accommodate new exclude option.
This commit is contained in:
Christopher Faylor 2009-04-12 03:19:52 +00:00
parent 370a1171d8
commit edd090a270
6 changed files with 188 additions and 139 deletions

View File

@ -1,3 +1,23 @@
2009-04-11 Christopher Faylor <me+cygwin@cgf.cx>
* mkimport: New script to perform all operations necessary to create
libcygwin.a.
* rmsym: Delete.
* newsym: Delete.
* Makefile.in (toolopts): New variable which holds options relating to
binutils/gcc tools.
(speclib): Use toolopts. Add symbols to avoid copying to special
libraries.
(OBSOLETE_FUNCTIONS): Delete.
(NEW_FUNCTIONS): Change to represent an argument to new mkimport
script.
(libcygwin.a): Use only new mkimport script to create libcygwin.a.
Only rely on ${LIBCOS}.
(*/lib*.a): Simplify speclib dependencies.
(speclib): Accept toolchain options. Convert every argument to
absolute path. Simplify parsing of nm output. Accommodate new
exclude option.
2009-04-11 Dave Korn <dave.korn.cygwin@googlemail.com>
* include/stdint.h (INTPTR_MIN, INTPTR_MAX): Add 'L' suffix.

View File

@ -105,7 +105,14 @@ LIBGMON_A:=libgmon.a
CYGWIN_START:=crt0.o
GMON_START:=gcrt0.o
speclib=${word 1, $^} "${NM}" "${AR}" $(wordlist 2, $(words $^), $^)
toolopts:=--ar=${AR} --as=${AS} --nm=${NM} --objcopy=${OBJCOPY}
speclib=\
${srcdir}/speclib ${toolopts} \
--exclude='cygwin' \
--exclude='(?i:dll)' \
--exclude='reloc' \
--exclude='^_main$$' \
$^
# 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
@ -162,67 +169,60 @@ EXCLUDE_STATIC_OFILES:=$(addprefix --exclude=,\
GMON_OFILES:=gmon.o mcount.o profil.o
OBSOLETE_FUNCTIONS:=open acl aclcheck aclfrommode aclfrompbits \
aclfromtext aclsort acltomode acltopbits \
acltotext chown facl fchown fcntl fdopen fgetpos fopen \
freopen fseeko fsetpos fstat ftello ftruncate \
getegid geteuid getgid getgrent getgrgid getgrnam \
getgroups getpwuid getpwuid_r getuid initgroups \
lchown lseek lstat mknod mmap seekdir setegid seteuid \
setgid setgroups setregid setreuid setuid stat \
telldir tmpfile truncate timezone
NEW_FUNCTIONS:=open _open64 \
acl _acl32 \
aclcheck _aclcheck32 \
aclfrommode _aclfrommode32 \
aclfrompbits _aclfrompbits32 \
aclfromtext _aclfromtext32 \
aclsort _aclsort32 \
acltomode _acltomode32 \
acltopbits _acltopbits32 \
acltotext _acltotext32 \
chown _chown32 \
facl _facl32 \
fchown _fchown32 \
fcntl _fcntl64 \
fdopen _fdopen64 \
fgetpos _fgetpos64 \
fopen _fopen64 \
freopen _freopen64 \
fseeko _fseeko64 \
fsetpos _fsetpos64 \
fstat _fstat64 \
ftello _ftello64 \
ftruncate _ftruncate64 \
getegid _getegid32 \
geteuid _geteuid32 \
getgid _getgid32 \
getgrent _getgrent32 \
getgrgid _getgrgid32 \
getgrnam _getgrnam32 \
getgroups _getgroups32 \
getpwuid _getpwuid32 \
getpwuid_r _getpwuid_r32 \
getuid _getuid32 \
initgroups _initgroups32 \
lchown _lchown32 \
lseek _lseek64 \
lstat _lstat64 \
mknod _mknod32 \
mmap _mmap64 \
seekdir _seekdir64 \
setegid _setegid32 \
seteuid _seteuid32 \
setgid _setgid32 \
setgroups _setgroups32 \
setregid _setregid32 \
setreuid _setreuid32 \
setuid _setuid32 \
stat _stat64 \
telldir _telldir64 \
tmpfile _tmpfile64 \
truncate _truncate64
NEW_FUNCTIONS:=$(addprefix --replace=,\
acl=_acl32 \
aclcheck=_aclcheck32 \
aclfrommode=_aclfrommode32 \
aclfrompbits=_aclfrompbits32 \
aclfromtext=_aclfromtext32 \
aclsort=_aclsort32 \
acltomode=_acltomode32 \
acltopbits=_acltopbits32 \
acltotext=_acltotext32 \
chown=_chown32 \
facl=_facl32 \
fchown=_fchown32 \
fcntl=_fcntl64 \
fdopen=_fdopen64 \
fgetpos=_fgetpos64 \
fopen=_fopen64 \
freopen=_freopen64 \
fseeko=_fseeko64 \
fsetpos=_fsetpos64 \
fstat=_fstat64 \
ftello=_ftello64 \
ftruncate=_ftruncate64 \
getegid=_getegid32 \
geteuid=_geteuid32 \
getgid=_getgid32 \
getgrent=_getgrent32 \
getgrgid=_getgrgid32 \
getgrnam=_getgrnam32 \
getgroups=_getgroups32 \
getpwuid=_getpwuid32 \
getpwuid_r=_getpwuid_r32 \
getuid=_getuid32 \
initgroups=_initgroups32 \
lchown=_lchown32 \
lseek=_lseek64 \
lstat=_lstat64 \
mknod=_mknod32 \
mmap=_mmap64 \
open=_open64 \
seekdir=_seekdir64 \
setegid=_setegid32 \
seteuid=_seteuid32 \
setgid=_setgid32 \
setgroups=_setgroups32 \
setregid=_setregid32 \
setreuid=_setreuid32 \
setuid=_setuid32 \
stat=_stat64 \
telldir=_telldir64 \
timezone= \
tmpfile=_tmpfile64 \
truncate=_truncate64 \
)
API_VER:=$(srcdir)/include/cygwin/version.h
@ -396,11 +396,8 @@ $(TEST_DLL_NAME): $(LDSCRIPT) dllfixdbg $(DLL_OFILES) $(DLL_IMPORTS) $(LIBSERVER
@ln -f $@ new-$(DLL_NAME)
# Rule to build libcygwin.a
$(LIB_NAME): rmsym newsym $(TEST_DLL_NAME) $(LIBCOS)
/bin/sh ${word 1,$^} ./cygdll.a "$(NM)" "$(AR)" $(OBSOLETE_FUNCTIONS) || exit 0
/bin/sh ${word 2,$^} ./cygdll.a "$(AS)" "$(AR)" $(NEW_FUNCTIONS) || exit 0
(echo create $(LIB_NAME); echo addmod $(LIBCOS); echo addlib cygdll.a; echo save) | $(AR) -M
$(RANLIB) $@
$(LIB_NAME): $(LIBCOS) | $(TEST_DLL_NAME)
${srcdir}/mkimport ${toolopts} ${NEW_FUNCTIONS} $@ cygdll.a $^
${STATIC_LIB_NAME}: mkstatic ${TEST_DLL_NAME}
perl -d $< -x ${EXCLUDE_STATIC_OFILES} --library=${LIBC} --library=${LIBM} --ar=${AR} $@ cygwin.map
@ -442,22 +439,22 @@ shared.o: shared_info_magic.h
$(srcdir)/devices.cc: gendevices devices.in devices.h
${wordlist 1,2,$^} $@
${CURDIR}/libc.a: speclib ${LIB_NAME} ./libm.a libpthread.a libutil.a
${CURDIR}/libc.a: ${LIB_NAME} ./libm.a libpthread.a libutil.a
${speclib} -v ${@F}
${CURDIR}/libm.a: speclib ${LIB_NAME} $(LIBM)
${CURDIR}/libm.a: ${LIB_NAME} $(LIBM)
${speclib} ${@F}
libpthread.a: speclib ${LIB_NAME} pthread.o thread.o
libpthread.a: ${LIB_NAME} pthread.o thread.o
${speclib} ${@F}
libutil.a: speclib ${LIB_NAME} bsdlib.o
libutil.a: ${LIB_NAME} bsdlib.o
${speclib} ${@F}
libdl.a: speclib ${LIB_NAME} dlfcn.o
libdl.a: ${LIB_NAME} dlfcn.o
${speclib} ${@F}
libresolv.a: speclib ${LIB_NAME} minires.o
libresolv.a: ${LIB_NAME} minires.o
${speclib} ${@F}
${EXTRALIBS}: lib%.a: %.o

80
winsup/cygwin/mkimport Executable file
View File

@ -0,0 +1,80 @@
#!/usr/bin/perl
use strict;
use File::Temp qw'tempdir';
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);
# Args::
# 1) import lib to create
# 2) input dll
# 3...) extra objects to add
$_ = File::Spec->rel2abs($_) for @ARGV;
my $libdll = shift;
my $inpdll = shift;
open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', $inpdll;
my %text = ();
my %import = ();
my %symfile = ();
while (<$nm_fd>) {
chomp;
my ($fn, $type, $sym) = /^$inpdll:(.*?):\S+\s+(\S)\s+(\S+)$/o;
next unless $fn;
$text{$fn} = $sym if $type eq 'T';
$import{$fn} = $sym if $type eq 'I';
$symfile{$sym} = $fn;
}
close $nm_fd or exit 1;
for my $sym (keys %replace) {
my $fn;
my $_sym = '_' . $sym;
if (!defined($fn = $symfile{$_sym})) {
$fn = "$sym.o";
$text{$fn} = $_sym;
}
my $imp_sym = '__imp__' . $replace{$sym};
$import{$fn} = $imp_sym;
}
for my $f (keys %text) {
my $imp_sym = delete $import{$f};
my $glob_sym = $text{$f};
if (!defined $imp_sym) {
delete $text{$f};
} elsif ($imp_sym eq '__imp__') {
$text{$f} = 0;
} else {
$text{$f} = 1;
open my $as_fd, '|-', $as, '-o', "$dir/t-$f", "-";
print $as_fd <<EOF;
.extern $imp_sym
.global $glob_sym
$glob_sym:
jmp *$imp_sym
EOF
close $as_fd or exit 1;
}
}
chdir $dir or die "$0: couldn't cd to $dir - $!\n";
system $ar, 'x', $inpdll;
exit 1 if $?;
for my $f (keys %text) {
if (!$text{$f}) {
unlink $f;
} else {
system $objcopy, '-R', '.text', $f and exit 1;
system $objcopy, '-R', '.bss', '-R', '.data', "t-$f" and exit 1;
}
}
unlink $libdll;
exec $ar, 'crus', $libdll, glob('*.o'), @ARGV;

View File

@ -1,39 +0,0 @@
#!/bin/bash
lib=$1; shift
as=$1; shift
ar=$1; shift
rm -rf newsym.dir
trap "rm -rf newsym.dir" 0 1 2 15
mkdir newsym.dir
while [ -n "$1" ]; do
newsym=$1; shift
oldsym=$1; shift
if [[ "$newsym" = *:d ]]; then
newsym=${newsym%:d}
else
cat <<EOF
.text
.global _$newsym
_$newsym:
jmp *__imp__$oldsym
EOF
fi > newsym.dir/$newsym.s
cat <<EOF >> newsym.dir/$newsym.s
.section .idata\$7
.long __head_cygwin1_dll
.section .idata\$5
.global __imp__$newsym
__imp__$newsym: .rva 1f
.section .idata\$4
.rva 1f
.section .idata\$6
1: .short 2
.asciz "$oldsym"
EOF
$as -o newsym.dir/$newsym.o newsym.dir/$newsym.s
done
$ar crus $lib newsym.dir/*.o

View File

@ -1,9 +0,0 @@
#!/bin/sh
lib=$1; shift
nm=$1; shift
ar=$1; shift
grepit=`echo $* | sed 's/ /\$|__imp__/g'`
[ -n "$grepit" ] && grepit="__imp__$grepit\$"
objs=`$nm $lib | awk -F: '/^d*[0-9][0-9]*.o:/ {obj=$1} '"/$grepit/"'{print obj}'`
[ -n "$objs" ] || exit 1
$ar ds $lib $objs

View File

@ -8,35 +8,35 @@ use strict;
sub dllname($;$);
my $static;
my $exclude;
my $inverse;
my @exclude;
GetOptions('static!'=>\$static, 'v|exclude!'=>\$exclude);
my ($ar, $as, $nm, $objcopy);
GetOptions('exclude=s'=>\@exclude, 'static!'=>\$static, 'v!'=>\$inverse,
'ar=s'=>\$ar, 'as=s'=>\$as,'nm=s'=>\$nm, 'objcopy=s'=>\$objcopy);
my $nm = shift;
my $ar = shift;
my $libdll = File::Spec->rel2abs(shift @ARGV);
my $lib = File::Spec->rel2abs(pop @ARGV);
$_ = File::Spec->rel2abs($_) for @ARGV;
open my $nm_fd, '-|', $nm, '-Ap', '--defined-only', @ARGV, $libdll or
my $libdll = shift;
my $lib = pop;
open my $nm_fd, '-|', $nm, '-Apg', '--defined-only', @ARGV, $libdll or
die "$0: execution of $nm for object files failed - $!\n";
my %match_syms = ();
my $symfiles = ();
my $lastfn;
my %extract = ();
my $exclude_regex = @exclude ? join('|', @exclude) : '\\UnLiKeLy//';
$exclude_regex = qr/$exclude_regex/;
while (<$nm_fd>) {
study;
m%^\Q$libdll\E:([^:]*):\d+ i \.idata\$([56])% and do {
next;
};
m%^\Q$libdll\E:[^:]*:\d+ I (__head_.*)$% and do {
next;
};
next unless m%^([^:]*):([^:]*(?=:))?.* [DTI] (.*)%o;
if ($1 ne $libdll) {
$match_syms{$3} = 1;
} elsif ($match_syms{$3} ? !$exclude : $exclude) {
$extract{$2} = 1;
my ($file, $member, $symbol) = m%^([^:]*):([^:]*(?=:))?.* T (.*)%o;
next if !defined($symbol) || $symbol =~ $exclude_regex;
if ($file ne $libdll) {
$match_syms{$symbol} = 1;
} elsif ($match_syms{$symbol} ? !$inverse : $inverse) {
$extract{$member} = 1;
}
}
close $nm_fd;