Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Mar 2006 22:19:22 -0500 (EST)
From:      Daniel Eischen <eischen@vigrid.com>
To:        current@freebsd.org
Subject:   RFC: Symbol versioning for libc
Message-ID:  <Pine.GSO.4.43.0603072214130.8396-100000@sea.ntplx.net>

next in thread | raw e-mail | index | archive | help
I've been working on symbol versioning libc and have a patch
that seems to work.  It's been tested on x86 with build &
install world, KDE, mozilla, and firefox, but there may be
some problems I haven't found yet.  These would likely result
in undefined symbol errors from libraries or applications.

I'd like to commit what I have to enable wider testing, but
turn off symbol versioning by default.  I would also like
re@ to take a look at the version namespace scheme.  The
following was derived from Sun's convention.

    FBSD_1.0 (FBSD_X.Y[.Z])
        This is the first rev of the public namespace for
        libc and related libraries.  For every minor
        release of FreeBSD, starting with 7.0, the minor
        version of the namespace will be bumped if there
        is an ABI change.  The version is bumped as soon
        as the first ABI change hits the tree.  If there
        are no ABI changes, a minor-minor (subminer?)
        version (Z) can be added (or bumped) to denote a
        release, performance improvement, etc.

    FBSDprivate_1.0 (FBSDprivate_X.Y)
        This is our private namespace.  Any symbols that
        need to be visible outside of libc (or any other
        versioned library) that are only meant for use by
        our own libraries or applications are listed in
        this namespace.  For instance, _spinlock() which
        is overridden in libc by the thread libraries, or
        libc's __pw_scan() or __use_pts() which are used
        by libutil.  This is initially given a version
        number, but is not bumped after introducing private
        ABI changes or within release cycles.  We provide
        a complete system built from a consistent set or
        sources, so there is no real need to maintain
        ABI in this namespace.  However, since our first
        release may need to be compatible with older libraries
        built before symbol versioning, it may require us
        to provide at least one additional version.

The two namespaces allow us to write simple ABI-checking
tools (readelf -s application | grep "FreeBSDprivate") that
3rd-party developers can use to certify compliance with our
ABI.  We (FreeBSD) will give no guarantees about anything
within the FreeBSDprivate version namespace; symbols within
that namespace may come and go within release cycles.

The proposed numbering scheme would be something along the
lines of this (in linker map format and in chronological order):

  # Release 7.0
  FBSD_1.0 {
  };
  FBSDprivate_1.0 {
  };

  # Release 7.1 - no ABI changes, depends on FBSD_1.0
  FBSD_1.0.1 {
  } FBSD_1.0;

  # Release 7.2 - with ABI changes, depends on FBSD_1.0
  # There is no benefit to depending on 1.0.1 since there
  # are no ABI changes to inherit.
  FBSD_1.1 {
  } FBSD_1.0;

  # Release 8.0 - with or without ABI changes
  # This was branched from release 7.2.  It could just as
  # well have been branched from 7.0 or 7.1.
  FBSD_2.0 {
  } FBSD_1.1;

  # Release 7.3 - without ABI changes, depends on FBSD_1.1
  FBSD_1.1.1 {
  } FBSD_1.1;

  # Release 7.4 - with ABI changes, depends on FBSD_1.1
  FBSD_1.2 {
  } FBSD_1.1;

  # Release 8.1 - with ABI changes, depends on FBSD_2.0
  FBSD_2.1 {
  } FBSD_2.0;

  ...

The latest patch is here:

  http://people.freebsd.org/~deischen/symver/symver.diffs.030706

There's a brief description of symbol versioning here:

  http://people.freebsd.org/~deischen/symver/library_versioning.txt

and you can find some other documents at:

  http://docs.sun.com/app/docs/doc/817-1984
  http://people.redhat.com/~drepper/symbol-versioning

or google.


-- 
DE




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.43.0603072214130.8396-100000>