From owner-freebsd-hackers Thu Nov 23 6:38:19 2000 Delivered-To: freebsd-hackers@freebsd.org Received: from alpha.dante.org.uk (alpha.dante.org.uk [193.63.211.19]) by hub.freebsd.org (Postfix) with ESMTP id A48EE37B4C5 for ; Thu, 23 Nov 2000 06:38:16 -0800 (PST) Received: from theta.dante.org.uk ([193.63.211.7]) by alpha.dante.org.uk with esmtp (Exim 3.12 #4) id 13yxVk-0004wh-00; Thu, 23 Nov 2000 14:38:04 +0000 Received: from localhost ([127.0.0.1] helo=dante.org.uk) by theta.dante.org.uk with esmtp (Exim 3.12 #4) id 13yxVi-0004Ji-00; Thu, 23 Nov 2000 14:38:02 +0000 Message-ID: <3A1D2BC7.65AB61AA@dante.org.uk> Date: Thu, 23 Nov 2000 14:37:59 +0000 From: Konstantin Chuguev Organization: Delivery of Advanced Networking Technology to Europe Ltd. X-Mailer: Mozilla 4.75 [en] (X11; U; SunOS 5.6 sun4u) X-Accept-Language: en, ru MIME-Version: 1.0 To: Peter Pentchev Cc: Dmitry Sychov , hackers@FreeBSD.ORG Subject: Re: dlopen() References: <001001c05552$45913f80$0e61bec3@dima> <3A1D1E52.95A9E626@dante.org.uk> <20001123154748.C7746@ringworld.oblivion.bg> Content-Type: text/plain; charset=koi8-r Content-Transfer-Encoding: 7bit Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG Peter Pentchev wrote: > > > Is it safe to remove the *.so file after it is loaded > > > into the process space and addresses to its > > > functions are gotten? > > > > It's safe to remove it as soon as it's been opened. > > The file will still exist in the filesystem, only there won't be any > > references to it from any directories, so you won't be able to open it > > by its name. The file will be really removed from the file system when > > you close your file descriptor. > > So the original poster's question is better translated as 'does the dynamic > loader ever close and reopen a file after the initial loading, so it could > accidentally open the new version of the library and use the old addresses'? > > I'd guess the answer is 'no' - the dynamic loader most probably opens > the file once, and mmap()'s the needed functions; I might very well be wrong > though. > This is how I think it works (don't have any FreeBSD box nearby): For all dynamically loaded modules: dlopen() opens the file (gets a file descriptor) and mmaps it (possibly excluding the debug and some other sections). dlclose() unmaps and closes it. For shared libraries: __init() code of the binary executable dlopen()'s all the libraries, then goes through the table of external symbols, lookups them with dlsym(RTLD_NOW) in the libraries and replaces stub function pointers with the pointers to real functions. The latter may be optimised somehow. __fini() code dlclose()'s all the libraries. But the best way is to look at the source code, of course ;-) -- * * Konstantin Chuguev - Application Engineer * * Francis House, 112 Hills Road * Cambridge CB2 1PQ, United Kingdom D A N T E WWW: http://www.dante.net To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message