From owner-freebsd-hackers Mon Aug 18 16:41:46 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.5/8.8.5) id QAA25529 for hackers-outgoing; Mon, 18 Aug 1997 16:41:46 -0700 (PDT) Received: from rocky.mt.sri.com (rocky.mt.sri.com [206.127.76.100]) by hub.freebsd.org (8.8.5/8.8.5) with ESMTP id QAA25508; Mon, 18 Aug 1997 16:41:40 -0700 (PDT) Received: (from nate@localhost) by rocky.mt.sri.com (8.7.5/8.7.3) id RAA03607; Mon, 18 Aug 1997 17:41:37 -0600 (MDT) Date: Mon, 18 Aug 1997 17:41:37 -0600 (MDT) Message-Id: <199708182341.RAA03607@rocky.mt.sri.com> From: Nate Williams MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: Nate Williams Cc: "Jordan K. Hubbard" , hackers@freebsd.org Subject: Re: [Fwd: Re: Please Help Me Understand dlopen()] In-Reply-To: <199708182250.QAA03442@rocky.mt.sri.com> References: <33F869F3.446B9B3D@FreeBSD.org> <199708182158.PAA03256@rocky.mt.sri.com> <199708182250.QAA03442@rocky.mt.sri.com> X-Mailer: VM 6.29 under 19.15 XEmacs Lucid Sender: owner-freebsd-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk > > > The freeBSD dlsym() is - as far as I know - the only dlsym() > > > implementation that doesn't search for _funktion() ... > I didn't even send out the original patch, but in any case here's the > next version of it.. Which leaks memory, and doesn't allocate room enough for the new string. Thanks to sef for pointing it out, here's the new and improved patch, which allocates enough memory and frees it as well. :) Nate ------- Index: rtld.c =================================================================== RCS file: /home/CVS/src/gnu/usr.bin/ld/rtld/rtld.c,v retrieving revision 1.40.2.3 diff -c -r1.40.2.3 rtld.c *** rtld.c 1997/08/08 02:18:14 1.40.2.3 --- rtld.c 1997/08/18 23:39:28 *************** *** 1916,1922 **** } static void * ! __dlsym3(fd, sym, retaddr) void *fd; char *sym; void *retaddr; --- 1916,1922 ---- } static void * ! __resolvesym_(fd, sym, retaddr) void *fd; char *sym; void *retaddr; *************** *** 1973,1978 **** --- 1973,2003 ---- addr += (long)src_map->som_addr; return (void *)addr; + } + + static void * + __dlsym3(fd, sym, retaddr) + void *fd; + char *sym; + void *retaddr; + { + void *result; + + result = __resolvesym_(fd, sym, retaddr); + /* + * XXX - Ugly, but it makes the least impact on the run-time loader + * sources. + */ + if (result == NULL && !strcmp(dlerror_msg, "Undefined symbol")) { + /* Prepend an underscore and try again */ + char *newsym = malloc(strlen(sym) + 2); + + newsym[0] = '_'; + strcpy(&newsym[1], sym); + result = __resolvesym_(fd, newsym, retaddr); + free(newsym); + } + return result; } static char *