ABI compliance checker

From ISP_RAS
Jump to: navigation, search

ABI Compliance Checker (ACC) is a tool for checking backward binary and source-level compatibility of a C/C++ library. The tool checks header files and shared libraries of old and new versions and analyzes changes in API and ABI (ABI=API+compiler ABI) that may break binary and/or source compatibility: changes in calling stack, v-table changes, removed symbols, renamed fields, etc. Binary incompatibility may result in crashing or incorrect behavior of applications built with an old version of a library if they run on a new one. Source incompatibility may result in recompilation errors with a new library version. The tool is intended for developers of software libraries and maintainers of operating systems who are interested in ensuring backward compatibility, i.e. allow old applications to run or to be recompiled with newer library versions.

See also:


Contents

Downloads

Releases

All releases can be downloaded from this page or github.com.

Latest release: 1.99.9

Git

Read-only access to the latest development version:
   git clone git://github.com/lvc/abi-compliance-checker.git  

License

This program is free software. You may use, redistribute and/or modify it under the terms of either the GNU GPL or LGPL.

Supported Platforms

GNU/Linux, FreeBSD, Mac OS X, MS Windows, Haiku/BeOS.

System Requirements

  • Linux, FreeBSD
    • G++ (3.0-4.7, 4.8.3, recommended 4.5 or newer)
    • GNU Binutils (readelf, c++filt, objdump)
    • Perl 5 (5.8 or newer)
    • Ctags (5.8 or newer)
    • WARNING: if you are using ccache program (i.e. gcc points to /usr/lib/ccache/gcc) then it should be newer than 3.1.2 or disabled.
  • Mac OS X
    • Xcode (gcc, c++filt, nm, otool)
    • Ctags (5.8 or newer)
  • MS Windows
    • MinGW (3.0-4.7, recommended 4.5 or newer)
    • MS Visual C++ (dumpbin, undname, cl)
    • Active Perl 5 (5.8 or newer)
    • Sigcheck v1.71 or newer
    • Ctags (5.8 or newer)
    • Info-ZIP 3.0 (zip, unzip)
    • Add tool locations to the PATH environment variable
    • Run vsvars32.bat script (C:\Microsoft Visual Studio 9.0\Common7\Tools\)

Detectable Compatibility Problems

The tool searches for the following list of changes in the API that may break binary/source-level compatibility. See “Binary Compatibility Issues With C++” from KDE TechBase and this list of articles for more info.

Binary Compatibility

  • Removed Symbols (functions, global data)
  • Problems with Data Types
    • Structures and Classes
      • added/removed fields (change of a memory layout)
      • change of size
      • changed order of fields
      • change of a field type
      • changes in fields (recursive analysis)
    • Classes
      • added/removed virtual functions (change of a v-table layout)
      • change of virtual function position
      • overridden virtual functions
      • added/removed base classes
      • changes in base classes (recursive analysis)
    • Unions
      • added/removed fields
      • change of size
      • change of a field type
      • changes in fields (recursive analysis)
    • Enumerations
      • change of a member value
      • removed/renamed members
  • Problems with Symbols
    • Stack Frame
      • added/removed parameters
      • change of a parameter/return value type
      • change of default parameter value
      • renamed parameters
    • Other
      • incorrect version change
      • changed attributes (const, volatile, static, etc.)
  • Problems with Constants (#defines)
    • changed value
  • Problems with Implementation
    • changes in disassembled binary code

Source Compatibility

  • Removed Symbols (functions, global data)
  • Problems with Data Types
    • Structures, Classes and Unions
      • removed/renamed fields
      • change of a field type
      • changes in fields (recursive analysis)
    • Classes
      • added/removed base classes
      • change access level of a field or method
      • added pure virtual methods
    • Enumerations
      • removed/renamed members
  • Problems with Symbols
    • Parameters
      • added/removed parameters
      • change of a parameter type
      • removed default value
    • Other
      • change of return value type
      • changed attributes (const, static, etc.)
  • Problems with Constants (#defines)
    • changed value


You can see detailed problem descriptions in the visual interactive HTML-format compatibility report (see this example) generated by the tool.

Installation

The tool is ready-to-use after extracting the archive. You can also use a Makefile to install the tool into the system:
 cd abi-compliance-checker-x.y.z/ 

 sudo perl Makefile.pl -install --prefix=PREFIX [/usr, /usr/local, ...] 

This command will install an  abi-compliance-checker  program in the  PREFIX/bin  system directory and private modules into the  PREFIX/share .

To verify that the tool is installed correctly and it works on your host run:
 cd tmp/ 

 abi-compliance-checker -test 

Usage

For using the tool, you should provide the XML descriptors for two library versions: v1.xml and v2.xml files. Library descriptor is a simple XML-file that specifies version number, paths to header files and shared libraries and other optional information. An example of the descriptor is the following (0.3.4.xml):

<version>
    0.3.4
</version>

<headers>
    /usr/local/libssh/0.3.4/include/
</headers>

<libs>
    /usr/local/libssh/0.3.4/lib/
</libs>

Compare Libraries

Command to compare two versions of a library:
   abi-compliance-checker -lib NAME -old V1.xml -new V2.xml 

The compatibility report will be generated to:
   compat_reports/NAME/V1_to_V2/compat_report.html 

Create ABI Dumps

The library ABI is a representation of the library API at the binary level. The ABI dump is a dump of the model of the ABI used in the tool.

The ABI dump consists of:

  • Types Information
    • Attributes (name, size, header, access, base types, etc.)
    • Fields (name, type, size, position, alignment, access, specifiers, etc.)
    • V-table structure (offsets, entries)
    • Etc.
  • Symbols Information
    • Attributes (name, mangled name, header, access, specifiers, etc.)
    • Parameters (name, type, position, alignment, etc.)
    • Etc.
  • Etc.

The ABI dump can be used to create a snapshot of a library ABI in the particular environment and then compare it with any other state of the ABI changed due to changes in the environment (compiler version, external libraries, etc.) or changes in the library API (header files). The typical case is the comparing of two versions of the same library that require incompatible states of the environment (i.e. these versions cannot be installed simultaneously). In this case one can create a dump for one version of the library and then switch the environment and create ABI dump for other version of the library. Two ABI dumps can be compared by the tool to create the API compatibility report.

To create an ABI dump use -dump option:
   abi-compliance-checker -lib NAME -dump VER.xml 

The ABI dump will be generated to:
   abi_dumps/NAME/NAME_VER.abi.tar.gz 

To compare ABI dumps pass them as the descriptors:
   abi-compliance-checker -lib NAME -old V1.abi.tar.gz -new V2.abi.tar.gz 

Usage with ABI Dumper

Library should be compiled with -g option to contain DWARF debug info.

Create ABI dumps for both library versions using the ABI Dumper tool:

   abi-dumper OLD.so -o ABI-0.dump -lver 0 

   abi-dumper NEW.so -o ABI-1.dump -lver 1 

Compare ABI dumps:

   abi-compliance-checker -l NAME -old ABI-0.dump -new ABI-1.dump 

Usage as a Parser of API

The tool can be used as a parser of C/C++ API. Use -dump and -xml options to create ABI dump in the XML format:
   abi-compliance-checker -lib NAME -dump VER.xml -xml 

The ABI dump will be generated to:
   abi_dumps/NAME/NAME_VER.abi.tar.gz 

You can use additional -stdout option to print ABI dump on the screen instead of creating gzipped file:
   abi-compliance-checker -lib NAME -dump VER.xml -xml -stdout 

See examples of ABI dumps for MeeGo Touch library in XML and Perl (default) formats.

Compare Operating Systems

The detailed explanation on how to check compatibility between operating systems you can read on this page.

See current test results for Symbian, Windows, MeeGo and Maemo on this page.

Check Applications Portability

The ACC tool can be used by independent software vendors (ISV) to check applications portability to new library versions by specifying of its binary using -app option:
   abi-compliance-checker -lib NAME -old V1.xml -new V2.xml -app APP 

Found issues can be taken into account when adapting the application to a new library version.

Command-Line Options

See the list of all options on this page.

Up-to-date list of all supported options can be obtained by this command:

   abi-compliance-checker --info 

Most useful options:

Examples

Check the libssh library versions for ABI compatibility:
   abi-compliance-checker -l libssh -old 0.3.4.xml -new 0.4.0.xml 

The compatibility report will be generated to:
   compat_reports/libssh/0.3.4_to_0.4.0/compat_report.html 

Dump library ABI:
   abi-compliance-checker -l libssh -dump 0.3.4.xml 

The ABI will be dumped to:
   abi_dumps/libssh/libssh_0.3.4.abi.tar.gz 

Use previously dumped ABI:
   abi-compliance-checker -l libssh -old libssh_0.3.4.abi.tar.gz -new libssh_0.4.0.abi.tar.gz 

Check client application portability between libssh versions:
   abi-compliance-checker -l libssh -old 0.3.4.xml -new 0.4.0.xml -app /usr/bin/csync 

Tutorial

An excellent tutorial "ABI: stability check" is available at Les RPM de Remi Blog. See also ABI compliance checker Notes at glibc wiki.

Report Format

The tool supports two formats of a compatibility report: visual interactive HTML (default) and XML. To generate XML report you should specify -xml additional option.

The HTML-format compatibility report consists of:

  • Test Info - The library name and compared version numbers. Environment info: GCC version and CPU type;
  • Test Results - Verdict on compatibility. Number of header files, shared libraries, symbols and data types checked by the tool;
  • Problem Summary - Classification of compatibility problems;
  • Added Symbols - The list of added symbols;
  • Removed Symbols - The list of removed symbols;
  • Problems with Data Types - The list of compatibility problems caused by changes in data types (divided by the severity level: High, Medium and Low). List of affected symbols;
  • Problems with Symbols - The list of compatibility problems caused by changes in symbol parameters or attributes (divided by the severity level);
  • Problems with Constants - The list of changed constants (#defines);
  • Other Changes in Data Types - The list of compatible changes in data types;
  • Other Changes in Symbols - The list of compatible changes in symbols;
  • Problems with Implementation - The list of changes in disassembled binary code. Use -check-implementation option to enable this section.

Examples of HTML-format report:

  • NetCDF: 4.0.1 to 4.1.1 API compatibility report
  • MySQL++: 3.0.9 to 3.1.0 binary compatibility report
  • libssh: 0.3.4 to 0.4.0 binary compatibility report

Verdict on Compatibility

If the tool detected problems with high or medium level of severity or at least one removed symbol then the compatibility verdict is incompatible (otherwise compatible). Low-severity problems can be considered as warnings and don't affect the compatibility verdict unless the -strict option is specified.

Error Codes

Code Meaning
0 Compatible. The tool has run without any errors.
1 Incompatible. The tool has run without any errors.
2 Common error code (undifferentiated).
3 A system command is not found.
4 Cannot access input files.
5 Cannot compile header files.
6 Headers have been compiled with minor errors.
7 Invalid input ABI dump.
8 Unsupported version of input ABI dump.
9 Cannot find a module.
10 Empty intersection between headers and shared objects.
11 Empty set of symbols in headers.

FAQ

  • What is an ABI and how does it differ from an API?

An Application Binary Interface (ABI) is the set of supported run-time interfaces provided by a software component or set of components for applications to use, whereas an Application Programming Interface (API) is the set of build-time interfaces. The ABI may be defined by the formula:

   ABI = API + compiler ABI
  • Why does this tool need both shared libraries and header files to check ABI compliance?

Without header files it is impossible to determine public symbols in ABI and data type definitions. Without shared libraries it is impossible to determine exported symbols in the ABI of the target library and also impossible to detect added/removed symbols.

Similar Tools

  1. icheck - C interface ABI/API checker
  2. BCS - The Symbian binary compatibility suite
  3. shlib-compat - ABI compatibility checker that uses DWARF debug info
  4. qbic - A tool to check for binary incompatibilities in Qt4 Toolkit
  5. chkshlib, cmpdylib, cmpshlib - Tools to compare binary symbols

Bugs

Please send your bug reports, feature requests and questions to the maintainer, post to the issue tracker (old issue tracker is here) or mailing list.

Maintainers

The tool was originally developed by the Russian Linux Verification Center at ISPRAS and since 1.93 version it's developed by the ROSA Laboratory in Russia. Andrey Ponomarenko is the leader of this project.

Credits

We would like to thank everyone who has contributed to the success of this project!

Articles

Here is the list of articles about shared libraries and binary compatibility:

  1. “Binary Compatibility Issues With C++”, KDE TechBase
  2. “Binary Compatibility Examples”, KDE TechBase
  3. "Itanium C++ ABI", linux-foundation.org
  4. "ABI Compatibility", Josh Faust
  5. "ABI : stability check", Les RPM de Remi - Blog
  6. “Calling conventions for different C++ compilers and operating systems”, Agner Fog
  7. "Calling conventions on the x86 platform", Andreas Jonsson
  8. “Some thoughts on binary compatibility”, Thiago Macieira
  9. "Binary Compatibility of C++ shared libraries on GNU/Linux", Pavel Shved, Denis Silakov
  10. "Library Interface Versioning in Solaris and Linux", David J. Brown and Karl Runge
  11. "Steps to Version Your Shared Library", hp.com
  12. "Macintosh C/C++ ABI Overview", developer.apple.com
  13. “Binary-compatible C++ Interfaces”, Chad Austin
  14. "ABI Policy and Guidelines", gnu.org
  15. "Binary Compatibility", gnu.org
  16. "Stability of the C++ ABI: Evolution of a Programing Language", Stephen Clamage
  17. "When binary compatibility breaks", Debian Library Packaging guide
  18. “Library Code Policy”, KDE TechBase
  19. "How To Write Shared Libraries", Ulrich Drepper
  20. "Application Binary Interface", Computer Desktop Encyclopedia
  21. “Program Library HOWTO”, linux.org
  22. “Writing shared libraries”, Mike Hearn
  23. "Shared libraries in Linux: growing pains or fundamental problem?", Sergey Ayukov
  24. “What's the Fragile Base Class (FBC) Problem?”, Peter Potrebic
  25. “Fragile Binary Interface Problem”, Steven Newton
  26. “The amazing world of library incompatibility”, oocities.org
  27. “The Theory of Binary Compatibility”, Forum.Nokia
  28. “How to control binary compatibility”, Forum.Nokia
  29. “ABI compatibility in C++”, elpauer.org
  30. “The impact of C++ templates on library ABI”, Michał Górny
  31. “ABI compliance checker Notes”, sourceware.org
  32. "Preserving Compatibility", symbian.org
  33. "Automated Verification of Shared Libraries for Backward Binary Compatibility", A. Ponomarenko and V. Rubanov, VALID 2010
  34. "Backward compatibility of software interfaces: Steps towards automatic verification", A. Ponomarenko and V. Rubanov, Programming and Computer Software 2012
  35. "Architectures and ABIs detailed", Thiago Macieira's blog
  36. "Interface Versioning in C++", ACCU
  37. "Generic ABI Standard", "ELF and ABI Standards", freestandards.org
  38. Processor ABI standards: Intel386, AMD64, ARM, PowerPC, S/390, Itanium, MIPS, SPARC, PA-RISK, M32R
  39. Translation of this article to Serbo-Croatian, Jovana Milutinovich
Personal tools