abi.xml revision 1.7
1<section xmlns="http://docbook.org/ns/docbook" version="5.0" 
2	 xml:id="appendix.porting.abi" xreflabel="abi">
3<?dbhtml filename="abi.html"?>
4
5<info><title>ABI Policy and Guidelines</title>
6  <keywordset>
7    <keyword>C++</keyword>
8    <keyword>ABI</keyword>
9    <keyword>version</keyword>
10    <keyword>dynamic</keyword>
11    <keyword>shared</keyword>
12    <keyword>compatibility</keyword>
13  </keywordset>
14</info>
15
16
17
18<para>
19</para>
20
21<section xml:id="abi.cxx_interface"><info><title>The C++ Interface</title></info>
22
23
24<para>
25  C++ applications often depend on specific language support
26  routines, say for throwing exceptions, or catching exceptions, and
27  perhaps also depend on features in the C++ Standard Library.
28</para>
29
30<para>
31  The C++ Standard Library has many include files, types defined in
32  those include files, specific named functions, and other
33  behavior. The text of these behaviors, as written in source include
34  files, is called the Application Programing Interface, or API.
35</para>
36
37<para>
38  Furthermore, C++ source that is compiled into object files is
39  transformed by the compiler: it arranges objects with specific
40  alignment and in a particular layout, mangling names according to a
41  well-defined algorithm, has specific arrangements for the support of
42  virtual functions, etc. These details are defined as the compiler
43  Application Binary Interface, or ABI. The GNU C++ compiler uses an
44  industry-standard C++ ABI starting with version 3. Details can be
45  found in the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://mentorembedded.github.io/cxx-abi/abi.html">ABI
46  specification</link>.
47</para>
48
49<para>
50 The GNU C++ compiler, g++, has a compiler command line option to
51  switch between various different C++ ABIs. This explicit version
52  switch is the flag <code>-fabi-version</code>. In addition, some
53  g++ command line options may change the ABI as a side-effect of
54  use. Such flags include <code>-fpack-struct</code> and
55  <code>-fno-exceptions</code>, but include others: see the complete
56  list in the GCC manual under the heading <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code%20Gen%20Options">Options
57  for Code Generation Conventions</link>.
58</para>
59
60<para>
61  The configure options used when building a specific libstdc++
62  version may also impact the resulting library ABI. The available
63  configure options, and their impact on the library ABI, are
64  documented
65<link linkend="manual.intro.setup.configure">here</link>.
66</para>
67
68<para> Putting all of these ideas together results in the C++ Standard
69Library ABI, which is the compilation of a given library API by a
70given compiler ABI. In a nutshell:
71</para>
72
73<para>
74  <quote>
75    library API + compiler ABI = library ABI
76  </quote>
77</para>
78
79<para>
80 The library ABI is mostly of interest for end-users who have
81 unresolved symbols and are linking dynamically to the C++ Standard
82 library, and who thus must be careful to compile their application
83 with a compiler that is compatible with the available C++ Standard
84 library binary. In this case, compatible is defined with the equation
85 above: given an application compiled with a given compiler ABI and
86 library API, it will work correctly with a Standard C++ Library
87 created with the same constraints.
88</para>
89
90<para>
91  To use a specific version of the C++ ABI, one must use a
92  corresponding GNU C++ toolchain (i.e., g++ and libstdc++) that
93  implements the C++ ABI in question.
94</para>
95
96</section>
97
98<section xml:id="abi.versioning"><info><title>Versioning</title></info>
99
100
101<para> The C++ interface has evolved throughout the history of the GNU
102C++ toolchain. With each release, various details have been changed so
103as to give distinct versions to the C++ interface.
104</para>
105
106  <section xml:id="abi.versioning.goals"><info><title>Goals</title></info>
107    
108
109<para>Extending existing, stable ABIs. Versioning gives subsequent
110releases of library binaries the ability to add new symbols and add
111functionality, all the while retaining compatibility with the previous
112releases in the series. Thus, program binaries linked with the initial
113release of a library binary will still run correctly if the library
114binary is replaced by carefully-managed subsequent library
115binaries. This is called forward compatibility.
116</para>
117<para>
118The reverse (backwards compatibility) is not true. It is not possible
119to take program binaries linked with the latest version of a library
120binary in a release series (with additional symbols added), substitute
121in the initial release of the library binary, and remain link
122compatible.
123</para>
124
125<para>Allows multiple, incompatible ABIs to coexist at the same time.
126</para>
127  </section>
128
129  <section xml:id="abi.versioning.history"><info><title>History</title></info>
130    
131
132<para>
133 How can this complexity be managed? What does C++ versioning mean?
134  Because library and compiler changes often make binaries compiled
135  with one version of the GNU tools incompatible with binaries
136  compiled with other (either newer or older) versions of the same GNU
137  tools, specific techniques are used to make managing this complexity
138  easier.
139</para>
140
141<para>
142  The following techniques are used:
143</para>
144
145  <orderedlist>
146
147    <listitem><para>Release versioning on the libgcc_s.so binary. </para>
148
149    <para>This is implemented via file names and the ELF
150    <constant>DT_SONAME</constant> mechanism (at least on ELF
151    systems). It is versioned as follows:
152    </para>
153
154    <itemizedlist>
155    <listitem><para>GCC 3.x: libgcc_s.so.1</para></listitem>
156    <listitem><para>GCC 4.x: libgcc_s.so.1</para></listitem>
157    </itemizedlist>
158
159    <para>For m68k-linux the versions differ as follows: </para>
160
161    <itemizedlist>
162    <listitem><para>GCC 3.4, GCC 4.x: libgcc_s.so.1
163    when configuring <code>--with-sjlj-exceptions</code>, or
164    libgcc_s.so.2 </para> </listitem>
165    </itemizedlist>
166
167    <para>For hppa-linux the versions differ as follows: </para>
168
169    <itemizedlist>
170    <listitem><para>GCC 3.4, GCC 4.[0-1]: either libgcc_s.so.1
171    when configuring <code>--with-sjlj-exceptions</code>, or
172    libgcc_s.so.2 </para> </listitem>
173    <listitem><para>GCC 4.[2-7]: either libgcc_s.so.3 when configuring
174    <code>--with-sjlj-exceptions</code>) or libgcc_s.so.4
175    </para> </listitem>
176    </itemizedlist>
177
178  </listitem>
179
180    <listitem><para>Symbol versioning on the libgcc_s.so binary.</para>
181
182    <para>It is versioned with the following labels and version
183   definitions, where the version definition is the maximum for a
184   particular release. Labels are cumulative. If a particular release
185   is not listed, it has the same version labels as the preceding
186   release.</para>
187
188    <para>This corresponds to the mapfile: gcc/libgcc-std.ver</para>
189    <itemizedlist>
190    <listitem><para>GCC 3.0.0: GCC_3.0</para></listitem>
191    <listitem><para>GCC 3.3.0: GCC_3.3</para></listitem>
192    <listitem><para>GCC 3.3.1: GCC_3.3.1</para></listitem>
193    <listitem><para>GCC 3.3.2: GCC_3.3.2</para></listitem>
194    <listitem><para>GCC 3.3.4: GCC_3.3.4</para></listitem>
195    <listitem><para>GCC 3.4.0: GCC_3.4</para></listitem>
196    <listitem><para>GCC 3.4.2: GCC_3.4.2</para></listitem>
197    <listitem><para>GCC 3.4.4: GCC_3.4.4</para></listitem>
198    <listitem><para>GCC 4.0.0: GCC_4.0.0</para></listitem>
199    <listitem><para>GCC 4.1.0: GCC_4.1.0</para></listitem>
200    <listitem><para>GCC 4.2.0: GCC_4.2.0</para></listitem>
201    <listitem><para>GCC 4.3.0: GCC_4.3.0</para></listitem>
202    <listitem><para>GCC 4.4.0: GCC_4.4.0</para></listitem>
203    <listitem><para>GCC 4.5.0: GCC_4.5.0</para></listitem>
204    <listitem><para>GCC 4.6.0: GCC_4.6.0</para></listitem>
205    <listitem><para>GCC 4.7.0: GCC_4.7.0</para></listitem>
206    <listitem><para>GCC 4.8.0: GCC_4.8.0</para></listitem>
207    </itemizedlist>
208    </listitem>
209
210    <listitem>
211      <para>
212	Release versioning on the libstdc++.so binary, implemented in
213	the same way as the libgcc_s.so binary above. Listed is the
214	filename: <constant>DT_SONAME</constant> can be deduced from
215	the filename by removing the last two period-delimited numbers. For
216	example, filename <filename>libstdc++.so.5.0.4</filename>
217	corresponds to a <constant>DT_SONAME</constant> of
218	<constant>libstdc++.so.5</constant>. Binaries with equivalent
219	<constant>DT_SONAME</constant>s are forward-compatibile: in
220	the table below, releases incompatible with the previous
221	one are explicitly noted.
222	If a particular release is not listed, its libstdc++.so binary
223	has the same filename and <constant>DT_SONAME</constant> as the
224	preceding release.
225      </para>
226
227    <para>It is versioned as follows:
228    </para>
229    <itemizedlist>
230    <listitem><para>GCC 3.0.0: libstdc++.so.3.0.0</para></listitem>
231    <listitem><para>GCC 3.0.1: libstdc++.so.3.0.1</para></listitem>
232    <listitem><para>GCC 3.0.2: libstdc++.so.3.0.2</para></listitem>
233    <listitem><para>GCC 3.0.3: libstdc++.so.3.0.2 (See Note 1)</para></listitem>
234    <listitem><para>GCC 3.0.4: libstdc++.so.3.0.4</para></listitem>
235    <listitem><para>GCC 3.1.0: libstdc++.so.4.0.0 <emphasis>(Incompatible with previous)</emphasis></para></listitem>
236    <listitem><para>GCC 3.1.1: libstdc++.so.4.0.1</para></listitem>
237    <listitem><para>GCC 3.2.0: libstdc++.so.5.0.0 <emphasis>(Incompatible with previous)</emphasis></para></listitem>
238    <listitem><para>GCC 3.2.1: libstdc++.so.5.0.1</para></listitem>
239    <listitem><para>GCC 3.2.2: libstdc++.so.5.0.2</para></listitem>
240    <listitem><para>GCC 3.2.3: libstdc++.so.5.0.3 (See Note 2)</para></listitem>
241    <listitem><para>GCC 3.3.0: libstdc++.so.5.0.4</para></listitem>
242    <listitem><para>GCC 3.3.1: libstdc++.so.5.0.5</para></listitem>
243    <listitem><para>GCC 3.4.0: libstdc++.so.6.0.0 <emphasis>(Incompatible with previous)</emphasis></para></listitem>
244    <listitem><para>GCC 3.4.1: libstdc++.so.6.0.1</para></listitem>
245    <listitem><para>GCC 3.4.2: libstdc++.so.6.0.2</para></listitem>
246    <listitem><para>GCC 3.4.3: libstdc++.so.6.0.3</para></listitem>
247    <listitem><para>GCC 4.0.0: libstdc++.so.6.0.4</para></listitem>
248    <listitem><para>GCC 4.0.1: libstdc++.so.6.0.5</para></listitem>
249    <listitem><para>GCC 4.0.2: libstdc++.so.6.0.6</para></listitem>
250    <listitem><para>GCC 4.0.3: libstdc++.so.6.0.7</para></listitem>
251    <listitem><para>GCC 4.1.0: libstdc++.so.6.0.7</para></listitem>
252    <listitem><para>GCC 4.1.1: libstdc++.so.6.0.8</para></listitem>
253    <listitem><para>GCC 4.2.0: libstdc++.so.6.0.9</para></listitem>
254    <listitem><para>GCC 4.2.1: libstdc++.so.6.0.9 (See Note 3)</para></listitem>
255    <listitem><para>GCC 4.2.2: libstdc++.so.6.0.9</para></listitem>
256    <listitem><para>GCC 4.3.0: libstdc++.so.6.0.10</para></listitem>
257    <listitem><para>GCC 4.4.0: libstdc++.so.6.0.11</para></listitem>
258    <listitem><para>GCC 4.4.1: libstdc++.so.6.0.12</para></listitem>
259    <listitem><para>GCC 4.4.2: libstdc++.so.6.0.13</para></listitem>
260    <listitem><para>GCC 4.5.0: libstdc++.so.6.0.14</para></listitem>
261    <listitem><para>GCC 4.6.0: libstdc++.so.6.0.15</para></listitem>
262    <listitem><para>GCC 4.6.1: libstdc++.so.6.0.16</para></listitem>
263    <listitem><para>GCC 4.7.0: libstdc++.so.6.0.17</para></listitem>
264    <listitem><para>GCC 4.8.0: libstdc++.so.6.0.18</para></listitem>
265    <listitem><para>GCC 4.8.3: libstdc++.so.6.0.19</para></listitem>
266    <listitem><para>GCC 4.9.0: libstdc++.so.6.0.20</para></listitem>
267    <listitem><para>GCC 5.1.0: libstdc++.so.6.0.21</para></listitem>
268    <listitem><para>GCC 6.1.0: libstdc++.so.6.0.22</para></listitem>
269    </itemizedlist>
270    <para>
271      Note 1: Error should be libstdc++.so.3.0.3.
272    </para>
273    <para>
274      Note 2: Not strictly required.
275    </para>
276    <para>
277      Note 3: This release (but not previous or subsequent) has one
278      known incompatibility, see <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33678">33678</link>
279      in the GCC bug database.
280    </para>
281    </listitem>
282
283    <listitem><para>Symbol versioning on the libstdc++.so binary.</para>
284
285    <para>mapfile: libstdc++-v3/config/abi/pre/gnu.ver</para>
286    <para>It is versioned with the following labels and version
287   definitions, where the version definition is the maximum for a
288   particular release. Note, only symbols which are newly introduced
289   will use the maximum version definition. Thus, for release series
290   with the same label, but incremented version definitions, the later
291   release has both versions. (An example of this would be the
292   GCC 3.2.1 release, which has GLIBCPP_3.2.1 for new symbols and
293   GLIBCPP_3.2 for symbols that were introduced in the GCC 3.2.0
294   release.) If a particular release is not listed, it has the same
295   version labels as the preceding release.
296   </para>
297    <itemizedlist>
298    <listitem><para>GCC 3.0.0: (Error, not versioned)</para></listitem>
299    <listitem><para>GCC 3.0.1: (Error, not versioned)</para></listitem>
300    <listitem><para>GCC 3.0.2: (Error, not versioned)</para></listitem>
301    <listitem><para>GCC 3.0.3: (Error, not versioned)</para></listitem>
302    <listitem><para>GCC 3.0.4: (Error, not versioned)</para></listitem>
303    <listitem><para>GCC 3.1.0: GLIBCPP_3.1, CXXABI_1</para></listitem>
304    <listitem><para>GCC 3.1.1: GLIBCPP_3.1, CXXABI_1</para></listitem>
305    <listitem><para>GCC 3.2.0: GLIBCPP_3.2, CXXABI_1.2</para></listitem>
306    <listitem><para>GCC 3.2.1: GLIBCPP_3.2.1, CXXABI_1.2</para></listitem>
307    <listitem><para>GCC 3.2.2: GLIBCPP_3.2.2, CXXABI_1.2</para></listitem>
308    <listitem><para>GCC 3.2.3: GLIBCPP_3.2.2, CXXABI_1.2</para></listitem>
309    <listitem><para>GCC 3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1</para></listitem>
310    <listitem><para>GCC 3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1</para></listitem>
311    <listitem><para>GCC 3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1</para></listitem>
312    <listitem><para>GCC 3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1</para></listitem>
313    <listitem><para>GCC 3.4.0: GLIBCXX_3.4, CXXABI_1.3</para></listitem>
314    <listitem><para>GCC 3.4.1: GLIBCXX_3.4.1, CXXABI_1.3</para></listitem>
315    <listitem><para>GCC 3.4.2: GLIBCXX_3.4.2</para></listitem>
316    <listitem><para>GCC 3.4.3: GLIBCXX_3.4.3</para></listitem>
317    <listitem><para>GCC 4.0.0: GLIBCXX_3.4.4, CXXABI_1.3.1</para></listitem>
318    <listitem><para>GCC 4.0.1: GLIBCXX_3.4.5</para></listitem>
319    <listitem><para>GCC 4.0.2: GLIBCXX_3.4.6</para></listitem>
320    <listitem><para>GCC 4.0.3: GLIBCXX_3.4.7</para></listitem>
321    <listitem><para>GCC 4.1.1: GLIBCXX_3.4.8</para></listitem>
322    <listitem><para>GCC 4.2.0: GLIBCXX_3.4.9</para></listitem>
323    <listitem><para>GCC 4.3.0: GLIBCXX_3.4.10, CXXABI_1.3.2</para></listitem>
324    <listitem><para>GCC 4.4.0: GLIBCXX_3.4.11, CXXABI_1.3.3</para></listitem>
325    <listitem><para>GCC 4.4.1: GLIBCXX_3.4.12, CXXABI_1.3.3</para></listitem>
326    <listitem><para>GCC 4.4.2: GLIBCXX_3.4.13, CXXABI_1.3.3</para></listitem>
327    <listitem><para>GCC 4.5.0: GLIBCXX_3.4.14, CXXABI_1.3.4</para></listitem>
328    <listitem><para>GCC 4.6.0: GLIBCXX_3.4.15, CXXABI_1.3.5</para></listitem>
329    <listitem><para>GCC 4.6.1: GLIBCXX_3.4.16, CXXABI_1.3.5</para></listitem>
330    <listitem><para>GCC 4.7.0: GLIBCXX_3.4.17, CXXABI_1.3.6</para></listitem>
331    <listitem><para>GCC 4.8.0: GLIBCXX_3.4.18, CXXABI_1.3.7</para></listitem>
332    <listitem><para>GCC 4.8.3: GLIBCXX_3.4.19, CXXABI_1.3.7</para></listitem>
333    <listitem><para>GCC 4.9.0: GLIBCXX_3.4.20, CXXABI_1.3.8</para></listitem>
334    <listitem><para>GCC 5.1.0: GLIBCXX_3.4.21, CXXABI_1.3.9</para></listitem>
335    <listitem><para>GCC 6.1.0: GLIBCXX_3.4.22, CXXABI_1.3.10</para></listitem>
336    </itemizedlist>
337    </listitem>
338
339    <listitem>
340    <para>Incremental bumping of a compiler pre-defined macro,
341    __GXX_ABI_VERSION. This macro is defined as the version of the
342    compiler v3 ABI, with g++ 3.0 being version 100. This macro will
343    be automatically defined whenever g++ is used (the curious can
344    test this by invoking g++ with the '-v' flag.)
345    </para>
346
347    <para>
348    This macro was defined in the file "lang-specs.h" in the gcc/cp directory.
349    Later versions defined it in "c-common.c" in the gcc directory, and from
350    G++ 3.4 it is defined in c-cppbuiltin.c and its value determined by the
351    '-fabi-version' command line option.
352    </para>
353
354    <para>
355    It is versioned as follows, where 'n' is given by '-fabi-version=n':
356    </para>
357    <itemizedlist>
358    <listitem><para>GCC 3.0: 100</para></listitem>
359    <listitem><para>GCC 3.1: 100 (Error, should be 101)</para></listitem>
360    <listitem><para>GCC 3.2: 102</para></listitem>
361    <listitem><para>GCC 3.3: 102</para></listitem>
362    <listitem><para>GCC 3.4, GCC 4.x: 102 (when n=1)</para></listitem>
363    <listitem><para>GCC 3.4, GCC 4.x: 1000 + n (when n&gt;1) </para></listitem>
364    <listitem><para>GCC 3.4, GCC 4.x: 999999 (when n=0)</para></listitem>
365    </itemizedlist>
366    <para/>
367    </listitem>
368
369    <listitem>
370    <para>Changes to the default compiler option for
371    <code>-fabi-version</code>.
372    </para>
373   <para>
374    It is versioned as follows:
375    </para>
376    <itemizedlist>
377    <listitem><para>GCC 3.0: (Error, not versioned) </para></listitem>
378    <listitem><para>GCC 3.1: (Error, not versioned) </para></listitem>
379    <listitem><para>GCC 3.2: <code>-fabi-version=1</code></para></listitem>
380    <listitem><para>GCC 3.3: <code>-fabi-version=1</code></para></listitem>
381    <listitem><para>GCC 3.4, GCC 4.x: <code>-fabi-version=2</code> <emphasis>(Incompatible with previous)</emphasis></para></listitem>
382    </itemizedlist>
383    <para/>
384    </listitem>
385
386   <listitem>
387    <para>Incremental bumping of a library pre-defined macro. For releases
388    before 3.4.0, the macro is __GLIBCPP__. For later releases, it's
389    __GLIBCXX__. (The libstdc++ project generously changed from CPP to
390    CXX throughout its source to allow the "C" pre-processor the CPP
391    macro namespace.) These macros are defined as the date the library
392    was released, in compressed ISO date format, as an unsigned long.
393    </para>
394
395    <para>
396    This macro is defined in the file "c++config" in the
397    "libstdc++-v3/include/bits" directory. Up to GCC 4.1.0, it was
398    changed every night by an automated script. Since GCC 4.1.0 it is set
399    during configuration to the same value as
400    <filename>gcc/DATESTAMP</filename>, so for an official release its value
401    is the same as the date of the release, which is given in the <link
402      xmlns:xlink="http://www.w3.org/1999/xlink"
403      xlink:href="https://gcc.gnu.org/develop.html#timeline">GCC Release
404    Timeline</link>.
405    </para>
406
407    <para>
408    This macro is not useful for determining whether a particular feature is
409    supported by the version of libstdc++ you are using. The date of a release
410    might be after a feature was added to the development trunk, but the
411    release could be from an older branch. For example, in the 5.4.0 release
412    the macro has the value 20160603 which is greater than the 20160427 value
413    of the macro in the 6.1.0 release, but there are features supported in the
414    6.1.0 release that are not supported in 5.4.0 release.
415    You also can't test for the exact values listed below to try and
416    identify a release, because a snapshot taken from the gcc-5-branch on
417    2016-04-27 would have the same value for the macro as the 6.1.0 release
418    despite being a different version.
419    Many GNU/Linux distributions build their GCC packages from snapshots, so
420    the macro can have dates that doesn't correspond to official releases.
421    </para>
422
423    <para>
424    It is versioned as follows:
425    </para>
426    <itemizedlist>
427    <listitem><para>GCC 3.0.0: 20010615</para></listitem>
428    <listitem><para>GCC 3.0.1: 20010819</para></listitem>
429    <listitem><para>GCC 3.0.2: 20011023</para></listitem>
430    <listitem><para>GCC 3.0.3: 20011220</para></listitem>
431    <listitem><para>GCC 3.0.4: 20020220</para></listitem>
432    <listitem><para>GCC 3.1.0: 20020514</para></listitem>
433    <listitem><para>GCC 3.1.1: 20020725</para></listitem>
434    <listitem><para>GCC 3.2.0: 20020814</para></listitem>
435    <listitem><para>GCC 3.2.1: 20021119</para></listitem>
436    <listitem><para>GCC 3.2.2: 20030205</para></listitem>
437    <listitem><para>GCC 3.2.3: 20030422</para></listitem>
438    <listitem><para>GCC 3.3.0: 20030513</para></listitem>
439    <listitem><para>GCC 3.3.1: 20030804</para></listitem>
440    <listitem><para>GCC 3.3.2: 20031016</para></listitem>
441    <listitem><para>GCC 3.3.3: 20040214</para></listitem>
442    <listitem><para>GCC 3.4.0: 20040419</para></listitem>
443    <listitem><para>GCC 3.4.1: 20040701</para></listitem>
444    <listitem><para>GCC 3.4.2: 20040906</para></listitem>
445    <listitem><para>GCC 3.4.3: 20041105</para></listitem>
446    <listitem><para>GCC 3.4.4: 20050519</para></listitem>
447    <listitem><para>GCC 3.4.5: 20051201</para></listitem>
448    <listitem><para>GCC 3.4.6: 20060306</para></listitem>
449    <listitem><para>GCC 4.0.0: 20050421</para></listitem>
450    <listitem><para>GCC 4.0.1: 20050707</para></listitem>
451    <listitem><para>GCC 4.0.2: 20050921</para></listitem>
452    <listitem><para>GCC 4.0.3: 20060309</para></listitem>
453    <listitem><para>
454      GCC 4.1.0 and later: the GCC release date, as shown in the
455      <link xmlns:xlink="http://www.w3.org/1999/xlink"
456        xlink:href="https://gcc.gnu.org/develop.html#timeline">GCC
457      Release Timeline</link>
458    </para></listitem>
459    </itemizedlist>
460    <para/>
461    </listitem>
462
463    <listitem>
464    <para>
465    Incremental bumping of a library pre-defined macro,
466    _GLIBCPP_VERSION. This macro is defined as the released version of
467    the library, as a string literal. This is only implemented in
468    GCC 3.1.0 releases and higher, and is deprecated in 3.4 (where it
469    is called _GLIBCXX_VERSION).
470    </para>
471
472    <para>
473    This macro is defined in the file "c++config" in the
474    "libstdc++-v3/include/bits" directory and is generated
475    automatically by autoconf as part of the configure-time generation
476    of config.h.
477    </para>
478
479    <para>
480    It is versioned as follows:
481    </para>
482    <itemizedlist>
483    <listitem><para>GCC 3.0.0: "3.0.0"</para></listitem>
484    <listitem><para>GCC 3.0.1: "3.0.0" (Error, should be "3.0.1")</para></listitem>
485    <listitem><para>GCC 3.0.2: "3.0.0" (Error, should be "3.0.2")</para></listitem>
486    <listitem><para>GCC 3.0.3: "3.0.0" (Error, should be "3.0.3")</para></listitem>
487    <listitem><para>GCC 3.0.4: "3.0.0" (Error, should be "3.0.4")</para></listitem>
488    <listitem><para>GCC 3.1.0: "3.1.0"</para></listitem>
489    <listitem><para>GCC 3.1.1: "3.1.1"</para></listitem>
490    <listitem><para>GCC 3.2.0: "3.2"</para></listitem>
491    <listitem><para>GCC 3.2.1: "3.2.1"</para></listitem>
492    <listitem><para>GCC 3.2.2: "3.2.2"</para></listitem>
493    <listitem><para>GCC 3.2.3: "3.2.3"</para></listitem>
494    <listitem><para>GCC 3.3.0: "3.3"</para></listitem>
495    <listitem><para>GCC 3.3.1: "3.3.1"</para></listitem>
496    <listitem><para>GCC 3.3.2: "3.3.2"</para></listitem>
497    <listitem><para>GCC 3.3.3: "3.3.3"</para></listitem>
498    <listitem><para>GCC 3.4: "version-unused"</para></listitem>
499    <listitem><para>GCC 4.x: "version-unused"</para></listitem>
500    </itemizedlist>
501    <para/>
502    </listitem>
503
504    <listitem>
505    <para>
506    Matching each specific C++ compiler release to a specific set of
507    C++ include files. This is only implemented in GCC 3.1.1 releases
508    and higher.
509    </para>
510    <para>
511    All C++ includes are installed in
512    <filename class="directory">include/c++</filename>, then nest in a
513    directory hierarchy corresponding to the C++ compiler's released
514    version. This version corresponds to the variable "gcc_version" in
515    "libstdc++-v3/acinclude.m4," and more details can be found in that
516    file's macro GLIBCXX_CONFIGURE (GLIBCPP_CONFIGURE before GCC 3.4.0).
517    </para>
518    <para>
519    C++ includes are versioned as follows:
520    </para>
521    <itemizedlist>
522    <listitem><para>GCC 3.0.0: include/g++-v3</para></listitem>
523    <listitem><para>GCC 3.0.1: include/g++-v3</para></listitem>
524    <listitem><para>GCC 3.0.2: include/g++-v3</para></listitem>
525    <listitem><para>GCC 3.0.3: include/g++-v3</para></listitem>
526    <listitem><para>GCC 3.0.4: include/g++-v3</para></listitem>
527    <listitem><para>GCC 3.1.0: include/g++-v3</para></listitem>
528    <listitem><para>GCC 3.1.1: include/c++/3.1.1</para></listitem>
529    <listitem><para>GCC 3.2.0: include/c++/3.2</para></listitem>
530    <listitem><para>GCC 3.2.1: include/c++/3.2.1</para></listitem>
531    <listitem><para>GCC 3.2.2: include/c++/3.2.2</para></listitem>
532    <listitem><para>GCC 3.2.3: include/c++/3.2.3</para></listitem>
533    <listitem><para>GCC 3.3.0: include/c++/3.3</para></listitem>
534    <listitem><para>GCC 3.3.1: include/c++/3.3.1</para></listitem>
535    <listitem><para>GCC 3.3.2: include/c++/3.3.2</para></listitem>
536    <listitem><para>GCC 3.3.3: include/c++/3.3.3</para></listitem>
537    <listitem><para>GCC 3.4.x: include/c++/3.4.x</para></listitem>
538    <listitem><para>GCC 4.x.y: include/c++/4.x.y</para></listitem>
539    <listitem><para>GCC 5.x.0: include/c++/5.x.0</para></listitem>
540    </itemizedlist>
541    <para/>
542    </listitem>
543  </orderedlist>
544
545<para>
546  Taken together, these techniques can accurately specify interface
547  and implementation changes in the GNU C++ tools themselves. Used
548  properly, they allow both the GNU C++ tools implementation, and
549  programs using them, an evolving yet controlled development that
550  maintains backward compatibility.
551</para>
552
553
554  </section>
555
556  <section xml:id="abi.versioning.prereq"><info><title>Prerequisites</title></info>
557    
558    <para>
559      Minimum environment that supports a versioned ABI: A supported
560      dynamic linker, a GNU linker of sufficient vintage to understand
561      demangled C++ name globbing (ld) or the Sun linker, a shared
562      executable compiled
563      with g++, and shared libraries (libgcc_s, libstdc++) compiled by
564      a compiler (g++) with a compatible ABI. Phew.
565    </para>
566
567    <para>
568      On top of all that, an additional constraint: libstdc++ did not
569      attempt to version symbols (or age gracefully, really) until
570      version 3.1.0.
571    </para>
572
573    <para>
574      Most modern GNU/Linux and BSD versions, particularly ones using
575      GCC 3.1 and later, will meet the
576      requirements above, as does Solaris 2.5 and up.
577    </para>
578  </section>
579
580  <section xml:id="abi.versioning.config"><info><title>Configuring</title></info>
581    
582
583    <para>
584      It turns out that most of the configure options that change
585      default behavior will impact the mangled names of exported
586      symbols, and thus impact versioning and compatibility.
587    </para>
588
589    <para>
590      For more information on configure options, including ABI
591      impacts, see:
592      <link linkend="manual.intro.setup.configure">here</link>
593    </para>
594
595    <para>
596      There is one flag that explicitly deals with symbol versioning:
597      --enable-symvers.
598    </para>
599
600    <para>
601      In particular, libstdc++-v3/acinclude.m4 has a macro called
602      GLIBCXX_ENABLE_SYMVERS that defaults to yes (or the argument
603      passed in via --enable-symvers=foo). At that point, the macro
604      attempts to make sure that all the requirement for symbol
605      versioning are in place. For more information, please consult
606      acinclude.m4.
607    </para>
608  </section>
609
610  <section xml:id="abi.versioning.active"><info><title>Checking Active</title></info>
611    
612
613    <para>
614      When the GNU C++ library is being built with symbol versioning
615      on, you should see the following at configure time for
616      libstdc++ (showing either 'gnu' or another of the supported styles):
617    </para>
618
619<screen>
620<computeroutput>
621  checking versioning on shared library symbols... gnu
622</computeroutput>
623</screen>
624
625<para>
626  If you don't see this line in the configure output, or if this line
627  appears but the last word is 'no', then you are out of luck.
628</para>
629
630<para>
631  If the compiler is pre-installed, a quick way to test is to compile
632  the following (or any) simple C++ file and link it to the shared
633  libstdc++ library:
634</para>
635
636<programlisting>
637#include &lt;iostream&gt;
638
639int main()
640{ std::cout &lt;&lt; "hello" &lt;&lt; std::endl; return 0; }
641
642%g++ hello.cc -o hello.out
643
644%ldd hello.out
645	libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x00764000)
646	libm.so.6 =&gt; /lib/tls/libm.so.6 (0x004a8000)
647	libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40016000)
648	libc.so.6 =&gt; /lib/tls/libc.so.6 (0x0036d000)
649	/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
650
651%nm hello.out
652</programlisting>
653
654<para>
655If you see symbols in the resulting output with "GLIBCXX_3" as part
656of the name, then the executable is versioned. Here's an example:
657</para>
658
659<para>
660   <code>U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4</code>
661</para>
662
663<para>
664On Solaris 2, you can use <code>pvs -r</code> instead:
665</para>
666
667<programlisting>
668%g++ hello.cc -o hello.out
669
670%pvs -r hello.out
671        libstdc++.so.6 (GLIBCXX_3.4, GLIBCXX_3.4.12);
672        libgcc_s.so.1 (GCC_3.0);
673        libc.so.1 (SUNWprivate_1.1, SYSVABI_1.3);
674</programlisting>
675
676<para>
677<code>ldd -v</code> works too, but is very verbose.
678</para>
679
680  </section>
681</section>
682
683<section xml:id="abi.changes_allowed"><info><title>Allowed Changes</title></info>
684
685
686<para>
687The following will cause the library minor version number to
688increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.3.0.5".
689</para>
690<orderedlist>
691 <listitem><para>Adding an exported global or static data member</para></listitem>
692 <listitem><para>Adding an exported function, static or non-virtual member function</para></listitem>
693 <listitem><para>Adding an exported symbol or symbols by additional instantiations</para></listitem>
694</orderedlist>
695<para>
696Other allowed changes are possible.
697</para>
698
699</section>
700
701<section xml:id="abi.changes_no"><info><title>Prohibited Changes</title></info>
702
703
704<para>
705The following non-exhaustive list will cause the library major version
706number to increase, say from "libstdc++.so.3.0.4" to
707"libstdc++.so.4.0.0".
708</para>
709
710<orderedlist>
711 <listitem><para>Changes in the gcc/g++ compiler ABI</para></listitem>
712<listitem><para>Changing size of an exported symbol</para></listitem>
713<listitem><para>Changing alignment of an exported symbol</para></listitem>
714<listitem><para>Changing the layout of an exported symbol</para></listitem>
715<listitem><para>Changing mangling on an exported symbol</para></listitem>
716<listitem><para>Deleting an exported symbol</para></listitem>
717<listitem><para>Changing the inheritance properties of a type by adding or removing
718    base classes</para></listitem>
719<listitem><para>
720  Changing the size, alignment, or layout of types
721  specified in the C++ standard. These may not necessarily be
722  instantiated or otherwise exported in the library binary, and
723  include all the required locale facets, as well as things like
724  std::basic_streambuf, et al.
725</para></listitem>
726
727<listitem><para> Adding an explicit copy constructor or destructor to a
728class that would otherwise have implicit versions. This will change
729the way the compiler deals with this class in by-value return
730statements or parameters: instead of passing instances of this
731class in registers, the compiler will be forced to use memory. See the
732section on <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://mentorembedded.github.io/cxx-abi/abi.html#calls">Function
733Calling Conventions and APIs</link>
734 of the C++ ABI documentation for further details.
735</para></listitem>
736
737</orderedlist>
738
739</section>
740
741
742
743<section xml:id="abi.impl"><info><title>Implementation</title></info>
744
745
746<orderedlist>
747 <listitem>
748   <para>
749     Separation of interface and implementation
750   </para>
751   <para>
752     This is accomplished by two techniques that separate the API from
753     the ABI: forcing undefined references to link against a library
754     binary for definitions.
755   </para>
756
757<variablelist>
758  <varlistentry>
759    <term>Include files have declarations, source files have defines</term>
760
761    <listitem>
762      <para>
763	For non-templatized types, such as much of <code>class
764	locale</code>, the appropriate standard C++ include, say
765	<code>locale</code>, can contain full declarations, while
766	various source files (say <code> locale.cc, locale_init.cc,
767	localename.cc</code>) contain definitions.
768      </para>
769    </listitem>
770  </varlistentry>
771
772  <varlistentry>
773  <term>Extern template on required types</term>
774
775   <listitem>
776     <para>
777       For parts of the standard that have an explicit list of
778       required instantiations, the GNU extension syntax <code> extern
779       template </code> can be used to control where template
780       definitions reside. By marking required instantiations as
781       <code> extern template </code> in include files, and providing
782       explicit instantiations in the appropriate instantiation files,
783       non-inlined template functions can be versioned. This technique
784       is mostly used on parts of the standard that require <code>
785       char</code> and <code> wchar_t</code> instantiations, and
786       includes <code> basic_string</code>, the locale facets, and the
787       types in <code> iostreams</code>.
788     </para>
789   </listitem>
790  </varlistentry>
791
792 </variablelist>
793
794 <para>
795   In addition, these techniques have the additional benefit that they
796   reduce binary size, which can increase runtime performance.
797 </para>
798 </listitem>
799
800 <listitem>
801   <para>
802     Namespaces linking symbol definitions to export mapfiles
803   </para>
804   <para>
805     All symbols in the shared library binary are processed by a
806     linker script at build time that either allows or disallows
807     external linkage. Because of this, some symbols, regardless of
808     normal C/C++ linkage, are not visible. Symbols that are internal
809     have several appealing characteristics: by not exporting the
810     symbols, there are no relocations when the shared library is
811     started and thus this makes for faster runtime loading
812     performance by the underlying dynamic loading mechanism. In
813     addition, they have the possibility of changing without impacting
814     ABI compatibility.
815   </para>
816
817<para>The following namespaces are transformed by the mapfile:</para>
818
819<variablelist>
820
821  <varlistentry>
822<term><code>namespace std</code></term>
823<listitem><para> Defaults to exporting all symbols in label
824<code>GLIBCXX</code> that do not begin with an underscore, i.e.,
825<code>__test_func</code> would not be exported by default. Select
826exceptional symbols are allowed to be visible.</para></listitem>
827  </varlistentry>
828
829  <varlistentry>
830<term><code>namespace __gnu_cxx</code></term>
831<listitem><para> Defaults to not exporting any symbols in label
832<code>GLIBCXX</code>, select items are allowed to be visible.</para></listitem>
833  </varlistentry>
834
835  <varlistentry>
836<term><code>namespace __gnu_internal</code></term>
837<listitem><para> Defaults to not exported, no items are allowed to be visible.</para></listitem>
838  </varlistentry>
839
840  <varlistentry>
841<term><code>namespace __cxxabiv1</code>, aliased to <code> namespace abi</code></term>
842<listitem><para> Defaults to not exporting any symbols in label
843<code>CXXABI</code>, select items are allowed to be visible.</para></listitem>
844  </varlistentry>
845
846</variablelist>
847<para>
848</para>
849</listitem>
850
851 <listitem><para>Freezing the API</para>
852 <para>Disallowed changes, as above, are not made on a stable release
853branch. Enforcement tends to be less strict with GNU extensions that
854standard includes.</para>
855</listitem>
856</orderedlist>
857
858</section>
859
860<section xml:id="abi.testing"><info><title>Testing</title></info>
861
862
863  <section xml:id="abi.testing.single"><info><title>Single ABI Testing</title></info>
864    
865
866    <para>
867      Testing for GNU C++ ABI changes is composed of two distinct
868      areas: testing the C++ compiler (g++) for compiler changes, and
869      testing the C++ library (libstdc++) for library changes.
870    </para>
871
872    <para>
873      Testing the C++ compiler ABI can be done various ways.
874    </para>
875
876    <para>
877      One.  Intel ABI checker.
878    </para>
879
880<para>
881Two.
882The second is yet unreleased, but has been announced on the gcc
883mailing list. It is yet unspecified if these tools will be freely
884available, and able to be included in a GNU project. Please contact
885Mark Mitchell (mark@codesourcery.com) for more details, and current
886status.
887</para>
888
889<para>
890Three.
891Involves using the vlad.consistency test framework. This has also been
892discussed on the gcc mailing lists.
893</para>
894
895<para>
896Testing the C++ library ABI can also be done various ways.
897</para>
898
899<para>
900One.
901(Brendan Kehoe, Jeff Law suggestion to run 'make check-c++' two ways,
902one with a new compiler and an old library, and the other with an old
903compiler and a new library, and look for testsuite regressions)
904</para>
905
906<para>
907Details on how to set this kind of test up can be found here:
908http://gcc.gnu.org/ml/gcc/2002-08/msg00142.html
909</para>
910
911<para>
912Two.
913Use the 'make check-abi' rule in the libstdc++ Makefile.
914</para>
915
916<para>
917This is a proactive check of the library ABI. Currently, exported symbol
918names that are either weak or defined are checked against a last known
919good baseline. Currently, this baseline is keyed off of 3.4.0
920binaries, as this was the last time the .so number was incremented. In
921addition, all exported names are demangled, and the exported objects
922are checked to make sure they are the same size as the same object in
923the baseline.
924
925Notice that each baseline is relative to a <emphasis>default</emphasis>
926configured library and compiler: in particular, if options such as
927--enable-clocale, or --with-cpu, in case of multilibs, are used at
928configure time, the check may fail, either because of substantive
929differences or because of limitations of the current checking
930machinery.
931</para>
932
933<para>
934This dataset is insufficient, yet a start. Also needed is a
935comprehensive check for all user-visible types part of the standard
936library for sizeof() and alignof() changes.
937</para>
938
939<para>
940Verifying compatible layouts of objects is not even attempted.  It
941should be possible to use sizeof, alignof, and offsetof to compute
942offsets for each structure and type in the standard library, saving to
943another datafile. Then, compute this in a similar way for new
944binaries, and look for differences.
945</para>
946
947<para>
948Another approach might be to use the -fdump-class-hierarchy flag to
949get information. However, currently this approach gives insufficient
950data for use in library testing, as class data members, their offsets,
951and other detailed data is not displayed with this flag.
952(See PR g++/7470 on how this was used to find bugs.)
953</para>
954
955<para>
956Perhaps there are other C++ ABI checkers. If so, please notify
957us. We'd like to know about them!
958</para>
959
960  </section>
961  <section xml:id="abi.testing.multi"><info><title>Multiple ABI Testing</title></info>
962    
963<para>
964A "C" application, dynamically linked to two shared libraries, liba,
965libb. The dependent library liba is a C++ shared library compiled with
966GCC 3.3, and uses io, exceptions, locale, etc. The dependent library
967libb is a C++ shared library compiled with GCC 3.4, and also uses io,
968exceptions, locale, etc.
969</para>
970
971<para> As above, libone is constructed as follows: </para>
972<programlisting>
973%$bld/H-x86-gcc-3.4.0/bin/g++ -fPIC -DPIC -c a.cc
974
975%$bld/H-x86-gcc-3.4.0/bin/g++ -shared -Wl,-soname -Wl,libone.so.1 -Wl,-O1 -Wl,-z,defs a.o -o libone.so.1.0.0
976
977%ln -s libone.so.1.0.0 libone.so
978
979%$bld/H-x86-gcc-3.4.0/bin/g++ -c a.cc
980
981%ar cru libone.a a.o
982</programlisting>
983
984<para> And, libtwo is constructed as follows: </para>
985
986<programlisting>
987%$bld/H-x86-gcc-3.3.3/bin/g++ -fPIC -DPIC -c b.cc
988
989%$bld/H-x86-gcc-3.3.3/bin/g++ -shared -Wl,-soname -Wl,libtwo.so.1 -Wl,-O1 -Wl,-z,defs b.o -o libtwo.so.1.0.0
990
991%ln -s libtwo.so.1.0.0 libtwo.so
992
993%$bld/H-x86-gcc-3.3.3/bin/g++ -c b.cc
994
995%ar cru libtwo.a b.o
996</programlisting>
997
998<para> ...with the resulting libraries looking like </para>
999
1000<screen>
1001<computeroutput>
1002%ldd libone.so.1.0.0
1003	libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0x40016000)
1004	libm.so.6 =&gt; /lib/tls/libm.so.6 (0x400fa000)
1005	libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x4011c000)
1006	libc.so.6 =&gt; /lib/tls/libc.so.6 (0x40125000)
1007	/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
1008
1009%ldd libtwo.so.1.0.0
1010	libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x40027000)
1011	libm.so.6 =&gt; /lib/tls/libm.so.6 (0x400e1000)
1012	libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40103000)
1013	libc.so.6 =&gt; /lib/tls/libc.so.6 (0x4010c000)
1014	/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
1015</computeroutput>
1016</screen>
1017
1018<para>
1019  Then, the "C" compiler is used to compile a source file that uses
1020  functions from each library.
1021</para>
1022<programlisting>
1023gcc test.c -g -O2 -L. -lone -ltwo /usr/lib/libstdc++.so.5 /usr/lib/libstdc++.so.6
1024</programlisting>
1025
1026<para>
1027  Which gives the expected:
1028</para>
1029
1030<screen>
1031<computeroutput>
1032%ldd a.out
1033	libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x00764000)
1034	libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0x40015000)
1035	libc.so.6 =&gt; /lib/tls/libc.so.6 (0x0036d000)
1036	libm.so.6 =&gt; /lib/tls/libm.so.6 (0x004a8000)
1037	libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x400e5000)
1038	/lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
1039</computeroutput>
1040</screen>
1041
1042<para>
1043  This resulting binary, when executed, will be able to safely use
1044  code from both liba, and the dependent libstdc++.so.6, and libb,
1045  with the dependent libstdc++.so.5.
1046</para>
1047  </section>
1048</section>
1049
1050<section xml:id="abi.issues"><info><title>Outstanding Issues</title></info>
1051
1052
1053<para>
1054  Some features in the C++ language make versioning especially
1055  difficult. In particular, compiler generated constructs such as
1056  implicit instantiations for templates, typeinfo information, and
1057  virtual tables all may cause ABI leakage across shared library
1058  boundaries. Because of this, mixing C++ ABIs is not recommended at
1059  this time.
1060</para>
1061
1062<para>
1063  For more background on this issue, see these bugzilla entries:
1064</para>
1065
1066<para>
1067<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/PR24660">24660: versioning weak symbols in libstdc++</link>
1068</para>
1069
1070<para>
1071<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/PR19664">19664: libstdc++ headers should have pop/push of the visibility around the declarations</link>
1072</para>
1073
1074</section>
1075
1076<bibliography xml:id="abi.biblio"><info><title>Bibliography</title></info>
1077
1078    <biblioentry xml:id="biblio.abicheck">
1079      <title>
1080	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1081	      xlink:href="http://abicheck.sourceforge.net">
1082	  ABIcheck
1083	</link>
1084      </title>
1085    </biblioentry>
1086
1087    <biblioentry xml:id="biblio.cxxabi">
1088      <title>
1089	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1090	      xlink:href="http://mentorembedded.github.io/cxx-abi/">
1091	  C++ ABI Summary
1092	</link>
1093      </title>
1094    </biblioentry>
1095
1096
1097  <biblioentry>
1098       <title>
1099	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1100	      xlink:href="https://software.intel.com/en-us/articles/intel-compilers-for-linux-compatibility-with-gnu-compilers">
1101	Intel Compilers for Linux: Compatibility with GNU Compilers
1102	</link>
1103      </title>
1104  </biblioentry>
1105
1106  <biblioentry>
1107      <title>
1108	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1109	      xlink:href="http://docs.oracle.com/cd/E23824_01/html/819-0690/index.html">
1110	Linker and Libraries Guide (document 819-0690)
1111	</link>
1112      </title>
1113  </biblioentry>
1114
1115
1116  <biblioentry>
1117      <title>
1118	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1119	      xlink:href="http://download.oracle.com/docs/cd/E19422-01/819-3689/index.html">
1120      Sun Studio 11: C++ Migration Guide (document 819-3689)
1121	</link>
1122      </title>
1123  </biblioentry>
1124
1125  <biblioentry>
1126      <title>
1127	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1128	      xlink:href="http://www.akkadia.org/drepper/dsohowto.pdf">
1129      How to Write Shared Libraries
1130	</link>
1131      </title>
1132
1133    <author>
1134    <personname>
1135    <firstname>Ulrich</firstname><surname>Drepper</surname>
1136    </personname>
1137    </author>
1138  </biblioentry>
1139
1140  <biblioentry>
1141      <title>
1142	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1143	      xlink:href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0036b/index.html">
1144      C++ ABI for the ARM Architecture
1145	</link>
1146      </title>
1147  </biblioentry>
1148
1149  <biblioentry>
1150      <title>
1151	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1152	      xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1976.html">
1153      Dynamic Shared Objects: Survey and Issues
1154	</link>
1155      </title>
1156
1157    <subtitle>
1158      ISO C++ J16/06-0046
1159    </subtitle>
1160    <author><personname><firstname>Benjamin</firstname><surname>Kosnik</surname></personname></author>
1161  </biblioentry>
1162
1163  <biblioentry>
1164      <title>
1165	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1166	      xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2013.html">
1167	Versioning With Namespaces
1168	</link>
1169      </title>
1170    <subtitle>
1171      ISO C++ J16/06-0083
1172    </subtitle>
1173    <author><personname><firstname>Benjamin</firstname><surname>Kosnik</surname></personname></author>
1174  </biblioentry>
1175
1176  <biblioentry>
1177     <title>
1178	<link xmlns:xlink="http://www.w3.org/1999/xlink"
1179	      xlink:href="http://syrcose.ispras.ru/2009/files/02_paper.pdf">
1180      Binary Compatibility of Shared Libraries Implemented in C++
1181      on GNU/Linux Systems
1182	</link>
1183      </title>
1184	
1185    <subtitle>
1186      SYRCoSE 2009
1187    </subtitle>
1188    <author><personname><firstname>Pavel</firstname><surname>Shved</surname></personname></author>
1189    <author><personname><firstname>Denis</firstname><surname>Silakov</surname></personname></author>
1190  </biblioentry>
1191</bibliography>
1192
1193</section>
1194