X-Recipient: archive-cygwin AT delorie DOT com DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; q=dns; s=default; b=J2 1/FwRmTO/Ir1V2r9BLy1FKLugxpq0tKl9z2N3yP2FnYDNHc8exu0dyjtNGksGD/g aTbovQvduinuTJplGnaH+1sEMFOrIroGtU1RNa1CgyBMrp+cW0U9VqMmSVBA7z80 w/M5aFCSlc7XBtmkimu96nHdHuyVR0Hw5cMtDE2Pk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; s=default; bh=pJztzw40 ZhUbW1YrgofNsyIadeE=; b=SpUAZ3zwRuS4gFXvUUSKWSaNVA3WWCuwPVlPrGcS DBgRQIhEEg8gvTUoCGf3CTSCVcRtseb8gSqoz8I1zF9BFR9xl2lQOZLqmt9+3a4G h9ksOT147V3UFQX1ucsATIR/DPULd8o5MTGj84IxrGxmGqVqG6DJqzzoKvEkZBl3 A2E= Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 X-HELO: mail-qc0-f178.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=Mws9fPZq3AnPlxKNPCkg2nu398x5iG8d/F2zMaywzTE=; b=jo0q2guJPihBzo48nETew5nhfu/oyOY0J5NofTNbSU3W8uca7jduSQ7KWnz4wUrjuN yTwXSRRKbhfsLjy8g9P1+f1ELxDWo+tLCd98fpoFo85dqVj+KsK1tICGGplpEUP8WLjZ 6crHbrbK6esWjx+CCT6GcXQq66n0Qv0xbOzYSMXwhDT+6Hpp/rSwaFhSNAWw7stZSv8J I9FGGs5WReovuwzAgGyFBTnFwoqLwPlWePI3lb9sJiciXBALumZs0sq8fdiRk+7dSdIb tTi9NtHrW1sLvjUSfmdbCB3UnW1JAbEyZ46XtEM9Gun0rWlEkfNgjFsEVDK432MKS6D4 hTpQ== X-Gm-Message-State: ALoCoQk3oIAGinf7L4+x1J7z1iWRnhaYV1oO2K754PrGx5ROPsU0wKDY/rvP90yfUiqMX0cndE3L MIME-Version: 1.0 X-Received: by 10.140.105.69 with SMTP id b63mr887374qgf.36.1392902204899; Thu, 20 Feb 2014 05:16:44 -0800 (PST) In-Reply-To: References: Date: Thu, 20 Feb 2014 14:16:44 +0100 Message-ID: Subject: Re: Bug with dlopen() and fork() From: Jaime Fabregas Fernandez To: cygwin AT cygwin DOT com Content-Type: text/plain; charset=ISO-8859-1 Hello Corinna, As you've checked, this behaviour doesn't appear with dll's created by gcc, but it does with Visual Studio C++. That minimal example compiled with VS will result in the freeze of the child process. ================ testlib.h ====================== #ifdef TESTLIB_EXPORTS #define TEST_API extern "C" __declspec(dllexport) #else #define TEST_API extern "C" __declspec(dllimport) #endif TEST_API int mylib_open (const char *foo); ============================================= =============== testlib.cpp ====================== #include "stdafx.h" #include "testLib.h" int mylib_open (const char *foo) { return 1; } ============================================== I've tested several compiler and linker options with same result. Any ideas? > On Feb 19 14:38, Jaime Fabregas Fernandez wrote: >> Library references loaded by a process using dlopen() and dlsym() are >> no more valid in child processes after running a fork(). Calls from >> child process will never return. >> >> I've searched for a similar problem in the mailing lists and found >> this unanswered thread from 2001: >> >> http://cygwin.com/ml/cygwin/2001-02/msg01225.html >> >> >> I'm running cygwin64. This behaviour can be checked with the following >> test program: >> >> ======================================================== >> #include >> #include >> >> int (*myopen)(const char *); >> >> main(){ >> void *handle; >> int ret; >> handle = dlopen("my_lib.dll", RTLD_LAZY); >> myopen = dlsym(handle, "mylib_open"); >> >> if( ! fork() ){ >> ret = myopen(""); >> printf("This printf never shows, call to myopen will >> block for ever\n"); >> } >> else{ >> ret = myopen(""); >> printf("%i\n", ret); >> sleep(1); >> } >> } >> ======================================================== >> >> Same program runs correctly (showing the two printf's) in a Linux environment. > > Works for me with 64 bit Cygwin. I used this as DLL: > > $ cat > my_lib.c < int > mylib_open (const char *foo) > { > return 1; > } > $ gcc -shared -o my_lib.dll my_lib.c > $ gcc -g -o my_tst my_tst.c <- That's your above testcase > $ uname -a > CYGWIN_NT-6.3 vmbert8164 1.7.28(0.271/5/3) 2014-02-04 16:01 x86_64 Cygwin > $ ./my_tst > 1 > This printf never shows, call to myopen will block for ever > $ > > > Corinna > > -- > Corinna Vinschen Please, send mails regarding Cygwin to > Cygwin Maintainer cygwin AT cygwin DOT com > Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple