Note: I'm moving this conversation over to tools-linking at opensolaris.org.
To follow up, please use tools-linking and drop opensolaris-discuss.
Holger Berger wrote:
> On 4/30/06, Rod Evans <Rod.Evans at sun.com> wrote:
>
>> The colon has been the standard separator of multiple pathnames within
>> the link-editing environment since Solaris 2.0 (it was even used in
>> Solaris 1 (4.x) if I recall).
>
>
> Is there a way to override, replace or escape the ':' separator?
Presently, no. But it seems like a mechanism to allow ':' within
a path is now desirable.
I've a couple of thoughts. First, if you wish to allow ':' within
a dlopen() path, would you also want to allow this character in
a RUNPATH, LD_LIBRARY_PATH, or some other ld.so.1 processed path?
We could invent an escape character that can be embedded in a path.
This provides generic flexibility, but in the case of dlopen()
might require the user to translate a string (read from some config
file?) to include the escape character.
Or, we could allow dlopen() path processing to differ/be-more-flexible
than other path processing. We could force a dlopen() string to be
used as-is. This changes todays behavior, and would break the example
I had cited below. But, would anyone care? Or we could be explicit
in regards our new requirement:
dlopen("foo:bar", RTLD_LAZY | RTLD_FULLPATH)
and use a new token to define a path should be used as is.
Thoughts?
Rod Evans wrote:
> The following conversation occurred recently on opensolaris-discuss.
> I've replicated the conversation on this alias so the we can continue to
> explore ideas with a more appropriate focal group.
>
> > Rod Evans wrote:
> >
> > > Robert Lunnon wrote:
> > >
> > > Wine now uses softlinks named x: (where x is the device name
> > > to link to) placed in the filesystem. Wine preserved the
> > > Windows naming including the colon in the link name.
> > > Unfortunately ld.so.1 doesn't seem to be able to load a
> > > library across these links being confused by the colon in the
> > > name for the moment I have changes in the wine codebase to
> > > resolve the path of the library before loading it, but I'm
> > > inclined to think it is the behaviour of ld.so that is wrong.
> >
> > The link-editors can process path name information in a number
> > of forms. Each form allows multiple paths to be expressed as a
> > series of individual paths separated by a colon:
> >
> > LD_AUDIT, LD_AUDIT_32, and LD_AUDIT_64
> >
> > A colon-separated list of objects that are loaded by the
> > runtime linker. ....
> >
> > LD_LIBRARY_PATH, LD_LIBRARY_PATH_32, and LD_LIBRARY_PATH_64
> >
> > ......... specifies a colon-separated list of directories
> > that are searched before the default directories.
> >
> > -R path
> >
> > A colon-separated list of directories used to specify
> > library search directories to the runtime linker.
> >
> > -Y P,dirlist
> >
> > Changes the default directories used for finding
> > libraries. dirlist is a colon-separated path list.
> >
> > The colon has been the standard separator of multiple pathnames
> > within the link-editing environment since Solaris 2.0 (it was even
> > used in Solaris 1 (4.x) if I recall).
>
>
> > Rod Evans wrote:
> >
> > > > Robert Lunnon wrote:
> > > >
> > > > In short you cannot dlopen a library with a : in the pathname
> > >
> > > Casper Dik wrote:
> > >
> > > That seems like a bug.
> >
> > Perhaps, but the intent has been to make all pathname processing
> > within ld.so.1 consistent. FILTERS, RUNPATHS, LD_LIBRARY_PATH,
> > dependencies, in fact, all pathnames are funneled through the same
> > engine, where tokens are expanded ($ORIGIN, $HWCAP, etc), and
> > multiple pathnames separated.
> >
> > For example, you can use a token that can expand into multiple
> > pathnames:
> >
> > #include <dlfcn.h>
> >
> > main()
> > {
> > dlopen("$ISALIST/foo.so", RTLD_FIRST | RTLD_LAZY);
> > }
> > % LD_DEBUG=files,libs ./main
> > .....
> > 01488: 1: file=$ISALIST/foo.so; dlopen() \
> > called from file=main [ RTLD_LAZY RTLD_LOCAL ... RTLD_FIRST ]
> > 01488: 1: trying path=amd64/foo.so
> > 01488: 1: trying path=pentium_pro+mmx/foo.so
> > 01488: 1: trying path=pentium_pro/foo.so
> > .....
> >
> > Effectively, the ISALIST token results in a ":" separated series
> > of pathnames, which are then processed one by one.
> >
> > Similarly, you can hardcode the lookup yourself:
> >
> > #include <dlfcn.h>
> >
> > main()
> > {
> > dlopen("amd64/foo.so:pentium_pro+mmx/foo.so:pentium_pro/foo.so",
> > RTLD_FIRST | RTLD_LAZY);
> > }
> > % LD_DEBUG=files,libs ./main
> > .....
> > 01489: 1:
> file=amd64/foo.so:pentium_pro+mmx/foo.so:pentium_pro/foo.so; \
> > dlopen() called from file=main [ RTLD_LAZY RTLD_LOCAL ...
> RTLD_FIRST ]
> > 01489: 1: trying path=amd64/foo.so
> > 01489: 1: trying path=pentium_pro+mmx/foo.so
> > 01489: 1: trying path=pentium_pro/foo.so
> > .....
> >
> > Granted, the last scenario hasn't been widely advertised, and you
> > could achieve this, or the ISALIST scenario, by making a family of
> > individual dlopen() calls. But the consistency of pathname
> > processing, for all pathnames used by ld.so.1, is intentional -
> > whether everything has fallen out to be as intuitive as we'd hoped ...
> >
> > If a colon is required as part of a pathname, then perhaps it
> > should be available in any pathname processes by ld.so.1. Either
> > we need a way of specifying an alternative pathname specifier, and
> > simply escaping a ":", or something else ....
>
--
Rod.