This is the mail archive of the cygwin@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

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,$(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?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]