* Mainline merge as of 2006-02-16 (@111136).
[official-gcc.git] / libstdc++-v3 / docs / html / abi.html
blob1971b3aa63da120140aef6a25ba712c7be69ec03
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7 <head>
8 <meta name="AUTHOR" content="bkoz@gcc.gnu.org (Benjamin Kosnik)" />
9 <meta name="KEYWORDS" content="C++, libstdc++, dynamic, shared, library, ABI, version" />
10 <meta name="DESCRIPTION" content="C++ Standard Library ABI" />
11 <meta name="GENERATOR" content="emacs and ten fingers" />
12 <title>Standard C++ Library ABI</title>
13 <link rel="StyleSheet" href="lib3styles.css" type="text/css" />
14 <link rel="Start" href="documentation.html" type="text/html"
15 title="GNU C++ Standard Library" />
16 <link rel="Copyright" href="17_intro/license.html" type="text/html" />
17 </head>
18 <body>
20 <h1 class="centered"><a name="top">C++ Standard Library ABI</a></h1>
22 <p class="fineprint"><em>
23 The latest version of this document is always available at
24 <a href="http://gcc.gnu.org/onlinedocs/libstdc++/abi.html">
25 http://gcc.gnu.org/onlinedocs/libstdc++/abi.html</a>.
26 </em></p>
28 <p><em>
29 To the <a href="http://gcc.gnu.org/libstdc++/">libstdc++-v3 homepage</a>.
30 </em></p>
32 <!-- ####################################################### -->
33 <hr />
34 <h3 class="left">
35 <a name="CXXinterface">The C++ interface</a>
36 </h3>
38 <p> C++ applications often dependent on specific language support
39 routines, say for throwing exceptions, or catching exceptions, and
40 perhaps also dependent on features in the C++ Standard Library.
41 </p>
43 <p> The C++ Standard Library has many include files, types defined in
44 those include files, specific named functions, and other behavior. The
45 text of these behaviors, as written in source include files, is called
46 the Application Programing Interface, or API.
47 </p>
49 <p> Furthermore, C++ source that is compiled into object files is
50 transformed by the compiler: it arranges objects with specific
51 alignment and in a particular layout, mangling names according to a
52 well-defined algorithm, has specific arrangements for the support of
53 virtual functions, etc. These details are defined as the compiler
54 Application Binary Interface, or ABI. The GNU C++ compiler uses an
55 industry-standard C++ ABI starting with version 3. Details can be
56 found in the <a href="http://www.codesourcery.com/cxx-abi/abi.html">
57 ABI specification</a>.
58 </p>
60 <p>
61 The GNU C++ compiler, g++, has a compiler command line option to
62 switch between various different C++ ABIs. This explicit version
63 switch is the flag <code> -fabi-version</code>. In addition, some
64 g++ command line options may change the ABI as a side-effect of
65 use. Such flags include <code>-fpack-struct</code> and
66 <code>-fno-exceptions</code>, but include others: see the complete
67 list in the GCC manual under the heading <a
68 href="http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code%20Gen%20Options">Options
69 for Code Generation Conventions</a>.
70 </p>
72 <p> The configure options used when building a specific libstdc++
73 version may also impact the resulting library ABI. The available
74 configure options, and their impact on the library ABI, are documented
75 <a href="http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html">
76 here</a>.
77 </p>
79 <p> Putting all of these ideas together results in the C++ Standard
80 library ABI, which is the compilation of a given library API by a
81 given compiler ABI. In a nutshell:
82 </p>
84 <code> library API + compiler ABI = library ABI</code>
86 <p>
87 The library ABI is mostly of interest for end-users who have
88 unresolved symbols and are linking dynamically to the C++ Standard
89 library, and who thus must be careful to compile their application
90 with a compiler that is compatible with the available C++ Standard
91 library binary. In this case, compatible is defined with the equation
92 above: given an application compiled with a given compiler ABI and
93 library API, it will work correctly with a Standard C++ Library
94 created with the same constraints.
95 </p>
97 <p>
98 To use a specific version of the C++ ABI, one must use a
99 corresponding GNU C++ toolchain (Ie, g++ and libstdc++) that
100 implements the C++ ABI in question.
101 </p>
103 <h3 class="left">
104 <a name="ABI_versioning">Versioning</a>
105 </h3>
107 <p> The C++ interface has evolved throughout the history of the GNU
108 C++ toolchain. With each release, various details have been changed so
109 as to give distinct versions to the C++ interface.
110 </p>
112 <h5 class="left">
113 <a name="goals">Goals of versioning</a>
114 </h5>
116 <p>Extending existing, stable ABIs. Versioning gives subsequent stable
117 releases series libraries the ability to add new symbols and add
118 functionality, all the while retaining backwards compatibility with
119 the previous releases in the series. Note: the reverse is not true. It
120 is not possible to take binaries linked with the latest version of a
121 release series (if symbols have been added) and expect the initial
122 release of the series to remain link compatible.
123 </p>
125 <p>Allows multiple, incompatible ABIs to coexist at the same time.
126 </p>
129 </p>
131 <h5 class="left">
132 <a name="details"> Version History </a>
133 </h5>
135 How can this complexity be managed? What does C++ versioning mean?
136 Because library and compiler changes often make binaries compiled
137 with one version of the GNU tools incompatible with binaries
138 compiled with other (either newer or older) versions of the same GNU
139 tools, specific techniques are used to make managing this complexity
140 easier.
141 </p>
144 The following techniques are used:
145 </p>
147 <ul>
149 <li> <p>Release versioning on the libgcc_s.so binary. This is
150 implemented via file names and the ELF DT_SONAME mechanism (at least
151 on ELF systems).</p>
153 <p>It is versioned as follows:
154 </p>
155 <ul>
156 <li>gcc-3.0.0: libgcc_s.so.1</li>
157 <li>gcc-3.0.1: libgcc_s.so.1</li>
158 <li>gcc-3.0.2: libgcc_s.so.1</li>
159 <li>gcc-3.0.3: libgcc_s.so.1</li>
160 <li>gcc-3.0.4: libgcc_s.so.1</li>
161 <li>gcc-3.1.0: libgcc_s.so.1</li>
162 <li>gcc-3.1.1: libgcc_s.so.1</li>
163 <li>gcc-3.2.0: libgcc_s.so.1</li>
164 <li>gcc-3.2.1: libgcc_s.so.1</li>
165 <li>gcc-3.2.2: libgcc_s.so.1</li>
166 <li>gcc-3.2.3: libgcc_s.so.1</li>
167 <li>gcc-3.3.0: libgcc_s.so.1</li>
168 <li>gcc-3.3.1: libgcc_s.so.1</li>
169 <li>gcc-3.3.2: libgcc_s.so.1</li>
170 <li>gcc-3.3.3: libgcc_s.so.1</li>
171 <li>gcc-3.4.0: on m68k-linux and hppa-linux this is either libgcc_s.so.1
172 (when configuring <code>--with-sjlj-exceptions</code>) or
173 libgcc_s.so.2. For all others, this is libgcc_s.so.1.
174 </li>
175 </ul>
176 <p></p>
177 </li>
179 <li>Release versioning on the libstdc++.so binary, implemented in the same was as the libgcc_s.so binary, above.
181 <p>It is versioned as follows:
182 </p>
183 <ul>
184 <li>gcc-3.0.0: libstdc++.so.3.0.0</li>
185 <li>gcc-3.0.1: libstdc++.so.3.0.1</li>
186 <li>gcc-3.0.2: libstdc++.so.3.0.2</li>
187 <li>gcc-3.0.3: libstdc++.so.3.0.2 (Error should be libstdc++.so.3.0.3)</li>
188 <li>gcc-3.0.4: libstdc++.so.3.0.4</li>
189 <li>gcc-3.1.0: libstdc++.so.4.0.0</li>
190 <li>gcc-3.1.1: libstdc++.so.4.0.1</li>
191 <li>gcc-3.2.0: libstdc++.so.5.0.0</li>
192 <li>gcc-3.2.1: libstdc++.so.5.0.1</li>
193 <li>gcc-3.2.2: libstdc++.so.5.0.2</li>
194 <li>gcc-3.2.3: libstdc++.so.5.0.3 (Not strictly required)</li>
195 <li>gcc-3.3.0: libstdc++.so.5.0.4</li>
196 <li>gcc-3.3.1: libstdc++.so.5.0.5</li>
197 <li>gcc-3.3.2: libstdc++.so.5.0.5</li>
198 <li>gcc-3.3.3: libstdc++.so.5.0.5</li>
199 <li>gcc-3.4.0: libstdc++.so.6.0.0</li>
200 <li>gcc-3.4.1: libstdc++.so.6.0.1</li>
201 </ul>
202 <p></p>
203 </li>
205 <li>Symbol versioning on the libgcc_s.so binary.
206 <p>mapfile: gcc/libgcc-std.ver</p>
208 <p>It is versioned with the following labels and version definitions:</p>
209 <ul>
210 <li>gcc-3.0.0: GCC_3.0</li>
211 <li>gcc-3.0.1: GCC_3.0</li>
212 <li>gcc-3.0.2: GCC_3.0</li>
213 <li>gcc-3.0.3: GCC_3.0</li>
214 <li>gcc-3.0.4: GCC_3.0</li>
215 <li>gcc-3.1.0: GCC_3.0</li>
216 <li>gcc-3.1.1: GCC_3.0</li>
217 <li>gcc-3.2.0: GCC_3.0</li>
218 <li>gcc-3.2.1: GCC_3.0</li>
219 <li>gcc-3.2.2: GCC_3.0</li>
220 <li>gcc-3.2.3: GCC_3.0</li>
221 <li>gcc-3.3.0: GCC_3.0</li>
222 <li>gcc-3.3.1: GCC_3.0</li>
223 <li>gcc-3.3.2: GCC_3.0</li>
224 <li>gcc-3.3.3: GCC_3.0</li>
225 <li>gcc-3.4.0: GCC_3.0</li>
226 </ul>
227 <p></p>
228 </li>
230 <li>Symbol versioning on the libstdc++.so binary.
232 <p>mapfile: libstdc++-v3/config/linker-map.gnu</p>
233 <p>It is versioned with the following labels and version
234 definitions, where the version definition is the maximum for a
235 particular release. Note, only symbol which are newly introduced
236 will use the maximum version definition. Thus, for release series
237 with the same label, but incremented version definitions, the later
238 release has both versions. (An example of this would be the
239 gcc-3.2.1 release, which has GLIBCPP_3.2.1 for new symbols and
240 GLIBCPP_3.2 for symbols that were introduced in the gcc-3.2.0
241 release.)
242 </p>
243 <ul>
244 <li>gcc-3.0.0: (Error, not versioned)</li>
245 <li>gcc-3.0.1: (Error, not versioned)</li>
246 <li>gcc-3.0.2: (Error, not versioned)</li>
247 <li>gcc-3.0.3: (Error, not versioned)</li>
248 <li>gcc-3.0.4: (Error, not versioned)</li>
249 <li>gcc-3.1.0: GLIBCPP_3.1, CXXABI_1</li>
250 <li>gcc-3.1.1: GLIBCPP_3.1, CXXABI_1</li>
251 <li>gcc-3.2.0: GLIBCPP_3.2, CXXABI_1.2</li>
252 <li>gcc-3.2.1: GLIBCPP_3.2.1, CXXABI_1.2</li>
253 <li>gcc-3.2.2: GLIBCPP_3.2.2, CXXABI_1.2</li>
254 <li>gcc-3.2.3: GLIBCPP_3.2.2, CXXABI_1.2</li>
255 <li>gcc-3.3.0: GLIBCPP_3.2.2, CXXABI_1.2.1</li>
256 <li>gcc-3.3.1: GLIBCPP_3.2.3, CXXABI_1.2.1</li>
257 <li>gcc-3.3.2: GLIBCPP_3.2.3, CXXABI_1.2.1</li>
258 <li>gcc-3.3.3: GLIBCPP_3.2.3, CXXABI_1.2.1</li>
259 <li>gcc-3.4.0: GLIBCXX_3.4, CXXABI_1.3</li>
260 <li>gcc-3.4.1: GLIBCXX_3.4.1, CXXABI_1.3</li>
261 </ul>
262 <p></p>
263 </li>
265 <li>
266 <p>Incremental bumping of a compiler pre-defined macro,
267 __GXX_ABI_VERSION. This macro is defined as the version of the
268 compiler v3 ABI, with g++ 3.0.x being version 100. This macro will
269 be automatically defined whenever g++ is used (the curious can
270 test this by invoking g++ with the '-v' flag.)
271 </p>
274 This macro was defined in the file "lang-specs.h" in the gcc/cp directory.
275 Later versions defined it in "c-common.c" in the gcc directory, and from
276 G++ 3.4 it is defined in c-cppbuiltin.c and its value determined by the
277 '-fabi-version' command line option.
278 </p>
281 It is versioned as follows, where 'n' is given by '-fabi-version=n':
282 </p>
283 <ul>
284 <li>gcc-3.0.x: 100</li>
285 <li>gcc-3.1.x: 100 (Error, should be 101)</li>
286 <li>gcc-3.2.x: 102</li>
287 <li>gcc-3.3.x: 102</li>
288 <li>gcc-3.4.x: 102 (when n=1)</li>
289 <li>gcc-3.4.x: 1000 + n (when n&gt;1)</li>
290 <li>gcc-3.4.x: 999999 (when n=0)</li>
291 </ul>
292 <p></p>
293 </li>
295 <li>
296 <p>Changes to the default compiler option for
297 <code>-fabi-version</code>.
298 </p>
300 It is versioned as follows:
301 </p>
302 <ul>
303 <li>gcc-3.0.x: (Error, not versioned) </li>
304 <li>gcc-3.1.x: (Error, not versioned) </li>
305 <li>gcc-3.2.x: <code>-fabi-version=1</code></li>
306 <li>gcc-3.3.x: <code>-fabi-version=1</code></li>
307 <li>gcc-3.4.x: <code>-fabi-version=2</code></li>
308 </ul>
309 <p></p>
310 </li>
312 <li>
313 <p>Incremental bumping of a library pre-defined macro. For releases
314 before 3.4.0, the macro is __GLIBCPP__. For later releases, it's
315 __GLIBCXX__. (The libstdc++ project generously changed from CPP to
316 CXX throughout its source to allow the "C" pre-processor the CPP
317 macro namespace.) These macros are defined as the date the library
318 was released, in compressed ISO date format, as an unsigned long.
319 </p>
322 In addition, the pre-defined macro is defined in the file
323 "c++config" in the "libstdc++-v3/include/bits" directory and is
324 changed every night by an automated script.
325 </p>
327 It is versioned as follows:
328 </p>
329 <ul>
330 <li>gcc-3.0.0: 20010615</li>
331 <li>gcc-3.0.1: 20010819</li>
332 <li>gcc-3.0.2: 20011023</li>
333 <li>gcc-3.0.3: 20011220</li>
334 <li>gcc-3.0.4: 20020220</li>
335 <li>gcc-3.1.0: 20020514</li>
336 <li>gcc-3.1.1: 20020725</li>
337 <li>gcc-3.2.0: 20020814</li>
338 <li>gcc-3.2.1: 20021119</li>
339 <li>gcc-3.2.2: 20030205</li>
340 <li>gcc-3.2.3: 20030422</li>
341 <li>gcc-3.3.0: 20030513</li>
342 <li>gcc-3.3.1: 20030804</li>
343 <li>gcc-3.3.2: 20031016</li>
344 <li>gcc-3.3.3: 20040214</li>
345 <li>gcc-3.4.0: 20040419</li>
346 <li>gcc-3.4.1: 20040701</li>
347 </ul>
348 <p></p>
349 </li>
352 <li>
354 Incremental bumping of a library pre-defined macro,
355 _GLIBCPP_VERSION. This macro is defined as the released version of
356 the library, as a string literal. This is only implemented in
357 gcc-3.1.0 releases and higher, and is deprecated in 3.4 (where it
358 is called _GLIBCXX_VERSION).
359 </p>
362 This macro is defined in the file "c++config" in the
363 "libstdc++-v3/include/bits" directory and is generated
364 automatically by autoconf as part of the configure-time generation
365 of config.h.
366 </p>
369 It is versioned as follows:
370 </p>
371 <ul>
372 <li>gcc-3.0.0: "3.0.0"</li>
373 <li>gcc-3.0.1: "3.0.0" (Error, should be "3.0.1")</li>
374 <li>gcc-3.0.2: "3.0.0" (Error, should be "3.0.2")</li>
375 <li>gcc-3.0.3: "3.0.0" (Error, should be "3.0.3")</li>
376 <li>gcc-3.0.4: "3.0.0" (Error, should be "3.0.4")</li>
377 <li>gcc-3.1.0: "3.1.0"</li>
378 <li>gcc-3.1.1: "3.1.1"</li>
379 <li>gcc-3.2.0: "3.2"</li>
380 <li>gcc-3.2.1: "3.2.1"</li>
381 <li>gcc-3.2.2: "3.2.2"</li>
382 <li>gcc-3.2.3: "3.2.3"</li>
383 <li>gcc-3.3.0: "3.3"</li>
384 <li>gcc-3.3.1: "3.3.1"</li>
385 <li>gcc-3.3.2: "3.3.2"</li>
386 <li>gcc-3.3.3: "3.3.3"</li>
387 <li>gcc-3.4.0: "version-unused"</li>
388 <li>gcc-3.4.1: "version-unused"</li>
389 </ul>
390 <p></p>
391 </li>
393 <li>
395 Matching each specific C++ compiler release to a specific set of
396 C++ include files. This is only implemented in gcc-3.1.1 releases
397 and higher.
398 </p>
400 All C++ includes are installed in include/c++, then nest in a
401 directory hierarchy corresponding to the C++ compiler's released
402 version. This version corresponds to the variable "gcc_version" in
403 "libstdc++-v3/acinclude.m4," and more details can be found in that
404 file's macro GLIBCXX_CONFIGURE (GLIBCPP_CONFIGURE before gcc-3.4.0).
405 </p>
407 C++ includes are versioned as follows:
408 </p>
409 <ul>
410 <li>gcc-3.0.0: include/g++-v3</li>
411 <li>gcc-3.0.1: include/g++-v3</li>
412 <li>gcc-3.0.2: include/g++-v3</li>
413 <li>gcc-3.0.3: include/g++-v3</li>
414 <li>gcc-3.0.4: include/g++-v3</li>
415 <li>gcc-3.1.0: include/g++-v3</li>
416 <li>gcc-3.1.1: include/c++/3.1.1</li>
417 <li>gcc-3.2.0: include/c++/3.2</li>
418 <li>gcc-3.2.1: include/c++/3.2.1</li>
419 <li>gcc-3.2.2: include/c++/3.2.2</li>
420 <li>gcc-3.2.3: include/c++/3.2.3</li>
421 <li>gcc-3.3.0: include/c++/3.3</li>
422 <li>gcc-3.3.1: include/c++/3.3.1</li>
423 <li>gcc-3.3.2: include/c++/3.3.2</li>
424 <li>gcc-3.3.3: include/c++/3.3.3</li>
425 <li>gcc-3.4.0: include/c++/3.4.0</li>
426 <li>gcc-3.4.1: include/c++/3.4.1</li>
427 </ul>
428 <p></p>
429 </li>
430 </ul>
432 Taken together, these techniques can accurately specify interface
433 and implementation changes in the GNU C++ tools themselves. Used
434 properly, they allow both the GNU C++ tools implementation, and
435 programs using them, an evolving yet controlled development that
436 maintains backward compatibility.
437 </p>
441 <h5 class="left">
442 <a name="requirements"> Minimum requirements for a versioned ABI </a>
443 </h5>
445 Minimum environment that supports a versioned ABI: A supported
446 dynamic linker, a GNU linker of sufficient vintage to understand
447 demangled C++ name globbing (ld), a shared executable compiled with
448 g++, and shared libraries (libgcc_s, libstdc++-v3) compiled by a
449 compiler (g++) with a compatible ABI. Phew.
450 </p>
453 On top of all that, an additional constraint: libstdc++ did not
454 attempt to version symbols (or age gracefully, really) until version
455 3.1.0.
456 </p>
459 Most modern Linux and BSD versions, particularly ones using
460 gcc-3.1.x tools and more recent vintages, will meet the requirements above.
461 </p>
464 <h5 class="left">
465 <a name="config"> What configure options impact symbol versioning? </a>
466 </h5>
468 It turns out that most of the configure options that change default
469 behavior will impact the mangled names of exported symbols, and thus
470 impact versioning and compatibility.
471 </p>
474 For more information on configure options, including ABI impacts, see:
475 http://gcc.gnu.org/onlinedocs/libstdc++/configopts.html
476 </p>
479 There is one flag that explicitly deals with symbol versioning:
480 --enable-symvers.
481 </p>
484 In particular, libstdc++-v3/acinclude.m4 has a macro called
485 GLIBCXX_ENABLE_SYMVERS that defaults to yes (or the argument passed
486 in via --enable-symvers=foo). At that point, the macro attempts to
487 make sure that all the requirement for symbol versioning are in
488 place. For more information, please consult acinclude.m4.
489 </p>
492 <h5 class="left">
493 <a name="active"> How to tell if symbol versioning is, indeed, active? </a>
494 </h5>
496 When the GNU C++ library is being built with symbol versioning on,
497 you should see the following at configure time for libstdc++-v3:
498 </p>
501 <code> checking versioning on shared library symbols... gnu</code>
504 If you don't see this line in the configure output, or if this line
505 appears but the last word is 'no', then you are out of luck.
506 </p>
509 If the compiler is pre-installed, a quick way to test is to compile
510 the following (or any) simple C++ file and link it to the shared
511 libstdc++ library:
512 </p>
514 <pre>
515 #include &lt;iostream&gt;
517 int main()
518 { std::cout &lt;&lt; "hello" &lt;&lt; std::endl; return 0; }
520 %g++ hello.cc -o hello.out
522 %ldd hello.out
523 libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x00764000)
524 libm.so.6 =&gt; /lib/tls/libm.so.6 (0x004a8000)
525 libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40016000)
526 libc.so.6 =&gt; /lib/tls/libc.so.6 (0x0036d000)
527 /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
529 %nm hello.out
530 </pre>
533 If you see symbols in the resulting output with "GLIBCXX_3" as part
534 of the name, then the executable is versioned. Here's an example:
535 </p>
537 <code> U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4 </code>
539 <h3 class="left">
540 <a name="ABI_allowed">Library allowed ABI changes</a>
541 </h3>
543 The following will cause the library minor version number to
544 increase, say from "libstdc++.so.3.0.4" to "libstdc++.so.3.0.5".
545 </p>
546 <ul>
547 <li>adding an exported global or static data member</li>
548 <li>adding an exported function, static or non-virtual member function</li>
549 <li>adding an exported symbol or symbols by additional instantiations</li>
550 </ul>
552 </p>
554 Other allowed changes are possible.
555 </p>
558 <h3 class="left">
559 <a name="ABI_disallowed">Library disallowed ABI changes</a>
560 </h3>
563 The following non-exhaustive list will cause the library major version
564 number to increase, say from "libstdc++.so.3.0.4" to
565 "libstdc++.so.4.0.0".
566 </p>
567 <ul>
568 <li>changes in the gcc/g++ compiler ABI</li>
569 <li>changing size of an exported symbol</li>
570 <li>changing alignment of an exported symbol</li>
571 <li>changing the layout of an exported symbol</li>
572 <li>changing mangling on an exported symbol</li>
573 <li>deleting an exported symbol</li>
574 <li>changing the inheritance properties of a type by adding or removing
575 base classes</li>
576 <li>
577 changing the size, alignment, or layout of types
578 specified in the C++ standard. These may not necessarily be
579 instantiated or otherwise exported in the library binary, and
580 include all the required locale facets, as well as things like
581 std::basic_streambuf, et al.
582 </li>
584 <li> adding an explicit copy constructor or destructor to a
585 class that would otherwise have implicit versions. This will change
586 the way the compiler deals with this class in by-value return
587 statements or parameters: instead of being passing instances of this
588 class in registers, the compiler will be forced to use memory. See <a
589 href="http://www.codesourcery.com/cxx-abi/abi.html#calls"> this part</a>
590 of the C++ ABI documentation for further details.
591 </li>
593 </ul>
595 <h3 class="left">
596 <a name="implementation">Library implementation strategy</a> </h3>
598 <ul>
599 <li>Separation of interface and implementation
600 <p>This is accomplished by two techniques that separate the API from
601 the ABI: forcing undefined references to link against a library binary
602 for definitions.
603 </p>
605 <dl>
606 <dt>Include files have declarations, source files have defines</dt>
608 <dd> For non-templatized types, such as much of <code>class
609 locale</code>, the appropriate standard C++ include, say
610 <code>locale</code>, can contain full declarations, while various
611 source files (say <code> locale.cc, locale_init.cc,
612 localename.cc</code>) contain definitions.</dd>
614 <dt>Extern template on required types</dt>
616 <dd>For parts of the standard that have an explicit list of required
617 instantiations, the GNU extension syntax <code> extern template
618 </code> can be used to control where template definitions
619 reside. By marking required instantiations as <code> extern
620 template </code> in include files, and providing explicit
621 instantiations in the appropriate instantiation files, non-inlined
622 template functions can be versioned. This technique is mostly used
623 on parts of the standard that require <code> char</code> and <code>
624 wchar_t</code> instantiations, and includes <code>
625 basic_string</code>, the locale facets, and the types in <code>
626 iostreams</code>.</dd>
628 </dl>
629 <p> In addition, these techniques have the additional benefit that
630 they reduce binary size, which can increase runtime performance.
631 </p>
632 </li>
634 <li>Namespaces linking symbol definitions to export mapfiles
636 <p>All symbols in the shared library binary are processed by a linker
637 script at build time that either allows or disallows external
638 linkage. Because of this, some symbols, regardless of normal C/C++
639 linkage, are not visible. Symbols that are internal have several
640 appealing characteristics: by not exporting the symbols, there are no
641 relocations when the shared library is started and thus this makes for
642 faster runtime loading performance by the underlying dynamic loading
643 mechanism. In addition, they have the possibility of changing without
644 impacting ABI compatibility.
645 </p>
647 <p>The following namespaces are transformed by the mapfile:</p>
649 <dl>
650 <dt><code>namespace std</code></dt>
651 <dd> Defaults to exporting all symbols in label
652 <code>GLIBCXX</code> that do not begin with an underscore, ie
653 <code>__test_func</code> would not be exported by default. Select
654 exceptional symbols are allowed to be visible.</dd>
656 <dt><code>namespace __gnu_cxx</code></dt>
657 <dd> Defaults to not exporting any symbols in label
658 <code>GLIBCXX</code>, select items are allowed to be visible.</dd>
660 <dt><code>namespace __gnu_internal</code></dt>
661 <dd> Defaults to not exported, no items are allowed to be visible.</dd>
663 <dt><code>namespace __cxxabiv1</code>, aliased to <code> namespace abi</code></dt>
664 <dd> Defaults to not exporting any symbols in label
665 <code>CXXABI</code>, select items are allowed to be visible.</dd>
666 </dl>
668 </p>
669 </li>
671 <li>Freezing the API
672 <p>Disallowed changes, as above, are not made on a stable release
673 branch. Enforcement tends to be less strict with GNU extensions that
674 standard includes.</p>
675 </li>
676 </ul>
678 <h3 class="left">
679 <a name="ABI_testing">Testing ABI changes</a>
680 </h3>
683 Testing for GNU C++ ABI changes is composed of two distinct areas:
684 testing the C++ compiler (g++) for compiler changes, and testing the
685 C++ library (libstdc++) for library changes.
686 </p>
689 Testing the C++ compiler ABI can be done various ways.
690 </p>
693 One.
694 Intel ABI checker. More information can be obtained
695 <a href="http://developer.intel.com/software/products/opensource/">here.</a>
696 </p>
699 Two.
700 The second is yet unreleased, but has been announced on the gcc
701 mailing list. It is yet unspecified if these tools will be freely
702 available, and able to be included in a GNU project. Please contact
703 Mark Mitchell (mark@codesourcery.com) for more details, and current
704 status.
705 </p>
708 Three.
709 Involves using the vlad.consistency test framework. This has also been
710 discussed on the gcc mailing lists.
711 </p>
714 Testing the C++ library ABI can also be done various ways.
715 </p>
718 One.
719 (Brendan Kehoe, Jeff Law suggestion to run 'make check-c++' two ways,
720 one with a new compiler and an old library, and the other with an old
721 compiler and a new library, and look for testsuite regressions)
722 </p>
725 Details on how to set this kind of test up can be found here:
726 http://gcc.gnu.org/ml/gcc/2002-08/msg00142.html
727 </p>
730 Two.
731 Use the 'make check-abi' rule in the libstdc++-v3 Makefile.
732 </p>
735 This is a proactive check the library ABI. Currently, exported symbol
736 names that are either weak or defined are checked against a last known
737 good baseline. Currently, this baseline is keyed off of 3.4.0
738 binaries, as this was the last time the .so number was incremented. In
739 addition, all exported names are demangled, and the exported objects
740 are checked to make sure they are the same size as the same object in
741 the baseline.
743 Notice that each baseline is relative to a <strong>default</strong>
744 configured library and compiler: in particular, if options such as
745 --enable-clocale, or --with-cpu, in case of multilibs, are used at
746 configure time, the check may fail, either because of substantive
747 differences or because of limitations of the current checking
748 machinery.
749 </p>
752 This dataset is insufficient, yet a start. Also needed is a
753 comprehensive check for all user-visible types part of the standard
754 library for sizeof() and alignof() changes.
755 </p>
758 Verifying compatible layouts of objects is not even attempted. It
759 should be possible to use sizeof, alignof, and offsetof to compute
760 offsets for each structure and type in the standard library, saving to
761 another datafile. Then, compute this in a similar way for new
762 binaries, and look for differences.
763 </p>
766 Another approach might be to use the -fdump-class-hierarchy flag to
767 get information. However, currently this approach gives insufficient
768 data for use in library testing, as class data members, their offsets,
769 and other detailed data is not displayed with this flag.
770 (See g++/7470 on how this was used to find bugs.)
771 </p>
774 Perhaps there are other C++ ABI checkers. If so, please notify
775 us. We'd like to know about them!
776 </p>
778 <h3 class="left">
779 <a name="ABI_multi_testing">Testing Multi-ABI binaries</a>
780 </h3>
783 A "C" application, dynamically linked to two shared libraries, liba,
784 libb. The dependent library liba is C++ shared library compiled with
785 gcc-3.3.x, and uses io, exceptions, locale, etc. The dependent library
786 libb is a C++ shared library compiled with gcc-3.4.x, and also uses io,
787 exceptions, locale, etc.
788 </p>
790 <p> As above, libone is constructed as follows: </p>
791 <pre>
792 %$bld/H-x86-gcc-3.4.0/bin/g++ -fPIC -DPIC -c a.cc
794 %$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
796 %ln -s libone.so.1.0.0 libone.so
798 %$bld/H-x86-gcc-3.4.0/bin/g++ -c a.cc
800 %ar cru libone.a a.o
801 </pre>
803 <p> And, libtwo is constructed as follows: </p>
805 <pre>
806 %$bld/H-x86-gcc-3.3.3/bin/g++ -fPIC -DPIC -c b.cc
808 %$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
810 %ln -s libtwo.so.1.0.0 libtwo.so
812 %$bld/H-x86-gcc-3.3.3/bin/g++ -c b.cc
814 %ar cru libtwo.a b.o
815 </pre>
817 <p> ...with the resulting libraries looking like </p>
818 <pre>
819 %ldd libone.so.1.0.0
820 libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0x40016000)
821 libm.so.6 =&gt; /lib/tls/libm.so.6 (0x400fa000)
822 libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x4011c000)
823 libc.so.6 =&gt; /lib/tls/libc.so.6 (0x40125000)
824 /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
826 %ldd libtwo.so.1.0.0
827 libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x40027000)
828 libm.so.6 =&gt; /lib/tls/libm.so.6 (0x400e1000)
829 libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40103000)
830 libc.so.6 =&gt; /lib/tls/libc.so.6 (0x4010c000)
831 /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
833 </pre>
835 <p> Then, the "C" compiler is used to compile a source file that uses
836 functions from each library.</p>
837 <pre>
838 gcc test.c -g -O2 -L. -lone -ltwo /usr/lib/libstdc++.so.5 /usr/lib/libstdc++.so.6
839 </pre>
842 Which gives the expected:
843 </p>
844 <pre>
845 %ldd a.out
846 libstdc++.so.5 =&gt; /usr/lib/libstdc++.so.5 (0x00764000)
847 libstdc++.so.6 =&gt; /usr/lib/libstdc++.so.6 (0x40015000)
848 libc.so.6 =&gt; /lib/tls/libc.so.6 (0x0036d000)
849 libm.so.6 =&gt; /lib/tls/libm.so.6 (0x004a8000)
850 libgcc_s.so.1 =&gt; /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x400e5000)
851 /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x00355000)
852 </pre>
855 This resulting binary, when executed, will be able to safely use code
856 from both liba, and the dependent libstdc++.so.6, and libb, with the
857 dependent libstdc++.so.5.
858 </p>
860 <h3 class="left">
861 <a name="references">Bibliography / Further Reading</a>
862 </h3>
865 ABIcheck, a vague idea of checking ABI compatibility
866 <br />
867 <a href="http://abicheck.sourceforge.net/">http://abicheck.sourceforge.net/</a>
868 </p>
871 C++ ABI reference
872 <br />
873 <a href="http://www.codesourcery.com/cxx-abi/">http://www.codesourcery.com/cxx-abi/</a>
874 </p>
877 Intel ABI documentation, "IntelĀ® Compilers for Linux* -Compatibility with the GNU Compilers"
878 <br />
879 <a href="http://developer.intel.com/software/products/compilers/techtopics/LinuxCompilersCompatibility.htm">http://developer.intel.com/software/products/compilers/techtopics/LinuxCompilersCompatibility.htm</a>
880 </p>
883 Sun Solaris 2.9 docs
884 <br />
885 Linker and Libraries Guide (document 816-1386)
886 <br />
887 C++ Migration Guide (document 816-2459)
888 <br />
889 <a href="http://docs.sun.com/db/prod/solaris.9">http://docs.sun.com/db/prod/solaris.9</a>
890 <br />
891 <a href="http://docs.sun.com/?p=/doc/816-1386&amp;a=load">http://docs.sun.com/?p=/doc/816-1386&amp;a=load</a>
892 </p>
895 Ulrich Drepper, "ELF Symbol Versioning"
896 <br />
897 <a href="http://people.redhat.com/drepper/symbol-versioning">http://people.redhat.com/drepper/symbol-versioning</a>
898 </p>
900 </body>
901 </html>