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