tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: dlopen fails from static binary



On Mon, Apr 18, 2016 at 09:29:23AM +0200, Martin Husemann wrote:
> > Is dlopen really supposed ot fail when called from 
> > static binary? In that case errno should be set, but to what value?
> > Or perhaps we could support dlopen from static binary?
> 
> We should fail to link in this case. Where does the dlopen stub come
> from?

It seems to be from libc:

$ nm /usr/lib/libc.a|grep dlopen                      
00000000 T ___dlopen
00000000 W __dlopen
00000000 W dlopen
         U __dlopen

src/lib/libc/dlfcn/dlfcn_elf.c says:
/*
 * For ELF, the dynamic linker directly resolves references to its
 * services to functions inside the dynamic linker itself.  These
 * weak-symbol stubs are necessary so that "ld" won't complain about
 * undefined symbols.  The stubs are executed only when the program is  
 * linked statically, or when a given service isn't implemented in the
 * dynamic linker.  They must return an error if called, and they must
 * be weak symbols so that the dynamic linker can override them.
 */

static char dlfcn_error[] = "Service unavailable";

/*ARGSUSED*/
void *
dlopen(const char *name, int mode)
{

        return NULL;
}


That suggests we just need to set errno there. To what value? ENOEXEC?

-- 
Emmanuel Dreyfus
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index