Imake and DLLs under Cygwin

Richard hicklinr@mcd.alcatel.be
Wed Aug 18 09:48:00 GMT 1999


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,$(ICONFIGFILES))
@@\
---------------------------
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?



More information about the Cygwin mailing list