Subject: lib/4478: libedit's namespace protection practices are funky/annoying
To: None <gnats-bugs@gnats.netbsd.org>
From: Jason R Thorpe <thorpej@nas.nasa.gov>
List: netbsd-bugs
Date: 11/12/1997 21:03:45
>Number:         4478
>Category:       lib
>Synopsis:       libedit's namespace protection practices are funky/annoying
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    lib-bug-people (Library Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Nov 12 21:05:01 1997
>Last-Modified:
>Originator:     Jason R Thorpe
>Organization:
Numerical Aerospace Simulation Facility - NASA Ames
>Release:        source trunk of Wed Nov 12 20:49:26 PST 1997
>Environment:
	
System: NetBSD lestat 1.3A NetBSD 1.3A (LESTAT) #110: Tue Oct 28 18:45:38 PST 1997 thorpej@lestat:/tmp_mnt/dracul/u5/netbsd/src/sys/arch/sparc/compile/LESTAT sparc


>Description:
	libedit's Makefile builds a source file called editline.c,
	which static'izes a whole slew of functions in .c files included
	by editline.c.  This not only protects the user's namespace,
	but also protects the internals of libedit from braindead
	programmers who like to use non-public functions.

	This does, however, have an annoying `feature'.  If an object
	in libedit wants to call any of these protected functions, it
	must be included in the monolithic editline.o object.

	One such object is readline.o, libedit's readline emulation
	facility.  It wants to call term_beep(), a protected function
	of term.c.  However, readline.o is included as a standard
	library object, not in the monolithic editline.o.  This causes
	unresolved references to term_beep() if a program is dynamically
	linked against libedit with a modern linker (e.g. the GNU binutils
	Elf linker used by NetBSD/alpha).  Note this problem is noticed
	when the program is built, not during the run-time link.

	Why this problem is not noticed by NetBSD's a.out toolchain is a
	mystery to me, and I'm really not sure I want to know...

>How-To-Repeat:
	Try to build in e.g. src/usr.bin/ftp, and watch it fail with
	an unresolved reference to term_beep().

>Fix:
	I have committed a workaround to libedit which addresses this
	specific problem of readline.o wanting to call term_beep().  My
	workaround is to un-static'ize term_beep() and use the CPP to
	rename it to __term_beep() to keep it out of the user's namespace.

	This is not a good general solution, however.

	I can see two possible solutions:

		(a) Include readline emulation in the monolithic
		    editline.o.  This has the problem of always
		    including readline emulation symbols and functions,
		    which may not be desirable (namespace pollution and
		    bloat).

		(b) Use a more standard namespace protection scheme,
		    such as that employed by libc.  Namely, protected
		    functions get "__" prepended to their names, and
		    are not static.  This exposes the internals of
		    libedit, however, which may not be desirable.

	Because both solutions have downsides, I'm not going to attack
	it now.  This PR exists to note the problem so that someone
	else can deal with it.
>Audit-Trail:
>Unformatted: