[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

libstdc++ follow-up transitions



Unstable now has GCC 5 as the default for more than two weeks. The follow-up
transitions are in progress, however the list of transitions at [1] is not
exhaustive, because this only covered libraries without dependencies on
libraries which need a transition.  There is now another test rebuild [2] done
with an augmented dh_makeshlibs printing cxx11 symbols in libraries [3].  No new
bug reports were filed yet.

There seems to be a tendency to avoid transitions, where Debian doesn't have any
reverse dependencies, or where developers analyze the library API's and come to
the conclusion that no transition is necessary.  I'm not yet sure if this is the
safest way forward, given the alternative of semi-automatic renaming of the
packages.

As an example (no pun intended): for libsigc++-2.0 the maintainer assessed that
the one change wouldn't have any impact.  However after a non-change rebuild,
some binaries started crashing (e.g. aptitude).  The problem here is that you
don't see every ABI change from just looking at the symbols files, which doesn't
show subtype changes. One way to find out about these is to look at the debug
information (which is not always available), and compare the old and the new
package. Tools to do this are abi-compliance-checker and libabigail (you need
the one in unstable).

abipkgdiff \
  --d1 libsigc++-2.0-0c2a-dbgsym_2.4.0-1_amd64.ddeb \
  --d2 libsigc++-2.0-0v5-dbgsym_2.4.1-2_amd64.ddeb \
  libsigc++-2.0-0c2a_2.4.0-1_amd64.deb \
  libsigc++-2.0-0v5_2.4.1-2_amd64.deb

Looking at the attached output of this run, you'll see that the size of some
subtypes changed, and that the offset of an unchanged member of a subtype change
which lead to the crashes at least for aptitude.  Still the question is, if you
want to analyze all libraries using these tools.

Another change for GCC 5 are the destructor symbols (ending in D[012]ev), which
now get optimized, and are not emitted anymore, where no virtual base classes
are involved.  It should be safe to remove these from the symbols files (or
marking these as optional).

Matthias

[1]
https://bugs.debian.org/cgi-bin/pkgreport.cgi?tag=libstdc%2B%2B-cxx11;users=debian-gcc@lists.debian.org
[2] https://people.debian.org/~doko/logs/gcc5-20150813/archive-gcc-08-13-2015/
[3] deb https://people.debian.org/~doko/tmp/gcc-5 ./
================ changes of 'libsigc-2.0.so.0.0.0'===============
  Functions changes summary: 1 Removed, 2 Changed (15 filtered out), 1 Added functions
  Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

  1 Removed function:

    'method void std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_clear()'    {_ZNSt10_List_baseIN4sigc9slot_baseESaIS1_EE8_M_clearEv}

  1 Added function:

    'method void std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_clear()'    {_ZNSt7__cxx1110_List_baseIN4sigc9slot_baseESaIS2_EE8_M_clearEv}

  2 functions with some indirect sub-type change:

    [C]'method sigc::connection::connection(const sigc::connection&)' has some indirect sub-type changes:
      parameter 1 of type 'const sigc::connection&' has sub-type changes:
        in referenced type 'const sigc::connection':
          in unqualified underlying type 'struct sigc::connection':
            1 data member change:
             type of 'sigc::slot_base* sigc::connection::slot_' changed:
               in pointed to type 'class sigc::slot_base':
                 1 data member change:
                  type of 'sigc::slot_base::rep_type* sigc::slot_base::rep_' changed:
                    in pointed to type 'typedef sigc::slot_base::rep_type':
                      underlying type 'struct sigc::internal::slot_rep' changed:
                        1 base class change:
                          'struct sigc::trackable' changed:
                            1 data member change:
                             type of 'sigc::internal::trackable_callback_list* sigc::trackable::callback_list_' changed:
                               in pointed to type 'struct sigc::internal::trackable_callback_list':
                                 type size changed from 192 to 256 bits
                                 2 data member changes:
                                  type of 'sigc::internal::trackable_callback_list::callback_list sigc::internal::trackable_callback_list::callbacks_' changed:
                                    underlying type 'class std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
                                      type name changed from 'std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
                                      type size changed from 128 to 192 bits
                                      1 base class deletion:
                                        class std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >
                                      1 base class insertion:
                                        class std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >

                                  'bool sigc::internal::trackable_callback_list::clearing_' offset changed from 128 to 192 (in bits)





    [C]'method sigc::internal::signal_impl* sigc::signal_base::impl()' has some indirect sub-type changes:
      return type changed:
        in pointed to type 'struct sigc::internal::signal_impl':
          type size changed from 192 to 256 bits
          1 data member change:
           type of 'std::list<sigc::slot_base, std::allocator<sigc::slot_base> > sigc::internal::signal_impl::slots_' changed:
             type name changed from 'std::list<sigc::slot_base, std::allocator<sigc::slot_base> >' to 'std::__cxx11::list<sigc::slot_base, std::allocator<sigc::slot_base> >'
             type size changed from 128 to 192 bits
             1 base class deletion:
               class std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >
             1 base class insertion:
               class std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >




================ end of changes of 'libsigc-2.0.so.0.0.0'===============


Reply to: