Date: Mon, 18 May 1998 16:03:01 +1000 From: Stephen McKay <syssgm@dtir.qld.gov.au> To: Terry Lambert <tlambert@primenet.com> Cc: freebsd-current@FreeBSD.ORG, syssgm@dtir.qld.gov.au Subject: Re: Undefined symbol "___error" Message-ID: <199805180603.QAA16388@troll.dtir.qld.gov.au> In-Reply-To: <199805150251.TAA18202@usr01.primenet.com> from Terry Lambert at "15 May 1998 13:20:19 %2B1000" References: <199805150251.TAA18202@usr01.primenet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Friday, 15th May 1998, Terry Lambert wrote:
>If *PART* of the system *WASN'T* rebuilt, I now see the problem. The
>user is too lazy to be running -current. ;-).
To be specific, I have an executable linked against libc.so.2.2 and
libtermcap.so.2.1. The current libc is libc.so.3.1 while libtermcap.so.2.1
is still the most recent. The newly compiled libtermcap.so.2.1 references
__error which is not supplied by libc.so.2.2. Splat!
This is not me being lazy. This is a fault in -current. If we were not
interested in supporting binaries from previous releases (a binary not
yet 1 year old, I might add), then why do we version number our libraries
at all?
Discussion should move from "Loser! You ain't got the BALLS to run -current!"
to "Which possible solution is best at this time?"
>#ifdef __GCC__
>#pragma weak __error = ___error
>static ___inline int *___error( void) { extern int errno; return &errno; }
>#endif /* __GCC__*/
>
>#define errno (* __error)
>
>This would give each library a weak accessor that would be overridden
>by the real accessor if the thing got linked to the right libc, right?
I tried a number of variants of this approach and could not make any of
them work. In all cases (well, all that compiled at all), the local
hack ___error() was used in preference to the system supplied __error().
Otherwise, this would be a good hack, costing only 12 bytes per .o file.
Out of the possible solutions discussed, I very much prefer to delay
this (inevitable) errno change until we change to ELF. Next best would
be a hack in ld.so to recognise __error specially and resolve it (if
necessary) from a new lib__error.so. In my view, the least pleasant
option is to bump all major library numbers. This would have to include
everything in ports as well as all the system libraries. I think this
would be too error prone to be practical, and shows a weakness in the
shared library versioning mechanism.
Oh, and doing nothing is not what I call an option.
Stephen.
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199805180603.QAA16388>
