On August 22, 2003 07:19 am, Martin Tröster wrote: > 1. Build all object files with winegcc/wineg++ and the following flags: > > -W -g -O0 -I/ -I/usr/include/wine -D_DEBUG -DWIN32 -D_WINDOWS > > -DNOARRAYMACROS -DBUILD_DLL -fPIC
It's a nit, but you don't need -I/usr/include/wine and -DWIN32, these are added automatically by winegcc. Also, what's up with -I/ ??? > 2. relocate symbols (took this one from the makefile of advapi32.dll): > > ld -r $(OBJS) -o libdll.tmp.so && strip --strip-unneeded libdll.tmp.so Good. From the ld man page (about -r): "... When linking C++ programs, this option will not resolve references to constructors; to do that, use -Ur." Is your app C++? > 3. build spec file with the previously generated temporary library, the > imported libraries from winelib and with a spec-file containing the > functions to be exported from the dll and compile it (omitted here) > > with the same flags as used above for the original source files: > > winebuild -fPIC -L/usr/local/lib/wine -lntdll -lkernel32 -luser32 > > -lgdi32-lcomdlg32 -lcrtdll -o libdll.spec.c --spec libdll.spec > > libdll.temp.o Looks fine. > Finally, I (at least try to) tie everything together in a single > > library: > > winegcc -shared -Wl,-soname,libdll.so -DSTRICT -D_REENTRANT > > -L/usr/local/lib/wine -lntdll -lkernel32 -luser32 -lgdi32 -lcomdlg32 > > -lstdc++ -lcrtdll -lgcc_s -lm $(OBJS) Hey, winegcc does not support -shared just yet. Just simulate this line using just gcc, as we do in the tree. > You see, I am a little bit desperate about this thing, having come > pretty far, but now seeming to fail on the last meters. So any help (on > this list or if you think it's too specific to my private mail) would be > really, really appreciated. If I find some time, I will volunteer to > write a short step-by-step guide based on my observations, if this is > any help for you to avoid dumb questions like these ;-) Yes, that will be very helpful, if only to show where we need to fix our tools :) > (1) winegcc -W -g -O0 -I/usr/include/wine -fPIC -o testlib.o -c > testlib.c > (2) ld -r testlib.o -o libtest.dll.temp.o > (3) strip --strip-unneeded libtest.dll.temp.o > (4) winebuild -fPIC -o testlib.spec.c --spec testlib.spec > libtest.dll.temp.o winegcc -W -g -O0 -I/usr/include/wine > -o testlib.spec.o -c testlib.spec.c > (5) gcc -shared -Wl,-Bsymbolic,-z,defs > testlib.o testlib.spec.o -o libtest.dll.so (5) is missing the libs, no? The rule from the tree is: $(MODULE).so: $(MAINSPEC).o $(ALL_OBJS) Makefile.in $(LDSHARED) $(LDDLLFLAGS) $(MAINSPEC).o $(ALL_OBJS) -o $@ -L$(DLLDIR) $(LDIMPORTS:%=-l%) $(ALL_LIBS) -lc where ALL_LIBS is: ALL_LIBS = $(LIBWINE) $(EXTRALIBS) $(LIBPORT) $(LDFLAGS) $(LIBS) So I guess at a minimum you need to add: -L/usr/local/lib -lwine -lm -lc But to be on the safe side, add: -lwine -lwine_port -lwine_unicode -lwine_uuid -lm -lc plus all the imports! -- Dimi.