Subject: RE: Imake and DLLs under Cygwin
From: "Suhaib Siddiqi" <[email-masked]>
To: "Richard" <[email-masked]>
Cc: "[email-masked]" <[email-masked]>
Date: Wed, 18 Aug 1999 13:06:34 -0400

First you need to figure out the export symbols from your code and write
service-def.cpp.

You can grab the updates cygwin.cf, cygwin.rules and cygwin.tmpl, plus
Imake.cf
from cygwin-xfree source tree.  It is at
sourceware.cygnus.com/pub/cygwin/xfree
and would be more helpfull if you direct the further questions from that
source tree to
cygwin-xfree mailing list.

Suhaib

  -----Original Message-----
  From: [email-masked]
[mailto:[email-masked]]On Behalf Of Richard
  Sent: Wednesday, August 18, 1999 12:50 PM
  To: [email-masked]
  Subject: Imake and DLLs under Cygwin

  I have an application which I've successfully rebuilt on Solaris.  It was
configured with imake.
  I now have a requirement to port it to Cygwin.  Using the imake from my
X11 distribution there have been various errors due to the Cygwin
configuration files (cygwin.tmpl, cygwin.rules ... in
X11R6.4/lib/X11/config) being somewhat out-of-date, but these have been
solved.
  The problem comes with the attempt to produce a 'shared library' (DLL on
Cygwin of course).  The Imakefile uses the imake rule
SharedLibraryTarget(...):
  ---------------------------
  #define SharedLibraryTarget(libname,rev,solist,down,up)
@@\
  AllTarget(Concat3(lib,libname,.dll))
@@\
           @@\

CppFileTarget(libname.def,libname-def.cpp,-DLIBRARY_VERSION=rev,$(ICONFIGFIL
ES)) @@\
  ---------------------------

  which produces the following make rules:

  ---------------------------
  service.def::  service-def.cpp $(ICONFIGFILES)
   $(RM) $@
   $(CPP)  -DLIBRARY_VERSION=1 <service-def.cpp | sed -e '/^#  *[0-9][0-9]*
*.*$$/d' -e\ '/^XCOMM$$/s//#/' -e '/^XCOMM[^a-zA-Z0-9_]/s/^XCOMM/#/' >$@

  clean::
   $(RM) service.def

  junk.c:
   echo "#include <cygwin/cygwin_dll.h>"  >junk.c
   echo "DECLARE_CYGWIN_DLL(dll_main);"  >>junk.c
   echo "int WINAPI dll_main(HANDLE a, DWORD reason, void *q)" >>junk.c
   echo "{ return 1; }"    >>junk.c
  libservice.dll: $(OBJS) junk.o service.def
   $(RM) libservice.a
   $(RM) libservice.dll

   if [ -f $(BASE_COUNTER) ]; then true; \
   else echo 0x67000000 > $(BASE_COUNTER); fi
   dllwrap -s --def service.def --output-lib libservice.a -o libservice.dll
$(OBJS) junk.o $(REQUIREDLIBS) -image-base `cat $(BASE_COUNTER)`
   IMAGE_LENGTH=`objdump -x libservice.dll |awk '/SizeOfImage/ {print
"0x"$$2}'`; \
   export IMAGE_LENGTH=`expr '(' \`printf %u $$IMAGE_LENGTH\` / 65536 + 1
')' '*' 65536` ; \
   export IMAGE_BASE=`cat $(BASE_COUNTER)`; \
   printf 0x%x `expr \`printf %u $$IMAGE_BASE\` + $$IMAGE_LENGTH` >
$(BASE_COUNTER)
   $(_NULLCMD_)
  ----------------------------

  The problem is that I don't have any service-def.cpp, and I don't know the
correct format for it.

  When I write my own 'service.def' and exclude the 'service.def' rule from
the makefile, it fails with:
  dlltool: unrecognized option `--exclude-symbol=_cygwin_dll_entry@12'

  My dllwrap is version 0.2.4 and dlltool 2.9.4.

  When I copy the 'dllwrap' line to the command line it runs without error
(surprisingly), but the nm says 'No symbols in "libservice.dll"'.

  Has anyone been though this sort of thing before?