delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2007/04/18/13:58:58

X-Spam-Check-By: sourceware.org
Message-ID: <4624C9BF.35C7B6E3@dessent.net>
Date: Tue, 17 Apr 2007 06:21:03 -0700
From: Brian Dessent <brian AT dessent DOT net>
X-Mailer: Mozilla 4.79 [en] (Windows NT 5.0; U)
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Re: Transforming a static library to a DLL
References: <Pine DOT OSF DOT 4 DOT 21 DOT 0704171429110 DOT 2777-100000 AT ax0rm1 DOT roma1 DOT infn DOT it>
X-IsSubscribed: yes
Reply-To: cygwin AT cygwin DOT com
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

Angelo Graziosi wrote:

> Trying to transform in DLL, for example the library 'libmathlib.a', I
> have tried this:

I don't really think you should try to "convert" a library like this. 
You really need to recompile each object, as normally there are
different preprocessor defines in effect for creating a static library
vs. a DLL, which affects function declarations.  And on other non-PE
platforms you would most certainly have to recompile so that you can
generate position independent code, but on PE at the moment there is no
distinction between PIC and non-PIC.
  
[ This could potentially change at some point in the future; there was a
gcc patch submitted but not championed to add PLT-like true-PIC behavior
on PE, instead of using text relocations.  I don't think it's going
anywhere, and it might have problems interoperating with native
toolchains, but there's a chance somebody might clean it up and champion
it. ]

No matter how you go about it though, when creating a DLL you have to
arrange for the function and data exports to be specified, using the
standard methods, i.e. one of:

- explicitly declare with __declspec(dllexport)
- use a .def file
- --export-all-symbols

If no object file has any __declspec(dllexport) anywhere then you get
--export-all-symbols by default, otherwise you have to specify it.  In
your case that might be enough to do what you want, but you'll have to
dig in a little further and see where these missing symbols need to come
from.

>    gcc -shared -o cygmathlib.dll \
>        -Wl,--enable-auto-image-base \
>        -Wl,--out-implib=libmathlib.dll.a \
>        -Wl,--enable-auto-import
>        -Wl,--whole-archive libmathlib.a \
>        -Wl,--no-whole-archive -lg2c
> 
> but it fails with a lot of :
> -------------------------------------
> libmathlib.a(arithm.o):cccrN4fn.f:(.text+0x17): undefined reference to
> `_funct_'
> libmathlib.a(arithm.o):cccrN4fn.f:(.text+0x154): undefined reference to
> `_funct_'
> libmathlib.a(d501l1.o):cc44FCLd.f:(.text+0x2dd): undefined reference to
> `_dvset_'
> ...
> -------------------------------------
> 
> Perhaps I have forgot to add some other library on command line.

I don't know.  You'll have to use nm/ar to look around and see where
these missing symbols are defined.  It could be a missing library, it
could be a link order problem, or it could be that some preprocessor
symbol was in the wrong state (i.e. defined when it shouldn't be or
missing when it was required, ala -DFOO_STATIC or -DBUILDING_FOO or
-DFOO_DLL etc.) when the objects were compiled which caused __declspec
declarations to be wrong.  It all depends on the design of the library.

Brian

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019