Wierd perl problem..

Chris Faylor cgf@cygnus.com
Tue Nov 30 23:39:00 GMT 1999


On Fri, Nov 05, 1999 at 05:14:15PM -0000, Fifer, Eric wrote:
>Chris Faylor wrote:
>>loading in perl just miraculously "works" now.
>
>I pulled down the 10/31/99 snapshot and I'm still seeing problems
>with fork and dlls.  I went back to my simple forkbug example (see
>below) and it outputs:
>
>in child
>    0       0 [main] s:\efifer\dev\cygwin\forkbug\forkbug1.exe 3192
>handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
>    0   15778 [main] forkbug1 3192 stackdump: Dumping stack trace to
>forkbug1.exe.stackdump
>pid=3192 status=0
>dll1_func=parent
>
>forkbug1.exe.stackdump:
>
>Exception: STATUS_ACCESS_VIOLATION at eip=00005110
>eax=6107B120 ebx=60C81010 ecx=00000009 edx=6107B3B4 esi=00020818
>edi=6107B40C
>ebp=0240FE84 esp=0240FE68 program=s:\efifer\dev\cygwin\forkbug\forkbug1.exe
>cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
>Stack trace:
>Frame     Function  Args
>0240FE64  00005110  (6107B3B4, 60C81000, 00401070, 00000074)
>0240FE84  60C81030  (00401070, 00401066, 0240FED4, 004010CF)
>0240FED4  00401100  (00000001, 0A041238, 0A040008, 00000000)
>0240FF30  61004870  (7FFDF000, 00000000, 00000000, 0040124C)
>0240FF60  61004B1D  (00403010, C0069000, 0240FF90, 00401292)
>0240FF90  0040129F  (00401090, 80C3BD00, 80CCB068, F9071E18)
>0240FFC0  0040103D  (00000000, 00000000, 7FFDF000, 7FFDF000)
>0240FFF0  77F1BA3C  (00401000, 00000000, 00000000, 77FA5AB0)
>End of stack trace
>
>I'll try to work out the problem and send a patch, but in
>the meantime any pointers will be appreciated.

This looks like there was a failure in your dll1_func which appears
to be properly loaded into the child.  The fix that I added to recent
DLLs was only to allow a DLL to load in the same location in the child
as it was in the parent, when there were multiple DLLs loaded to the
same location.

I would not expect this to have any affect on your test case.

cgf

>forkbug1.c:
>
>	#include <stdio.h>
>	#include <unistd.h>
>	#include <sys/wait.h>
>	#include <dlfcn.h>
>
>	int main()
>	{
>	    int	child, pid, status;
>	    void	*dll1_dll;
>	    void	(*dll1_func)();
>
>	    dll1_dll = dlopen("libdll1.dll", RTLD_LAZY);
>	    dll1_func = dlsym(dll1_dll, "dll1_func");
>
>	    if((child = fork()) == 0) {
>		fprintf(stderr, "in child\n");
>		dll1_func("child");
>		exit(0);
>	    }
>
>	    pid = wait(&status);
>	    fprintf(stderr, "pid=%d status=%d\n", pid, status);
>	    dll1_func("parent");
>
>	    return 0;
>	}
>
>libdll1.c:
>
>	#include <stdio.h>
>
>	#define DLLIMPORT __declspec (dllexport)
>
>	DLLIMPORT int
>	dll1_func(char *msg)
>	{
>	    fprintf(stderr, "dll1_func=%s\n", msg);
>	    return 1;
>	}
>
>Makefile:
>
>	CFLAGS	= -g -Wall
>	LDFLAGS = -g
>
>	all: libdll1.dll forkbug1
>
>	forkbug1: forkbug1.o
>		$(CC) $(LDFLAGS) -o forkbug1 forkbug1.o
>
>	%.dll: %.o
>		dllwrap --export-all --output-def $*.def \
>			--output-lib $*.a -o $@ $<

--
Want to unsubscribe from this list?
Send a message to cygwin-unsubscribe@sourceware.cygnus.com



More information about the Cygwin mailing list