Subject: multibyte LC_CTYPE locales (Re: dlopen() twists)
To: None <tech-userlevel@netbsd.org>
From: None <itojun@iijlab.net>
List: tech-userlevel
Date: 01/02/2001 20:13:49
i'd like to integrate citrus multibyte LC_CTYPE support into NetBSD-
current, however, because of dlopen() twists presented in the original
article, i am unable to do that.
the problem is like this:
- we plan to use dlopen() from within setlocale(LC_CTYPE), so that
we can dynamically load multibyte LC_CTYPE locale code from, like
/usr/lib/localemod/libiso2022.so.*.
- if we do that, ld_elf.so will effectively pull dlopen() into
its binary. this causes chicken-and-egg problem.
i can think of couple of workarounds for now:
- do not use dlopen() from within setlocale(LC_CTYPE), have LC_CTYPE
locale code inside libc.
pros: libc build gets simple. setuid binary issues go simple.
we can use LC_CTYPE locale handling code from /sbin/* too.
cons: libc gets much bigger. everyone calls printf() would need to
pull iso2022/utf8/whatever support code, even if they
do not really need locale code.
- use dlopen() from within setlocale(LC_CTYPE). compile ld_elf.so
directly with special singlebyte-only setlocale code.
pros: we can add new locale handling code on the fly, by adding
*.so under /usr/lib/localemod. libc is kept small, and
when LC_CTYPE is set to something other than C, we pull in
locale handling code dynamically.
cons: is it really ld_elf.so only problem? dlopen() cannot be used
from non-dynamic binaries so we cannot use localized
characters from /sbin/*.
- make dlopen() available everywhere, including non-shared binaries.
for ld_elf.so we may still need some hack.
attached is the patch to do the 2nd bullet. or, we may want to supply
/usr/lib/libnolocale.a (or libsinglebytelocale.a) for use with special
binaries like ld.elf_so.
itojun
Index: Makefile
===================================================================
RCS file: /cvsroot/basesrc/libexec/ld.elf_so/Makefile,v
retrieving revision 1.34
diff -u -r1.34 Makefile
--- Makefile 2000/11/10 21:31:30 1.34
+++ Makefile 2001/01/02 11:11:20
@@ -33,6 +33,12 @@
#CPPFLAGS+= -DRTLD_DEBUG_RELOC
#DBG= -g
+# always use singlebyte locale.
+SRCS+= multibyte_sb.c iswctype_sb.c setlocale.c
+CPPFLAGS+= -UWITH_RUNE -I${.CURDIR}/../../lib/libc/locale \
+ -I${.CURDIR}/../../lib/libc/include
+.PATH: ${.CURDIR}/../../lib/libc/locale
+
LDADD+= -non_shared -L${DESTDIR}/${LIBDIR} -lc_pic
DPADD+= ${LIBC_PIC}