blob: f5f9d966202d1e4036b4923835857edcd82c1a57 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="C, C++, ABI, API, compatibility, checker" />
<meta name="description" content="A tool for checking backward API/ABI compatibility of a C/C++ library" />
<title>ABI Compliance Checker</title>
<style type="text/css">
body {
margin-top: 1.0em;
background-color: #deeef7;
font-family: Helvetica, Arial, FreeSans, san-serif;
color: #000000;
}
#container {
margin: 0 auto;
width: 700px;
}
h1 { font-size: 3.8em; color: #211108; margin-bottom: 3px;margin-top:0px;padding-top:0px;}
h1 .small { font-size: 0.4em; }
h1 a { text-decoration: none }
h2 { font-size: 1.5em; color: #211108; }
h3 { text-align: center; color: #211108; }
a { color: #211108; }
.description { font-size: 1.2em; margin-bottom: 30px; margin-top: 30px; font-style: italic;}
.download { float: right; }
pre {padding: 0px;margin: 0px;padding-left: 10px;word-wrap:break-word;white-space: pre-wrap;}
hr { border: 0; width: 80%; border-bottom: 1px solid #aaa}
.footer { text-align:center; padding-top:30px; font-style: italic; }
.code {border: dashed 1px gray; background-color: #f0f0f0; padding: 5px; padding-left: 10px; padding-right: 10px;}
.listing {padding: 10px;border: 1px solid black;width: 70%;font-family:"DejaVu Sans Mono", "Monaco", "Courier New", monospace;font-size:14px;}
.summary {border:1px solid black;border-collapse:collapse;}
table.summary td, table.summary th {border:1px solid black;padding:2px;}
</style>
</head>
<body>
<a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<div id="container">
<div class="download">
<a href="https://github.com/lvc/abi-compliance-checker/zipball/master">
<img style="border: 0;" width="90" src="https://github.com/images/modules/download/zip.png" alt="" /></a>
<a href="https://github.com/lvc/abi-compliance-checker/tarball/master">
<img style="border: 0;" width="90" src="https://github.com/images/modules/download/tar.png" alt="" /></a>
</div>
<h1>ABI Compliance Checker</h1>
<div class="description">
A tool for checking backward API/ABI compatibility of a C/C++ library
</div>
<p/>
ABI Compliance Checker (ABICC) 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.
<p/>
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 Linux maintainers who are interested in ensuring backward compatibility, i.e. allow old applications to run or to be recompiled with newer library versions.
<p/>
The tool is developed by Andrey Ponomarenko. You can order additional reports for visualization of the ABI structure and high detailed binary compatibility analysis here: <a href='https://abi-laboratory.pro/'>https://abi-laboratory.pro/</a>
<p/>
The tool is a core of the <a href='https://abi-laboratory.pro/tracker/'>ABI Tracker</a> and Upstream Tracker projects.
<table class='summary'><tr><td>
<div>Table of Contents</div>
<ul>
<li><a href="#Downloads">Downloads</a></li>
<li><a href="#License">License</a></li>
<li><a href="#Supported_Platforms">Supported Platforms</a></li>
<li><a href="#Dependencies">Dependencies</a></li>
<li><a href="#Installation">Installation</a></li>
<li><a href="#ABI_Dumper">Usage with ABI Dumper</a></li>
<li><a href="#Usage">Usage (Original)</a></li>
<li><a href="#Tutorial">Tutorial</a></li>
<li><a href="#Examples">Examples</a></li>
<li><a href="#BinaryProblems">Detectable Binary-Compatibility Problems</a></li>
<li><a href="#SourceProblems">Detectable Source-Compatibility Problems</a></li>
<li><a href="#TestSuite">Test Suite</a></li>
<li><a href="#Dump">Create ABI Dumps</a></li>
<li><a href="#Report">Report Format</a></li>
<li><a href="#Verdict">Verdict on Compatibility</a></li>
<li><a href="#Error">Error Codes</a></li>
<li><a href="#FAQ">FAQ</a></li>
<li><a href="#Similar">Similar Tools</a></li>
<li><a href="#Bugs">Bugs</a></li>
<li><a href="#Maintainers">Maintainers</a></li>
<li><a href="#ChangeLog">Changes</a></li>
<li><a href="#Articles">Articles</a></li>
</ul>
</td></tr></table>
<a name="Downloads"></a>
<h2>Downloads</h2>
<p>The latest release can be downloaded from <a href="https://github.com/lvc/abi-compliance-checker/releases">this page</a>.</p>
<p>Read-only access to the latest development version:</p>
<code class='code'>git clone https://github.com/lvc/abi-compliance-checker.git</code>
<a name="License"></a>
<h2>License</h2>
<p>This program is free software. You may use, redistribute and/or modify it under the terms of the <a href="http://www.gnu.org/licenses/">GNU GPL</a> or <a href="http://www.gnu.org/licenses/">GNU LGPL</a></p>
<a name="Supported_Platforms"></a>
<h2>Supported Platforms</h2>
GNU/Linux, FreeBSD, Mac OS X, MS Windows.
<a name="Dependencies"></a>
<h2>Dependencies</h2>
<ul>
<li>
G++ (3.0-4.7, 4.8.3 or newer)
</li>
<li>
GNU Binutils (readelf, c++filt, objdump)
</li>
<li>
Perl 5
</li>
<li>
Ctags
</li>
<li>
<a href="https://github.com/lvc/abi-dumper">ABI Dumper</a>
</li>
</ul>
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.
<p/>
On Mac OS X the tool also requires Xcode (g++, c++filt, nm and otool).
<p/>
On MS Windows the tool also requires MinGW, MS Visual C++ (dumpbin, undname, cl), Active Perl 5, adding of tool locations to the PATH and execution of vcvars64.bat script (C:\Microsoft Visual Studio 9.0\VC\bin\).
<a name="Installation"></a>
<h2>Installation</h2>
<p>The tool is <b>ready-to-use</b> after extracting the archive.</p>
<p>You can also use a Makefile to install the tool into the system:</p>
<code class='code'>sudo make install prefix=PREFIX [/usr, /usr/local]</code>
<p>This command will install the <code>abi-compliance-checker</code> program into the <code>PREFIX/bin</code> system directory and private modules into the <code>PREFIX/share</code>.</p>
<p>To verify that the tool is installed correctly and it works on your host run:</p>
<code class='code'>cd tmp/</code>
<p>
<code class='code'>abi-compliance-checker -test</code>
</p>
<a name="ABI_Dumper"></a>
<h2>Usage with ABI Dumper</h2>
This new way is based on the analysis of the debug-info from binary objects. It's more reliable, faster and simple way.
<p/>
The analyzed library should be compiled with "-g -Og" GCC options to contain DWARF debug info.
<p/>
Create ABI dumps for both library versions first using the <a href='https://github.com/lvc/abi-dumper'>ABI Dumper</a> tool:
<p/>
<code class='code'>abi-dumper OLD.so -o ABI-0.dump -lver 0</code>
<p/>
<code class='code'>abi-dumper NEW.so -o ABI-1.dump -lver 1</code>
<p/>
And then compare ABI dumps to create report:
<p/>
<code class='code'>abi-compliance-checker -l NAME -old ABI-0.dump -new ABI-1.dump</code>
<p/>
The compatibility report will be generated to:
<p/>
<code class='code'>compat_reports/NAME/V0_to_V1/compat_report.html</code>
<p/>
You can filter out private symbols from the ABI dumps by specifying of additional <code>-public-headers</code> option of the ABI Dumper tool.
<a name="Usage"></a>
<h2>Usage (Original)</h2>
The original usage is based on the analysis of header files and shared objects (without debug-info).
<p/>
You should provide <a href='Xml-Descriptor.html'>XML descriptors</a> for two library versions (<code>v1.xml</code> and <code>v2.xml</code> files) in order to run the analysis. 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 (<code>0.3.4.xml</code>):
<p/>
<div class='listing'>
<pre>
<span style='color:Green'>&lt;version&gt;</span>
0.3.4
<span style='color:Green'>&lt;/version&gt;</span>
<span style='color:Green'>&lt;headers&gt;</span>
/usr/local/libssh/0.3.4/include/
<span style='color:Green'>&lt;/headers&gt;</span>
<span style='color:Green'>&lt;libs&gt;</span>
/usr/local/libssh/0.3.4/lib/
<span style='color:Green'>&lt;/libs&gt;</span>
</pre>
</div>
<p/>
Command to compare two versions of a library:
<p/>
<code class='code'>abi-compliance-checker -lib NAME -old V1.xml -new V2.xml</code>
<p/>
The compatibility report will be generated to:
<p/>
<code class='code'>compat_reports/NAME/V1_to_V2/compat_report.html</code>
<p/>
<a name="Tutorial"></a>
<h2>Tutorial</h2>
An excellent tutorial <a href='http://blog.famillecollet.com/post/2010/06/20/ABI-%3A-stability-check'>"ABI: stability check"</a> is available at Les RPM de Remi Blog. See also <a href='http://sourceware.org/glibc/wiki/Testing/ABI_checker'>ABI compliance checker Notes</a> at glibc wiki.
<p/>
<a name="Examples"></a>
<h2>Examples</h2>
<table class='summary'>
<tr><th>Library</th><th>Versions</th><th>Report</th></tr>
<tr>
<td>libhttpd</td>
<td>2.2.31 vs 2.4.1</td>
<td><a href='http://abi-laboratory.pro/tracker/compat_report/httpd/2.2.31/2.4.1/58f6a/abi_compat_report.html'>report</a></td>
</tr>
<tr>
<td>libMagick++</td>
<td>6.9.0-0 vs 6.9.0-10</td>
<td><a href='http://abi-laboratory.pro/tracker/compat_report/imagemagick/6.9.0-0/6.9.0-10/c3418/abi_compat_report.html'>report</a></td>
</tr>
<tr>
<td>libssh</td>
<td>0.3.4 vs 0.3.91</td>
<td><a href='http://abi-laboratory.pro/tracker/compat_report/libssh/0.3.4/0.3.91/1f31d/abi_compat_report.html'>report</a></td>
</tr>
</table>
<p/>
See more report examples at <a href='http://abi-laboratory.pro/tracker/'>http://abi-laboratory.pro/tracker/</a>.
<a name="BinaryProblems"></a>
<h2>Detectable Binary Compatibility Problems</h2>
<ul>
<li>
<b>Problems with Data Types</b>
<ul>
<li>
Structures and Classes
<ul>
<li>
added/removed fields (change of a memory layout)
</li>
<li>
change of size
</li>
<li>
changed order of fields
</li>
<li>
change of a field type
</li>
<li>
changes in fields (recursive analysis)
</li>
</ul>
</li>
<li>
Classes
<ul>
<li>
added/removed virtual functions (change of a v-table layout)
</li>
<li>
change of virtual function position
</li>
<li>
overridden virtual functions
</li>
<li>
added/removed base classes
</li>
<li>
changes in base classes (recursive analysis)
</li>
</ul>
</li>
<li>
Unions
<ul>
<li>
added/removed fields
</li>
<li>
change of size
</li>
<li>
change of a field type
</li>
<li>
changes in fields (recursive analysis)
</li>
</ul>
</li>
<li>
Enumerations
<ul>
<li>
change of a member value
</li>
<li>
removed/renamed members
<br/>
<br/>
</li>
</ul>
</li>
</ul>
</li>
<li>
<b>Problems with Symbols</b>
<ul>
<li>
removed symbols (functions or global data)
</li>
<li>
added/removed parameters
</li>
<li>
change of a parameter/return value type
</li>
<li>
change of default parameter value
</li>
<li>
renamed parameters
</li>
<li>
incorrect version change
</li>
<li>
changed attributes (const, volatile, static, etc.)
<br/>
<br/>
</li>
</ul>
</li>
<li>
<b>Problems with Constants (#defines)</b>
<ul>
<li>
changed value
</li>
</ul>
</li>
</ul>
<p/>
See <a href='https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a> article from KDE TechBase for more info.
<a name="SourceProblems"></a>
<h2>Detectable Source Compatibility Problems</h2>
<ul>
<li>
<b>Problems with Data Types</b>
<ul>
<li>
Structures, Classes and Unions
<ul>
<li>
removed/renamed fields
</li>
<li>
change of a field type
</li>
<li>
changes in fields (recursive analysis)
</li>
</ul>
</li>
<li>
Classes
<ul>
<li>
added/removed base classes
</li>
<li>
change access level of a field or method
</li>
<li>
added pure virtual methods
</li>
</ul>
</li>
<li>
Enumerations
<ul>
<li>
removed/renamed members
<br/>
<br/>
</li>
</ul>
</li>
</ul>
</li>
<li>
<b>Problems with Symbols</b>
<ul>
<li>
removed symbols (functions or global data)
</li>
<li>
added/removed parameters
</li>
<li>
change of a parameter type
</li>
<li>
removed default value of parameter
</li>
<li>
change of return value type
</li>
<li>
changed attributes (const, static, etc.)
</li>
</ul>
</li>
</ul>
<a name="TestSuite"></a>
<h2>Test Suite</h2>
The tool is tested properly in the <a href='https://abi-laboratory.pro/tracker/'>ABI Tracker</a> and Upstream Tracker projects, by the community and by the internal test suite:
<p/>
<code class='code'>abi-compliance-checker -test</code>
<p/>
There are about 100 basic tests for C and about 200 basic tests for C++ API/ABI breaks.
<a name="Dump"></a>
<h2>Create ABI Dumps</h2>
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.
<p/>
The ABI dump consists of:
<ul>
<li>
<b>Types Information</b>
<ul>
<li>
Attributes (name, size, header, access, base types, etc.)
</li>
<li>
Fields (name, type, size, position, alignment, access, specifiers, etc.)
</li>
<li>
V-table structure (offsets, entries)
</li>
<li>
Etc.
</li>
</ul>
</li>
<li>
<b>Symbols Information</b>
<ul>
<li>
Attributes (name, mangled name, header, access, specifiers, etc.)
</li>
<li>
Parameters (name, type, position, alignment, etc.)
</li>
<li>
Etc.
</li>
</ul>
</li>
<li>
Etc.
</li>
</ul>
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).
<p/>
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.
<p/>
To create an ABI dump use <code>-dump</code> option:
<p/>
<code class='code'>abi-compliance-checker -lib NAME -dump VER.xml</code>
<p/>
The ABI dump will be generated to:
<p/>
<code class='code'>abi_dumps/NAME/NAME_VER.abi.tar.gz</code>
<p/>
To compare ABI dumps pass them as the descriptors:
<p/>
<code class='code'>abi-compliance-checker -lib NAME -old V1.abi.tar.gz -new V2.abi.tar.gz</code>
<a name="Report"></a>
<h2>Report Format</h2>
The tool supports two formats of a compatibility report: HTML (default) and XML. To generate XML report you should specify <code>-xml</code> additional option.
<p/>
The report consists of:
<ul>
<li>
<b>Test Info</b> - The library name and compared version numbers. Environment info: GCC version and CPU type.
</li>
<li>
<b>Test Results</b> - Verdict on compatibility. Number of header files, shared libraries, symbols and data types checked by the tool.
</li>
<li>
<b>Problem Summary</b> - Classification of compatibility problems.
</li>
<li>
<b>Added Symbols</b> - The list of added symbols.
</li>
<li>
<b>Removed Symbols</b> - The list of removed symbols.
</li>
<li>
<b>Problems with Data Types</b> - The list of compatibility problems caused by changes in data types (divided by the severity level: High, Medium and Low). List of affected symbols.
</li>
<li>
<b>Problems with Symbols</b> - The list of compatibility problems caused by changes in symbol parameters or attributes (divided by the severity level).
</li>
<li>
<b>Problems with Constants</b> - The list of changed constants (#defines).
</li>
<li>
<b>Other Changes in Data Types</b> - The list of compatible changes in data types.
</li>
<li>
<b>Other Changes in Symbols</b> - The list of compatible changes in symbols.
</li>
</ul>
<a name="Verdict"></a>
<h2>Verdict on Compatibility</h2>
If the tool detects problems with high or medium level of severity or at least one removed symbol then the compatibility verdict is <b>incompatible</b> (otherwise <b>compatible</b>). Low-severity problems can be considered as <b>warnings</b> and don't affect the compatibility verdict unless the <code>-strict</code> option is specified.
<a name="Error"></a>
<h2>Error Codes</h2>
<table class='summary'>
<tr><th>Code</th><th>Meaning</th></tr>
<tr><td>0</td><td>Compatible. The tool has run without any errors.</td></tr>
<tr><td>1</td><td>Incompatible. The tool has run without any errors.</td></tr>
<tr><td>2</td><td>Common error code (undifferentiated).</td></tr>
<tr><td>3</td><td>A system command is not found.</td></tr>
<tr><td>4</td><td>Cannot access input files.</td></tr>
<tr><td>5</td><td>Cannot compile header files.</td></tr>
<tr><td>6</td><td>Headers have been compiled with minor errors.</td></tr>
<tr><td>7</td><td>Invalid input ABI dump.</td></tr>
<tr><td>8</td><td>Unsupported version of input ABI dump.</td></tr>
<tr><td>9</td><td>Cannot find a module.</td></tr>
<tr><td>10</td><td>Empty intersection between headers and shared objects.</td></tr>
<tr><td>11</td><td>Empty set of symbols in headers.</td></tr>
</table>
<a name="FAQ"></a>
<h2>FAQ</h2>
<ul>
<li>
<b>What is an ABI and how does it differ from an API?</b>
<p/>
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.
</li>
<li>
<b>Why does this tool need both shared libraries and header files to check ABI compliance?</b>
<p/>
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.
</li>
</ul>
<a name="Similar"></a>
<h2>Similar Tools </h2>
<ul>
<li>
<b>icheck</b> - C interface ABI/API checker.
</li>
<li>
<b>BCS</b> - The Symbian binary compatibility suite.
</li>
<li>
<b>shlib-compat</b> - ABI compatibility checker that uses DWARF debug info.
</li>
<li>
<b>qbic</b> - A tool to check for binary incompatibilities in Qt4 Toolkit.
</li>
<li>
<b>libabigail</b> - A C++ library for ABI analysis.
</li>
<li>
<b>chkshlib, cmpdylib, cmpshlib</b> - Tools to compare binary symbols.
</li>
</ul>
<a name="Bugs"></a>
<h2>Bugs</h2>
Please post bug reports, feature requests and questions to the <a href="https://github.com/lvc/abi-compliance-checker/issues">issue tracker</a>.
<p/>
<a name="Maintainers"></a>
<h2>Maintainers</h2>
The tool is developed by <a href="https://www.linkedin.com/in/andreyponomarenko">Andrey Ponomarenko</a>.
<a name="ChangeLog"></a>
<h2>Changes</h2>
You can find changelog <a href='Changelog.html'>here</a>.
<a name="Articles"></a>
<h2>Articles</h2>
<ul>
<li>
<a href='https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a>, KDE TechBase
</li>
<li>
<a href='https://community.kde.org/Policies/Binary_Compatibility_Examples'>"Binary Compatibility Examples"</a>, KDE TechBase
</li>
<li>
<a href='https://www.computer.org/csdl/proceedings/valid/2010/4146/00/4146a057-abs.html'>"Automated Verification of Shared Libraries for Backward Binary Compatibility"</a>, A. Ponomarenko and V. Rubanov, VALID 2010
</li>
<li>
<a href='http://www.springerlink.com/content/905067689q7n0166/'>"Backward compatibility of software interfaces: Steps towards automatic verification"</a>, A. Ponomarenko and V. Rubanov, Programming and Computer Software 2012
</li>
<li>
<a href='http://refspecs.linux-foundation.org/cxxabi-1.83.html'>"Itanium C++ ABI"</a>, linux-foundation.org
</li>
<li>
<a href='http://www.ros.org/reps/rep-0009.html'>"ABI Compatibility"</a>, Josh Faust
</li>
<li>
<a href='http://blog.famillecollet.com/post/2010/06/20/ABI-%3A-stability-check'>"ABI : stability check"</a>, Les RPM de Remi - Blog
</li>
<li>
<a href='http://www.agner.org/optimize/calling_conventions.pdf'>"Calling conventions for different C++ compilers and operating systems"</a>, Agner Fog
</li>
<li>
<a href='http://www.angelcode.com/dev/callconv/callconv.html'>"Calling conventions on the x86 platform"</a>, Andreas Jonsson
</li>
<li>
<a href='http://blog.qt.digia.com/blog/2009/08/12/some-thoughts-on-binary-compatibility/'>"Some thoughts on binary compatibility"</a>, Thiago Macieira
</li>
<li>
<a href='http://syrcose.ispras.ru/2009/files/02_paper.pdf'>"Binary Compatibility of C++ shared libraries on GNU/Linux"</a>, Pavel Shved, Denis Silakov
</li>
<li>
<a href='http://www.usenix.org/publications/library/proceedings/als00/2000papers/papers/full_papers/browndavid/browndavid_html/'>"Library Interface Versioning in Solaris and Linux"</a>, David J. Brown and Karl Runge
</li>
<li>
<a href='http://h21007.www2.hp.com/portal/download/files/prot/files/STK/pdfs/V_4version.pdf'>"Steps to Version Your Shared Library"</a>, hp.com
</li>
<li>
<a href='http://chadaustin.me/cppinterface.html'>"Binary-compatible C++ Interfaces"</a>, Chad Austin
</li>
<li>
<a href='http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html'>"ABI Policy and Guidelines"</a>, gnu.org
</li>
<li>
<a href='http://gcc.gnu.org/onlinedocs/gcc/Compatibility.html'>"Binary Compatibility"</a>, gnu.org
</li>
<li>
<a href='http://www.oracle.com/technetwork/articles/servers-storage-dev/stablecplusplusabi-333927.html'>"Stability of the C++ ABI: Evolution of a Programing Language"</a>, Stephen Clamage
</li>
<li>
<a href='http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html#binarycompat'>"When binary compatibility breaks"</a>, Debian Library Packaging guide
</li>
<li>
<a href='http://techbase.kde.org/Policies/Library_Code_Policy'>"Library Code Policy"</a>, KDE TechBase
</li>
<li>
<a href='http://people.redhat.com/drepper/dsohowto.pdf'>"How To Write Shared Libraries"</a>, Ulrich Drepper
</li>
<li>
<a href='http://tldp.org/HOWTO/Program-Library-HOWTO/'>"Program Library HOWTO"</a>, linux.org
</li>
<li>
<a href='http://plan99.net/~mike/writing-shared-libraries.html'>"Writing shared libraries"</a>, Mike Hearn
</li>
<li>
<a href='http://www.ayukov.com/essays/linuxdll.html'>"Shared libraries in Linux: growing pains or fundamental problem?"</a>, Sergey Ayukov
</li>
<li>
<a href='http://c2.com/cgi/wiki?FragileBinaryInterfaceProblem'>"Fragile Binary Interface Problem"</a>, Steven Newton
</li>
<li>
<a href='http://www.oocities.org/mrshrap/linker.html'>"The amazing world of library incompatibility"</a>, oocities.org
</li>
<li>
<a href='http://www.elpauer.org/?p=230'>"ABI compatibility in C++"</a>, elpauer.org
</li>
<li>
<a href='http://blogs.gentoo.org/mgorny/2012/08/20/the-impact-of-cxx-templates-on-library-abi/'>"The impact of C++ templates on library ABI"</a>, Michał Górny
</li>
<li>
<a href='http://sourceware.org/glibc/wiki/Testing/ABI_checker'>"ABI compliance checker Notes"</a>, sourceware.org
</li>
<li>
<a href='http://developer.symbian.org/wiki/index.php/Preserving_Compatibility'>"Preserving Compatibility"</a>, symbian.org
</li>
<li>
<a href='http://www.macieira.org/blog/2012/01/architectures-and-abis-detailed/'>"Architectures and ABIs detailed"</a>, Thiago Macieira's blog
</li>
<li>
<a href='http://accu.org/index.php/journals/1718'>"Interface Versioning in C++"</a>, ACCU
</li>
<li>
Processor ABI standards: <a href='http://refspecs.linuxbase.org/elf/abi386-4.pdf'>Intel386</a>, <a href='http://www.x86-64.org/documentation/abi.pdf'>AMD64</a>, <a href='http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf'>ARM</a>, <a href='http://refspecs.linuxbase.org/elf/elfspec_ppc.pdf'>PowerPC</a>, <a href='http://download.boulder.ibm.com/ibmdl/pub/software/dw/linux390/docu/l390abi0.pdf'> S/390</a>, <a href='http://refspecs.linuxbase.org/elf/IA64-SysV-psABI.pdf'>Itanium</a>, <a href='http://refspecs.linuxbase.org/elf/mipsabi.pdf'>MIPS</a>, <a href='sparc.org/wp-content/uploads/2014/01/psABI3rd.pdf.gz'>SPARC</a>, <a href='http://refspecs.linuxbase.org/elf/elf-pa.pdf'>PA-RISK</a>, <a href='http://www.linux-m32r.org/cmn/m32r/M32R-elf-abi.pdf'>M32R</a>
</li>
<li>
<a href='https://refspecs.linuxbase.org/elf/gabi41.pdf'>"Generic ABI Standard"</a>, <a href='http://refspecs.linuxbase.org/elf/'>"ELF and ABI Standards"</a>, freestandards.org
</li>
<li>
<a href='http://events.linuxfoundation.org/sites/events/files/slides/Binary_Compatibility_for_library_devs.pdf'>"Binary compatibility for library developers"</a>, <a href='https://www.youtube.com/watch?v=PHrXGHDd9no'>Video</a>, Thiago Macieira
</li>
<li>
<a href='http://debconf14-video.debian.net/video/286/acc-for-abi-breaks'>"ACC for abi breaks"</a>, Dimitri Ledkov
</li>
</ul>
<div class="footer">
get the source code on GitHub : <a href="https://github.com/lvc/abi-compliance-checker">lvc/abi-compliance-checker</a>
</div>
<br/>
<br/>
</div>
</body>
</html>