The locale ctors that take a locale name can't deal with absolute pathnames on Solaris (see the test case below). That's because the Solaris locale category separator is the same as a path separator (i.e., the forward slash character) and the ctors do not distinguish one from the other.
$ cat t.cpp && make t && LC_ALL=../nls/en_US.ISO-8859-1 ../bin/locale && ./t `cd ../nls && pwd`/en_US.ISO-8859-1
#include <locale>
int main (int, char *argv[])
{
(void)std::locale (argv [1]);
}
gcc -c -I/build/sebor/dev/stdlib/include/ansi -D_RWSTDDEBUG -D_RWSTD_USE_CONFIG -I/build/sebor/dev/stdlib/include -I/build/sebor/gcc-4.1.0-11s/include -I/build/sebor/dev/stdlib/examples/include -pedantic -nostdinc++ -g -W -Wall -Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long t.cpp
gcc t.o -o t -L/build/sebor/gcc-4.1.0-11s/lib -lstd11s -lsupc++ -lm
LANG=C
LC_CTYPE="../nls/en_US.ISO-8859-1"
LC_COLLATE="../nls/en_US.ISO-8859-1"
LC_TIME="../nls/en_US.ISO-8859-1"
LC_MONETARY="../nls/en_US.ISO-8859-1"
LC_NUMERIC="../nls/en_US.ISO-8859-1"
LC_MESSAGES="../nls/en_US.ISO-8859-1"
LC_ALL=../nls/en_US.ISO-8859-1
terminate called after throwing an instance of 'std::runtime_error'
what(): /build/sebor/dev/stdlib/src/locale_combine.cpp:639: std::locale::locale(const char*): bad locale name: "/build/sebor/gcc-4.1.0-11s/nls/en_US.ISO-8859-1"
Abort (core dumped)