libtool/mail/cygwin32
Robert Boehne a701df2d0a * docs/libtool.texi: Added pointers to documentation
of Hewlett-Packard, Compaq Tru64 and IBM AIX systems.
2000-10-27 20:04:28 +00:00

961 lines
37 KiB
Plaintext

From ian@cygnus.com Tue Nov 3 23:23 EDT 1998
Received: from grande.dcc.unicamp.br (grande.dcc.unicamp.br [143.106.7.8])
by amazonas.dcc.unicamp.br (8.8.5/8.8.5) with ESMTP id XAA22373
for <oliva@amazonas.dcc.unicamp.br>; Tue, 3 Nov 1998 23:23:22 -0200 (EDT)
Received: from tweedledumb.cygnus.com (tweedledumb.cygnus.com [192.80.44.1])
by grande.dcc.unicamp.br (8.8.5/8.8.5) with ESMTP id XAA20164
for <oliva@dcc.unicamp.br>; Tue, 3 Nov 1998 23:23:18 -0200 (EDT)
Received: from subrogation.cygnus.com (subrogation.cygnus.com [192.80.44.76])
by tweedledumb.cygnus.com (8.8.5/8.8.5) with ESMTP id UAA13699;
Tue, 3 Nov 1998 20:25:28 -0500 (EST)
Received: (ian@localhost) by subrogation.cygnus.com (950413.SGI.8.6.12/8.6.4) id UAA01678; Tue, 3 Nov 1998 20:25:28 -0500
Date: Tue, 3 Nov 1998 20:25:28 -0500
Message-Id: <199811040125.UAA01678@subrogation.cygnus.com>
From: Ian Lance Taylor <ian@cygnus.com>
To: gvaughan@oranda.demon.co.uk
CC: tanner@gmx.de, oliva@dcc.unicamp.br, gord@trick.fig.org,
bug-libtool@gnu.org
In-reply-to: <363F3F85.2B31574@oranda.demon.co.uk>
(gvaughan@oranda.demon.co.uk)
Subject: Re: Inter-library dependencies in libtool
Content-Type: text
X-Content-Length: 3237
Xref: araguaia.dcc.unicamp.br libtool-cygwin32:2
Lines: 69
X-Gnus-Article-Number: 2 Wed Nov 4 01:39:12 1998
Date: Tue, 03 Nov 1998 17:38:13 +0000
From: "Gary V. Vaughan" <gvaughan@oranda.demon.co.uk>
It would seem that the dll code has bitrotted =(O| Pity. Ian, do you
have time/want to fix this, or do you want to pass the torch on?
I no longer have access to a Windows machine, nor do I have all that
much interest in the problem, so I'd say that somebody else had better
pick up the torch.
Incidentally, I believe that DJ Delorie is working on adding DLL
support directly to ld, which will mean that dlltool is no longer
required, and should make it possible to greatly simplify the win32
hacks in dlltool, perhaps even simply using the standard GNU ld code.
Shouldn't libtool notice that it is running on cygwin32 and pass the
-no-undefined option by itself? It seems to go against the raison
d'etre for libtool to force the Makefile developer to figure this out...
This kind of goes to the heart of libtool. libtool wants to present a
particular interface for using shared libraries. In order to do this,
it assumes that the system supports certain capabilities. One of
those is that the system can support undefined symbols in shared
libraries.
That means that on systems which do not permit shared libraries to
have undefined symbols--AIX and Windows--libtool doesn't really work.
The --no-undefined option is a hack which tells libtool that the
shared library has special characteristics which permit libtool to
create a shared library on AIX or Windows, or any other supported
platform.
I think the general idea is that you should use the --no-undefined
option whenever possible. If you do, you will be able to create
shared libraries on AIX and Windows. If you do not or can not, you
will not be able to create them.
libtool should not add a --no-undefined option itself. If it used
that option inappropriately, then building the shared library would
fail. Instead, libtool users should always use --no-undefined if they
can.
Of course, there are problems. For example, in the GNU binutils, I
can arrange matters such that --no-undefined will work on Windows, but
to do so I have to link various libraries together and I have to link
against special Windows system libraries. So I do that, which means
that I have to change the options I pass to libtool based on the
system.
In other words, the interface which libtool presents is deficient. It
does not successfully hide the system on which it is running, and it
forces the code which calls libtool to make adjustments.
I doubt there is any wholly acceptable solution here. The only
workable one I can see would be to effectively enhance Windows and AIX
shared libraries such that they support creating shared libraries with
undefined symbols. On Windows, this could be done by doing the link
once, checking for undefined symbols, creating little stub routines
for those symbols which track down the symbols in some other open DLL,
compiling those stubs, and linking them into the DLL. Perhaps
something similar is possible on AIX.
Of course even that will not make Windows DLLs identical to ELF shared
libraries. ELF shared libraries permit the main program to override a
symbol in the shared library, and Windows DLLs do not.
Ian
When libtool links DLLs, it strips some command line switches. It's probably
the case that this is ok for most situations. However, this potentially breaks
Mingw32 support in the Cygwin environment.
In order to get Mingw32 support in Cygwin, the compiler must be invoked with
the -mno-cygwin switch. If libtool strips this switch out during the link
process, the resulting binary will get linked with the wrong import libraries.
The following is a small example. I've edited the output a bit for
readability. When I send this email, long lines will get broken up, so it
still might be a bit difficult to read.
-------------------------
$ libtool --version
ltmain.sh (GNU libtool) 1.3.3 (1.385.2.181 1999/07/02 15:49:11)
$ cat xx.c
extern __declspec(dllexport) int func(void);
int func()
{
}
$ libtool --mode=compile gcc -mno-cygwin -c xx.c
mkdir .libs
gcc -mno-cygwin -c -DPIC xx.c -o .libs/xx.lo
mv -f .libs/xx.lo xx.o
ln -s xx.o xx.lo
$ libtool --mode=link gcc -mno-cygwin -o libxx.la xx.lo \
-version-info 0:0:0 -no-undefined -rpath /usr/local/lib
rm -fr .libs/libxx.la .libs/libxx.* .libs/libxx.*
generating symbol list for `libxx.la'
test -f .libs/libxx-0-0-0.dll-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here
\*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d <
/usr/local/bin/libtool > .libs/libxx-0-0-0.dll-ltdll.c
test -f .libs/libxx-0-0-0.dll-ltdll.o || (cd .libs && gcc -c
libxx-0-0-0.dll-ltdll.c)
dlltool --export-all --exclude-symbols
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def
.libs/libxx-0-0-0.dll-def .libs/libxx-0-0-0.dll-ltdll.o xx.o
sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < .libs/libxx-0-0-0.dll-def >
.libs/libxx.exp
echo EXPORTS > .libs/libxx-0-0-0.dll-def
_lt_hint=1; for symbol in `cat .libs/libxx.exp`; do echo " $symbol @
$_lt_hint; " >> .libs/libxx-0-0-0.dll-def; _lt_hint=`expr 1 + $_lt_hint`; done
test -f .libs/libxx-0-0-0.dll-ltdll.c || sed -e "/^# \/\* ltdll\.c starts
here\*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d <
/usr/local/bin/libtool > .libs/libxx-0-0-0.dll-ltdll.c
test -f .libs/libxx-0-0-0.dll-ltdll.o || (cd .libs && gcc -c
libxx-0-0-0.dll-ltdll.c)
gcc -Wl,--base-file,.libs/libxx-0-0-0.dll-base -Wl,--dll -nostartfiles -Wl,-e,
__cygwin_dll_entry@12 -o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o
xx.o
dlltool --as=as --dllname libxx-0-0-0.dll --exclude-symbols
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def
.libs/libxx-0-0-0.dll-def --base-file .libs/libxx-0-0-0.dll-base --output-exp
.libs/libxx-0-0-0.dll-exp
gcc -Wl,--base-file,.libs/libxx-0-0-0.dll-base
.libs/libxx-0-0-0.dll-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12
-o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o xx.o
dlltool --as=as --dllname libxx-0-0-0.dll --exclude-symbols
DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def
.libs/libxx-0-0-0.dll-def --base-file .libs/libxx-0-0-0.dll-base --output-exp
.libs/libxx-0-0-0.dll-exp
gcc
.libs/libxx-0-0-0.dll-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12
-o .libs/libxx-0-0-0.dll .libs/libxx-0-0-0.dll-ltdll.o xx.o
(cd .libs && rm -f libxx.a && ln -s libxx-0-0-0.dll libxx.a)
dlltool --as=as --dllname libxx-0-0-0.dll --def
.libs/libxx-0-0-0.dll-def --output-lib .libs/libxx.a
creating libxx.la
(cd .libs && rm -f libxx.la && ln -s ../libxx.la libxx.la)
---------------
Notice how the 'gcc' lines do not contain the -mno-cygwin switch. This switch
should not get stripped.
Jon Leichter
jon@symas.com
"Gary V. Vaughan" wrote:
>
> On Wed, Aug 30, 2000 at 10:51:36AM -0400, Charles Wilson wrote:
> > No, it can't. Currently, libtool itself doesn't support *building*
> > dlls.
>
> Ouch. Yes it does. I added support around Christmas 1998, and have
> been maintaining it ever since.
Thanks for the correction.
>
> Yes it does. And provided your libraries don't trip over the stupid
> dll limitation of "to export a non-function symbol you must edit your
> sources", it works easily. Even if you do export data symbols,
> libtool woll build and link against a dll for you (even generating an
> import lib along the way).
>
> Unfortunately libtool was developed for Unix and assumes a featureful
> shared library architecture, which doesn't map very easily onto win32
> dll's.
>
> I will be able to simplify the dll build process a little when DJ's
> patches to binutils arrive in a cygwin release (did this happen in
> 1.1? I have been so busy with m4 that I only upgraded from b20.1 a few
> weeks ago).
They landed in binutils-20000625, and were finetuned/tweaked to a fairly
stable point by binutils-20000722 (the current version in /latest).
Also, there were a few additions that changed ld's default search order
for libraries:
-Bstatic -lfoo :
looks for libfoo.a
-Bdynamic -lfoo :
looks for libfoo.dll.a (default name for an import lib)
then foo.dll.a (alt. name for an import lib)
then libfoo.dll (link directly to a dll)
then foo.dll (ditto, alt. name)
finally, libfoo.a (fall back to static lib)
The spec file for gcc (as of 2.95.2-2) changed so that:
gcc -static calls 'ld -Bstatic'
gcc calls 'ld -Bdynamic'
Finally, 'gcc -shared' will build a dll, but you need to pass linker
options like '-Wl,--out-implib=libfoo.dll.a' explicitly.
FWIW, all of the (non-libtool) libraries I've dll-ized do not use
dlltool at all, and rely only on gcc (and ld, indirectly).
--Chuck
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
From gary Tue Oct 3 18:51:55 2000
Return-Path: <cygwin-return-16563-gvaughan=oranda.demon.co.uk@sources.redhat.com>
Received: from pop3.mail.demon.net
by localhost with POP3 (fetchmail-5.3.4)
for gary@localhost (single-drop); Tue, 03 Oct 2000 18:51:55 +0100 (BST)
Received: from punt-2.mail.demon.net by mailstore
for gvaughan@oranda.demon.co.uk id 970581289:20:22249:24;
Tue, 03 Oct 2000 13:54:49 GMT
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-2.mail.demon.net
id aa2022220; 3 Oct 2000 13:54 GMT
Received: (qmail 29977 invoked by alias); 3 Oct 2000 13:52:38 -0000
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
Precedence: bulk
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin@sources.redhat.com>
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner@sources.redhat.com
Delivered-To: mailing list cygwin@sources.redhat.com
Received: (qmail 29933 invoked from network); 3 Oct 2000 13:52:34 -0000
Received: from mumnunah.cs.mu.oz.au (203.19.244.130)
by sourceware.cygnus.com with SMTP; 3 Oct 2000 13:52:34 -0000
Received: from murlibobo.cs.mu.OZ.AU (murlibobo.cs.mu.OZ.AU [128.250.29.17]) by mumnunah.cs.mu.OZ.AU with ESMTP
id AAA23121; Wed, 4 Oct 2000 00:52:14 +1100 (EST)
Received: (from fjh@localhost) by murlibobo.cs.mu.OZ.AU (8.8.5/8.7.3) id AAA11289; Wed, 4 Oct 2000 00:52:13 +1100 (EST)
Date: Wed, 4 Oct 2000 00:52:13 +1100
From: Fergus Henderson <fjh@cs.mu.oz.au>
To: "Gary V. Vaughan" <gvv@techie.com>, cygwin@sources.redhat.com,
cgf@cygnus.com
Subject: Re: linking against shared libraries
Message-ID: <20001004005212.A9274@murlibobo.cs.mu.OZ.AU>
References: <012a01c02033$936effc0$f7c723cb@lifelesswks> <20000917010735.G606@demon.co.uk> <20000916234420.A23827@cygnus.com> <20000917122440.I606@demon.co.uk> <20000917122837.A24997@cygnus.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Mailer: Mutt 0.95.1i
In-Reply-To: <20000917122837.A24997@cygnus.com>; from Chris Faylor on Sun, Sep 17, 2000 at 12:28:37PM -0400
Status: RO
Content-Length: 2625
Lines: 51
On 17-Sep-2000, Chris Faylor <cgf@cygnus.com> wrote:
> On Sun, Sep 17, 2000 at 12:24:40PM +0100, Gary V. Vaughan wrote:
> >If you are interested, I will add an entry to my TODO list to see if I
> >can take some of the nicities from the libtldl LoadLibrary wrapper
> >code and apply them to the Cygwin LoadLibrary wrapper? (Automatic `_'
> >prefixing for example).
>
> Is this a characteristic of normal linux/UNIX dlsym?
AFAIK, Unix systems that support dlopen() don't prefix C symbol
names with `_' when compiling them to assembler in the first place,
so the issue is moot. At least this is the case on Solaris (2.7),
Linux (>= libc6), and OSF1 (3.2 ), which are the systems that
I have easily available right now. dlopen() originated on Solaris,
according to the Linux man page.
On systems such as Cygwin which do prefix C names with `_' when
compiling to assembler, whether dlopen() should prefix the name with an
underscore depends on whether the name that the user is trying to look
up is an assembly name or a C name. If it's a C name, then it's right
for dlopen() to prefix the name with an underscore, to match what the
C compiler does, but if it's an assembly name, then doing that would
be wrong. Unfortunately the interface to dlopen() provides the
dlopen() implementation with no clues as to which one the user meant.
The documentation for dlopen() says that the argument is the "symbol
name", which is ambiguous, but could be read as implying that it is
supposed to be the assembly name. However, in practice most uses of
dlopen() tend to be passing C names rather than assembler names.
Probably most uses of dlopen() are for C names, and so inserting
the prefix would work well in most cases. However, inserting the
prefix would also make it impossible to look up assember names that
don't start with underscore using dlopen().
It's a bit like the issue of text-versus-binary:
the original unix-only interface didn't need to distinguish
between the different cases (text/binary or C/asm/whatever),
but in the Windows environment, you do need to make such
distinctions. So some programs will need source modifications.
The best you can do is to choose the default carefully,
and make it easy to override the default for programs for which
the default is not appropriate.
--
Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh> | of excellence is a lethal habit"
PGP: finger fjh@128.250.37.3 | -- the last words of T. S. Garp.
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
On Sun, Sep 03, 2000 at 01:34:23AM -0400, Charles Wilson wrote:
> "Gary V. Vaughan" wrote:
>
> > > Now, suppose that the png folks release a newer version, say png-2.1.x
> > > that exposes some additional features, but is backwards compatible with
> > > png-2.0.x. Great. You build it, but create:
> > >
> > > libpng31.dll.a (embeds the name libpng31.dll.a)
> > > libpng.dll.a -> libpng31.dll.a
> > > libpng3.dll (replaces the old version (*))
> >
> > I don't think we need anything more than
> >
> > a replacement libpng3.dll
>
> Not so. Remember, libpng-2.1.x can include additional functions that
> were not included by libpng-2.0.x, as long as it includes all of the
> 'old' functions/vars without modification. So, you need to update the
> import lib as well as the dll, so that new packages that use the
> additional functions will work.
Oops. I hadn't thought of that. Good point.
> > Otherwise we are still in violent agreement.
>
> I agree.
=)O|
> > > > Maybe Cygwin should put all of it's libtool built libraries (or any
> > > > others that are correctly versioned w.r.t the runtime loader) into a
> > > > single directory that is near the front of the default path. /usr/lib
> > > > seems like a good place.
> > >
> > > That's part of my 'easy' solution above. It may fix the cygwin problem,
> > > but the requirement is not nice to native apps or other unix-on-win
> > > emulations that the user may have.
> > >
> > > Relying on 'get dll's from same dir as .exe' works -- but only if EVERY
> > > cygwin exe and EVERY cygwin dll are piled into the same dir.
> >
> > Can't we assume that the native dll's we rely on are outside cygwin's
> > control and can be relied upon to be managed by the operating system
> > (I'm thinking of stuff in the SYSTEM directory), and that non-cygwin
> > libraries (such as Pauls pw dlls) will not be installed into the
> > cygwin binary search path? In which case I think it is okay to
> > install all cygwin dlls and import libs to /usr/lib, making sure that
> > cygwin.bat (or any other cygwin startup methods) put /usr/lib first in
> > $PATH.
>
> this works for the 'sandbox user' -- Michael Ring's 'user 1' in this
> message:
> http://sources.redhat.com/ml/cygwin/2000-08/msg01241.html
>
> It doesn't work for Michael's 'user 2' -- the guy who normally runs in
> cmd.exe/command.com, but relies on cygwin commands every once in a
> while. He doesn't use bash, but likes the cygwin-perl or grep every
> once and a while. User 2 will have the cygwin directories somewhere in
> her path -- but not necessarily first.
We could tell these people to put C:/cygwin/usr/bin at the front of
their PATH...
> > Does cygwin ld use -rpath yet?
>
> I don't think so. -rpath is something that ld.so uses; Windows doesn't
> have ld.so. Windows *always* loads dll's according to the following
> search order:
> current directory
> app's load directory
> global executable search path
>
> The only two exceptions I know of are:
>
> 1) In Win2K, if there is a file called 'app.exe.local' in the same
> directory as app.exe, then all dll's will be loaded from the app's load
> directory -- even if explicitly dlopened() with an absolute path that
> points elsewhere. the .local. may also override the 'current directory'
> part of the search order listed above, but I'm not sure.
Holy cr@p! What happened to simplicity? If Bill has decided that he
can't understand how to write a decent shared library system, and
want's to relegate dll's to LoadLibrary() objects, why doesn't he just
say so? Wouldn't it be easier to statically link a Win2k program that
twiddle about with all this .local mess?
> 2) You can put something called 'AppPath' in the registry, which will
> influence the directories that are searched. I don't know where in the
> list above that the directories listed in the 'AppPath' key are
> inserted.
This sounds promising. I'll see if I can find any details on it.
> > I am prepared to work on having libtool do the right thing as far
> > as possible.
>
> What was the right thing, again? :-)
Based on our conversation so far:
* When building a libtool (.la) library, create libfoo.la,
libfoo<iface>.dll, libfoo.dll.a and libfoo.a, where:
- <iface> is the earliest fully supported interface number
- libfoo.dll.a is the import library for libfoo<iface>.dll
* When installing a libtool (.la) library:
- libfoo.la goes to $prefix/lib
- libfoo<iface>.dll goes to $prefix/bin
- libfoo.dll.a goes to $prefix/lib
- libfoo.a goes to $prefix/lib
* When linking against libfoo.la
- use libfoo.dll.a unless -static or -all-static
- otherwise use libfoo.a
* When linking against -lfoo
- if libfoo.la is found, behave as above
- else let ld (or gcc) do its thing
Which is especially cool, because I don't think I need to worry about
dealing with direct linkage to dlls (I can just punt and let gcc/ld do
the hard work) which removes a whole pile of spaghetti where I had to
cope with compiling the impgen code correctly in cross compilation
environments!
> > By default libtool always searches for a dll to link against and
> > generates the implib on the fly if a suitable one is found.
This won't be necessary under the new scheme =)O|
> There are occaisions where you want to link to an import lib in
> preference to a dll -- for instance, libcygwin.a is an import lib, but
> contains initializer code and actual function implementations for some
> functions that are not included in the dll itself. If you attempt to
> link directly to cygwin1.dll, the link fails because those things are
> missing from the virtual on-the-fly implib.
I didn't know about that. Thanks.
> But where do you put the dll? It has to go into the executable PATH so
> that the windows loader can find it. Do you copy it into /usr/lib, so
> that the default ld search path will find it? Do you add /usr/bin to
> the linktime library search path (-L/usr/bin)? Perhaps a symlink in
> /usr/lib, pointing to /usr/bin/libfoo.dll is all you need.
>
> However!!! Ld uses the following library name search order when hunting
> for -lfoo:
>
> libfoo.dll.a
> foo.dll.a
> libfoo.a <<<< NOTE!!
> libfoo.dll
> foo.dll
Or that. Thanks again! Libtool already provides --disable-static if
the user wants to build and install only the dll parts of the library.
For this to work (that is, in order for me to be able to punt to gcc/ld
in the majority of cases) I must generate dll names that will be
found, so the cygfoo.dll idea is out (Sorry Paul!).
Although this doesn't help ``User 2'' very much, he is no worse off
than before if I change libtool's behaviour in this way. Here's a
thought: For each dll using application linked, I could have libtool
install a .bat script to C:/cygwin/launch (or similar) which would set
the PATH environment correctly for that application. As long as
``User 2'' has the launch directory higher in his PATH than the actual
binary directory, this would guarantee correct dll selection.
This would give ``User 1'' many of the advantages shared libraries
offer on Unix, without sinking into DLL Hell. Assuming that everyone
buys into it. The only reason shared libraries work properly on Unix
is that everyone has to agree to conform to the runtime loader's
versioning scheme -- so don't give some excuse about ``if we don't
want to change the core cygwin dll's to conform this won't work''. On
my linux box, I can move my libc around or drop several incompatible
versions of libc into my filesystem, and my applications will stop
loading the intended libraries too. No surprises there!
Cheers,
Gary.
--
___ _ ___ __ _ mailto: gvv@techie.com
/ __|__ _ _ ___ _| | / / | / /_ _ _ _ __ _| |_ __ _ ___ gary@gnu.org
| (_ / _` | '_|// / |/ /| |/ / _` | || / _` | ' \/ _` | _ \
\___\__,_|_|\_, /|___(_)___/\__,_|\_,_\__, |_||_\__,_|//_/
home page: /___/ /___/ gpg public key:
http://www.oranda.demon.co.uk http://www.oranda.demon.co.uk/key.asc
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
On Sun, Sep 03, 2000 at 04:39:51PM -0300, Alexandre Oliva wrote:
> On Sep 3, 2000, "Gary V. Vaughan" <gvv@techie.com> wrote:
>
> > * When installing a libtool (.la) library:
> > - libfoo.la goes to $prefix/lib
> > - libfoo<iface>.dll goes to $prefix/bin
> > - libfoo.dll.a goes to $prefix/lib
> > - libfoo.a goes to $prefix/lib
>
> Nope. libfoo.la goes wherever -rpath specified when the library was
> created; it should be the same directory that is specified at install
> time. This is often $(libdir), but it doesn't have to be.
>
> I don't know how to arrange for an additional directory (bindir) to
> be specifiable without introducing an additional command-line option.
> Remember, libtool doesn't know about prefix, libdir or bindir, it just
> knows about what it's given in the command line.
Hmm. I hadn't thought of that. Still, at least the principle of the
thing is right now, I think...
Cheers,
Gary.
--
___ _ ___ __ _ mailto: gvv@techie.com
/ __|__ _ _ ___ _| | / / | / /_ _ _ _ __ _| |_ __ _ ___ gary@gnu.org
| (_ / _` | '_|// / |/ /| |/ / _` | || / _` | ' \/ _` | _ \
\___\__,_|_|\_, /|___(_)___/\__,_|\_,_\__, |_||_\__,_|//_/
home page: /___/ /___/ gpg public key:
http://www.oranda.demon.co.uk http://www.oranda.demon.co.uk/key.asc
There's an easier way -- one command! 'gcc -shared' will create a dll
for you. Just do:
$(BASE)=foo
gcc -shared -o cyg$(BASE).dll -Wl,--out-implib=lib$(BASE).dll.a \
-Wl,--export-all -Wl,--enable-auto-image-base \
-Wl,--output-def=cyg$(BASE).def $(OBJS)
Grab any of the packages in the 'contrib' directory and look an the
makefiles (you might need to do a minimal 'configure' first, to
customize the Makefile for cygwin before using it as a model)
--Chuck
Jrgen Schuck wrote:
>
> I'm not sure about the kind of object that 'gcc -shared'
> produces. But I think it won't be what you might expect.
> In Windows shared sobjects are DLL's. You probably will
> have to convert your Makefiles to cproduce DLL's instead
> of UNIX-style .so files.
>
> I did the same task when porting a TCL-extension from
> UNIX to Cygwin. The Makefile (SVR4) changes from
>
> libTclDM20.so:
> ld -G -o $@ $(OBJS)
>
> to
>
> LOAD = TclDM20
> DEF = $(LOAD).def
> BAS = $(LOAD).base
> EXP = $(LOAD).exp
> $(DLL): $(OBJS)
> echo EXPORTS >$(DEF)
> nm $+ | grep '^........ [T] _' | sed 's/[^_]*_//' >>$(DEF)
> $(LD) --base-file $(BAS) -dll -o $@ $+ -e _dll_entry@12 \
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
> dlltool --as=as -dllname $@ --def $(DEF) \
> --base-file $(BAS) --output-exp $(EXP)
> $(LD) --base-file $(BAS) $(EXP) -dll -o $@ $+ -e _dll_entry@12 \
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
> dlltool --as=as -dllname $@ --def $(DEF) \
> --base-file $(BAS) --output-exp $(EXP)
> $(LD) $(EXP) -dll -o $@ $+ -e _dll_entry@12 \
> -L`dirname \`gcc -print-file-name=libgcc.a\`` \
> $(LIBS) -lgcc -lcygwin -lkernel32 -lgcc
>
> For further information see
> http://sources.redhat.com/cygwin/docs.html,
> section "Writing DLLs". Reading these docs you
> will find two further modules: dll_init.c and
> dll_fixup.c. I didn't put them into my DLL because
> the resulting DLL crashes the TCL-interpreter.
>
> Furthermore I found it very helpful to take a
> look into the Makefiles of the DLL-generating
> packages of the Cygwin-distribution: tcl, wish
> and tix.
>
> Jrgen Schuck
> PCM-Kundenbetreuung
> Business Unit Information
> _________________________________________________
> MATERNA GmbH Information & Communications
> Vosskuhle 37 * 44141 Dortmund
> Tel.: 0231 - 5599 - 191 * Fax: -272
> Handy: 0172 - 23 70 148 * http://www.materna.de
>
> --
> Want to unsubscribe from this list?
> Send a message to cygwin-unsubscribe@sourceware.cygnus.com
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
From gary Tue Oct 10 18:50:22 2000
Return-Path: <cygwin-return-16847-gvaughan=oranda.demon.co.uk@sources.redhat.com>
Received: from pop3.mail.demon.net
by localhost with POP3 (fetchmail-5.3.4)
for gary@localhost (single-drop); Tue, 10 Oct 2000 18:50:22 +0100 (BST)
Received: from punt-2.mail.demon.net by mailstore
for gvaughan@oranda.demon.co.uk id 971135226:20:06380:2;
Mon, 09 Oct 2000 23:47:06 GMT
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-2.mail.demon.net
id aa2005552; 9 Oct 2000 23:46 GMT
Received: (qmail 16236 invoked by alias); 9 Oct 2000 23:46:45 -0000
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
Precedence: bulk
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin@sources.redhat.com>
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner@sources.redhat.com
Delivered-To: mailing list cygwin@sources.redhat.com
Received: (qmail 16211 invoked from network); 9 Oct 2000 23:46:43 -0000
Received: from mail.ee.gatech.edu (130.207.230.10)
by sourceware.cygnus.com with SMTP; 9 Oct 2000 23:46:43 -0000
Received: from ece.gatech.edu (s02-pm03.gatech.campuscwix.net [168.14.1.69])
by mail.ee.gatech.edu (8.11.0/8.11.0) with ESMTP id e99NkTO15440;
Mon, 9 Oct 2000 19:46:30 -0400 (EDT)
Message-ID: <39E259A7.CBAD325F@ece.gatech.edu>
Date: Mon, 09 Oct 2000 19:49:59 -0400
From: Charles Wilson <cwilson@ece.gatech.edu>
X-Mailer: Mozilla 4.75 [en] (Windows NT 5.0; U)
X-Accept-Language: en
MIME-Version: 1.0
To: cygwin@sourceware.cygnus.com
Subject: Re: AW: Linking Dynamic Libraries
References: <004501c031f0$10478ad0$0d33028b@zapperlot.materna.de> <39E1CC08.F475851F@ece.gatech.edu> <39E2468B.BFDD3AB7@ihug.co.nz>
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Status: RO
Content-Length: 5252
Lines: 189
You still need to worry about things like __declspec(dllexport) and
__declspec(dllimport). Here's a patch for your files.
(Yes, you are correct; the option is '--export-all-symbols' not
'--export-all')
As far as documentation, there's the mailing list, and 'ld --help' and
Mumit's (really out-of-date) dll-helpers packaqe at
http://www.xraylith.wisc.edu/~khan/software/gnu-win32/dllhelpers.html.
Would you like to update that package for the current capabilities of
ld/gcc ? Mumit's tutorial is heavily 'dlltool' based, rather than 'gcc
-shared' or 'ld' based.
NOTE 1: I had to remove "-Wl,--export-all-symbols" from the options;
with export-all I got a stack dump even with my other changes. I'm not
sure why.
NOTE 2: I used the extension '.dll.a' for the import library; cygwin's
linker will search for 'libfoo.dll.a' in preference to 'libfoo.a';
libfoo.a is assumed to be a static library (although the linker will use
libfoo.a if .dll.a is not found)
--Chuck
diff -u demo-orig/Makefile demo/Makefile
--- demo-orig/Makefile Mon Oct 9 19:34:15 2000
+++ demo/Makefile Mon Oct 9 19:45:10 2000
@@ -3,7 +3,7 @@
EXENAME = demo
EXEOBJ = demo.o
CPLUS = g++ -W -Wall -Werror
-LINKDLL = g++ -shared -Wl,--export-all -Wl,--enable-auto-image-base
+LINKDLL = g++ -shared -Wl,--enable-auto-image-base
LINKEXE = g++ -L.
.DELETE_ON_ERROR:
@@ -13,13 +13,16 @@
all: $(DLLNAME).dll $(EXENAME)
clean:
- rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).a $(EXEOBJ)
$(EXENAME).exe
+ rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).dll.a $(EXEOBJ)
$(EXENAME).exe
%.o: %.cpp
$(CPLUS) -c $< -o $@
+$(DLLOBJ): $(DLLOBJ:.o=.cpp)
+ $(CPLUS) -DBUILD_DLL -c $< -o $@
+
$(DLLNAME).dll: $(DLLOBJ)
- $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
-Wl,--out-implib=lib$(DLLNAME).a
+ $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
-Wl,--out-implib=lib$(DLLNAME).dll.a
$(EXENAME): $(EXEOBJ) $(DLLNAME).dll
$(LINKEXE) $(EXEOBJ) -l$(DLLNAME) -o $(EXENAME)
diff -u demo-orig/foo.hpp demo/foo.hpp
--- demo-orig/foo.hpp Mon Oct 9 19:35:58 2000
+++ demo/foo.hpp Mon Oct 9 19:35:50 2000
@@ -3,7 +3,12 @@
#include <string>
-extern std::string global_mangle(const std::string& source);
-
+#ifdef BUILD_DLL
+#define FOO_EXPORT __declspec(dllexport)
+#else
+#define FOO_EXPORT __declspec(dllimport)
#endif
+extern FOO_EXPORT std::string global_mangle(const std::string& source);
+
+#endif
Ross Smith wrote:
>
> "Charles S. Wilson" wrote:
> >
> > There's an easier way -- one command! 'gcc -shared' will create a dll
> > for you. Just do:
> >
> > $(BASE)=foo
> >
> > gcc -shared -o cyg$(BASE).dll -Wl,--out-implib=lib$(BASE).dll.a \
> > -Wl,--export-all -Wl,--enable-auto-image-base \
> > -Wl,--output-def=cyg$(BASE).def $(OBJS)
>
> I can't get this to work. Whenever I link with the import lib produced
> this way, the resulting program crashes with a STATUS_ACCESS_VIOLATION.
> (See attached code.) I don't even need to call any of the DLL functions
> to trigger it -- just linking with -lfoo makes it unworkable. What am I
> doing wrong?
>
> And where is all this stuff documented anyway? The ld docs mention
> --export-all-symbols (not --export-all), but not any of the others.
>
> -------------------- cut here --------------------
>
> // demo.cpp
>
> #include "foo.hpp"
> #include <iostream>
> #include <string>
>
> int main() {
> std::string thing("thing");
> std::cout << thing << std::endl;
> // std::cout << global_mangle(thing) << std::endl;
> return 0;
> }
>
> -------------------- cut here --------------------
>
> // foo.hpp
>
> #ifndef FOO_HEADER
> #define FOO_HEADER
>
> #include <string>
>
> extern std::string global_mangle(const std::string& source);
>
> #endif
>
> -------------------- cut here --------------------
>
> // foo.cpp
>
> #include "foo.hpp"
>
> std::string global_mangle(const std::string& source) {
> return source + "_global";
> }
>
> -------------------- cut here --------------------
>
> // Makefile
>
> DLLNAME = foo
> DLLOBJ = foo.o
> EXENAME = demo
> EXEOBJ = demo.o
> CPLUS = g++ -W -Wall -Werror
> LINKDLL = g++ -shared -Wl,--export-all -Wl,--enable-auto-image-base
> LINKEXE = g++ -L.
>
> .DELETE_ON_ERROR:
>
> .PHONY: all clean
>
> all: $(DLLNAME).dll $(EXENAME)
>
> clean:
> rm -f $(DLLOBJ) $(DLLNAME).dll lib$(DLLNAME).a $(EXEOBJ)
> $(EXENAME).exe
>
> %.o: %.cpp
> $(CPLUS) -c $< -o $@
>
> $(DLLNAME).dll: $(DLLOBJ)
> $(LINKDLL) $(DLLOBJ) -o $(DLLNAME).dll
> -Wl,--out-implib=lib$(DLLNAME).a
>
> $(EXENAME): $(EXEOBJ) $(DLLNAME).dll
> $(LINKEXE) $(EXEOBJ) -l$(DLLNAME) -o $(EXENAME)
>
> demo.o: demo.cpp foo.hpp
> foo.o: foo.cpp foo.hpp
>
> -------------------- cut here --------------------
>
> --
> Ross Smith <ross.s@ihug.co.nz> The Internet Group, Auckland, New Zealand
> ========================================================================
> "C++ is to programming as sex is to reproduction. Better ways might
> technically exist but they're not nearly as much fun." -- Nikolai Irgens
>
> --
> Want to unsubscribe from this list?
> Send a message to cygwin-unsubscribe@sourceware.cygnus.com
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com
From gary Wed Oct 11 18:38:50 2000
Return-Path: <cygwin-return-16974-gvaughan=oranda.demon.co.uk@sources.redhat.com>
Received: from pop3.mail.demon.net
by localhost with POP3 (fetchmail-5.3.4)
for gary@localhost (single-drop); Wed, 11 Oct 2000 18:38:50 +0100 (BST)
Received: from punt-1.mail.demon.net by mailstore
for gvaughan@oranda.demon.co.uk id 971256552:10:18423:4;
Wed, 11 Oct 2000 09:29:12 GMT
Received: from sourceware.cygnus.com ([205.180.83.71]) by punt-1.mail.demon.net
id aa1018296; 11 Oct 2000 9:29 GMT
Received: (qmail 10937 invoked by alias); 11 Oct 2000 09:28:33 -0000
Mailing-List: contact cygwin-help@sourceware.cygnus.com; run by ezmlm
Precedence: bulk
List-Unsubscribe: <mailto:cygwin-unsubscribe-gvaughan=oranda.demon.co.uk@sources.redhat.com>
List-Subscribe: <mailto:cygwin-subscribe@sources.redhat.com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin@sources.redhat.com>
List-Help: <mailto:cygwin-help@sources.redhat.com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner@sources.redhat.com
Delivered-To: mailing list cygwin@sources.redhat.com
Received: (qmail 10909 invoked from network); 11 Oct 2000 09:28:30 -0000
Received: from web6405.mail.yahoo.com (128.11.22.153)
by sourceware.cygnus.com with SMTP; 11 Oct 2000 09:28:30 -0000
Message-ID: <20001011092829.19377.qmail@web6405.mail.yahoo.com>
Received: from [203.97.2.247] by web6405.mail.yahoo.com; Wed, 11 Oct 2000 22:28:29 NZDT
Date: Wed, 11 Oct 2000 22:28:29 +1300 (NZDT)
From: =?iso-8859-1?q?Danny=20Smith?= <danny_r_smith_2001@yahoo.co.nz>
Subject: Re: AW: Linking Dynamic Libraries
To: cygwin@sources.redhat.com
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Status: RO
Content-Length: 1133
Lines: 38
Ross Smith wrote:
>
> Charles Wilson wrote:
> >
> > You still need to worry about things like __declspec(dllexport) and
> > __declspec(dllimport).
>
> What's the point of --export-all-symbols then? I was under the
> impression that it was intended to duplicate the Unix convention,
where
> all external symbols are automatically exported from a .so.
(Actually,
> the help refers to "global" symbols, not "external", but I assumed
that
> just meant that whoever wrote the help didn't know C++.)
If you really want to --export-all in C++, this is a workaround.
Create a def with dlltool:
dlltool --export-all --output-def foo_.def --dllname foo.dll *.o
Then look at the def file. Do you still really want to export-all?
To use that def file with ld -shared you need to get rid of the
comments (demangled names)
cut does the job:
cut -d ';' -f 1 foo_.def >foo.def
Cheers
_____________________________________________________________________________
http://clubs.yahoo.com.au - Yahoo! Clubs
- Join a club or build your own!
--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com