cvs commit: src/include string.h src/lib/libc/string
Makefile.inc memchr.3 memrchr.c src/sys/sys param.h
Daniel Eischen
deischen at freebsd.org
Wed May 28 15:39:23 UTC 2008
On Wed, 28 May 2008, Alexander Kabaev wrote:
> On Tue, 27 May 2008 20:04:28 +0000 (UTC)
> Xin LI <delphij at FreeBSD.org> wrote:
>
>> delphij 2008-05-27 20:04:27 UTC
>>
>> FreeBSD src repository
>>
>> Modified files: (Branch: RELENG_6)
>> include string.h
>> lib/libc/string Makefile.inc memchr.3
>> sys/sys param.h
>> Added files: (Branch: RELENG_6)
>> lib/libc/string memrchr.c
>> Log:
>> MFC: Add memrchr(3).
>>
>> Obtained from: OpenBSD
>>
>> Revision Changes Path
>> 1.21.2.2 +1 -0 src/include/string.h
>> 1.34.8.2 +2 -1 src/lib/libc/string/Makefile.inc
>> 1.7.14.3 +28 -3 src/lib/libc/string/memchr.3
>> 1.1.4.1 +40 -0 src/lib/libc/string/memrchr.c (new)
>> http://cvsweb.FreeBSD.org/src/lib/libc/string/memrchr.c?rev=1.1.4.1&content-type=text/plain
>> 1.244.2.37 +1 -1 src/sys/sys/param.h
>>
>> http://cvsweb.FreeBSD.org/src/include/string.h.diff?r1=1.21.2.1&r2=1.21.2.2
>> http://cvsweb.FreeBSD.org/src/lib/libc/string/Makefile.inc.diff?r1=1.34.8.1&r2=1.34.8.2
>> http://cvsweb.FreeBSD.org/src/lib/libc/string/memchr.3.diff?r1=1.7.14.2&r2=1.7.14.3
>> http://cvsweb.FreeBSD.org/src/sys/sys/param.h.diff?r1=1.244.2.36&r2=1.244.2.37
>
>
> There are two levels of symbol versions checking:
>
> 1. Up-front checking of version name.
> When binary starts, rtld checks that all versions it was compiled
> against are provided by the dynamically loaded libraries. I.e. if
> libc.so.7:FBSD_1.1 is recorded as a requirement in binary and given
> libc.so.7 does not have that version, the binary execution is
> terminated right on the spot.
>
> The assumption here is that if version FOO is claimed to be provided by
> the library then _all_ symbols at FOO binary might need are present. This
> is the level of symbol versions checking Solaris provides. Linux goes a
> bit further:
>
> 2. Per-symbol versions.
>
> In addition to the above, ld encodes required version of each undefined
> symbol in a binary and uses (name, version) pair to resolve undefined
> references as opposed to using only the symbol name. This allows for
> several versions of the same symbol to exist within the binary, i.e.
> something like read at FOO1 and read at FOO2 are now possible.
>
> Your changes broke assumption in 1. To do it 100% correctly, we probably
> need to introduce a side version for memchr, something like
> memrchr@@FBSD_1.0a in stable branch and provide a compatibility
> alias memrchr at FBSD_1.0a for it in -current at the same time.
>
> libc.so.7 from RELENG_7 will have:
>
> memrchr@@FBSD_1.0a
>
> libc.so.7 from -current then will have:
>
> memrchr@@FBSD_1.1
> memrchr at FBSD_1.0a -> memrchr@@FBSD_1.1
Interesting, as long as "a" = ".1", so that you have FBSD_1.0.1 as
the side version.
See my prior email - I thought we agreed that we just MFC the version
(in this case, FBSD_1.1) from -current. If you introduce a new
version, a binary built on 7.x may not run on -current from before
the side version was added. For instance, if we were to add
memfoo() in -current now, then we release 8.0 with memfoo@@FBSD_1.1,
then after the release we MFC memfoo() to RELENG_7 in the way
you describe, then anything built in RELENG_7 using memfoo() will
not work in 8.0 release (because 8.0 didn't have the side version
memfoo@@FBSD_1.0a/1.0.1).
Typically before a release there are a flurry of MFCs, so you can
have a few months or more elapse before the addition of new or
ABI-changed symbols. If we just use the same version as -current,
then things will just work, at least from when the symbol was
changed/added in -current.
But regardless, I think this means that once we release 8.0, we
cannot MFC any new or changed symbols (from 8.0+) back to
7.x. If someone upgrades from 7.x to 8.0, then 8.0 has to
have all the symbols that 7.x will have or else binary
compatibility will be broken.
--
DE
More information about the cvs-src
mailing list