2014-10-15 20:32:56 +00:00
|
|
|
.. _abidiff_label:
|
|
|
|
|
2014-09-26 15:02:46 +00:00
|
|
|
=======
|
|
|
|
abidiff
|
|
|
|
=======
|
|
|
|
|
|
|
|
abidiff compares the Application Binary Interfaces (ABI) of two shared
|
|
|
|
libraries in `ELF`_ format. It emits a meaningful report describing the
|
|
|
|
differences between the two ABIs.
|
|
|
|
|
Support comparing symbols not referenced by debug info
* doc/manuals/abidiff.rst: Adjust intro to mention that w/o debug
info, abidiff now works but just report about added/removed
symbols. Add documentation about the new
--no-unreferenced-symbols option.
* include/abg-comparison.h (string_elf_symbol_map): New typedef.
(diff_context::show_symbols_unreferenced_by_debug_info): Declare
new accessors.
* src/abg-comparison.cc
(diff_context::priv::show_syms_unreferenced_by_di_): New data
member.
(diff_context::priv::priv): Adjust.
(diff_context::show_symbols_unreferenced_by_debug_info): Implement
these accessors.
(corpus_diff::priv::{unrefed_fn_syms_edit_script_,
unrefed_var_syms_edit_script_, added_unrefed_fn_syms_,
deleted_unrefed_fn_syms_, added_unrefed_var_syms_,
deleted_unrefed_var_syms_}): New data members.
(corpus_diff::priv::diff_stats::{num_func_syms_removed,
num_func_syms_added, num_var_syms_removed, num_var_syms_added}):
New data members.
(corpus_diff::priv::diff_stats::diff_stats): Adjust.
(corpus_diff::ensure_lookup_tables_populated): Populate lookup
tables for added/removed symbols that are not referenced by any
debug info.
(corpus_diff::priv::apply_filters_and_compute_diff_stats): Compute
stats for the added/removed symbols not referenced by any debug
info.
(corpus_diff::priv::emit_diff_stats): Emit stats about
added/removed symbols that are not referenced by any debug info.
(corpus_diff::length): Adjust to take in account added/removed
symbols not referenced by any debug info.
(show_linkage_name_and_aliases): New static function.
(corpus_diff::report): When emitting a symbol name, emit its
version too, and tell if it aliases other symbols. Avoid emitted
extra new lines. Report added/removed symbols not referenced by
any debug info.
(compute_diff): In the overload for corpus_sptr, compute the diffs
for symbols not referenced by debug info.
* include/abg-corpus.h
(corpus::get_unreferenced_{function,variable}_symbols): Declare
new member functions.
* src/abg-corpus.cc (corpus_priv::{unrefed_fun_symbols,
unrefed_var_symbols}): New data members.
(corpus_priv::build_unreferenced_symbols_tables): Define new
member function.
(struct comp_elf_symbols_functor): New functor.
(corpus::is_empty): Adjust to take in account added/removed
symbols not referenced by debug info.
(corpus::{get_unreferenced_function_symbols,
corpus::get_unreferenced_variable_symbols}): Define these
accessors.
* include/abg-dwarf-reader.h (enum status): Transform this into
bitfields. Add a STATUS_UNKNOWN value that has the value 0.
(operator|(status, status), operator&(status, status))
(operator|=(status&, status), operator&=(status, status)): New
bit-wise operators to manipulate instances of the status bit-field.
* src/abg-dwarf-reader.cc (get_version_for_symbol): Fix this to
avoid returning garbage version sometimes.
(read_debug_info_into_corpus): Fix this to return a non-null but
empty corpus_sptr when there is no debug info available.
(operator|(status, status), operator&(status, status))
(operator|=(status&, status), operator&=(status, status)): Define
these new bitwise operators to manipulate instances of the status
bit-field.
(read_corpus_from_elf): Now that the abigail::dwarf_reader::status
is a bit-field, set it to reflect if debug info and/or symbol
tables have been found. Do not bail out if debug info hasn't been
found. Rather, keep going, and go look for symbols-only; this is
a kind of operating in degraded mode.
* include/abg-ir.h (elf_symbol::get_aliases_id_string): Add a flag
that says if the current instance of elf_symbol should be included
in the list of aliases or not.
* src/abg-ir.cc (elf_symbol::get_aliases_id_string): Define it.
* tests/data/test-diff-dwarf/test16-syms-only-v{0,1}.o: New test
input.
* tools/abidiff.cc
(options::show_symbols_not_referenced_by_debug_info): New data
member.
(options:options): Adjust.
(display_usage): Add an info string for the new
--no-unreferenced-symbols command line option.
(parse_command_line): Parse the new --no-unreferenced-symbols
command line.
(set_diff_context_from_opts): Set the diff_context according to
the presence of --no-unreferenced-symbols.
(main): Adjust for the fact that abigail::dwarf_reader::status is
now a bit-field.
* tools/abilint.cc (main): Adjust for the fact that
abigail::dwarf_reader::status is now a bit-field..
():
* tests/data/test-diff-dwarf/test16-syms-only-report.txt: New test
reference output.
* tests/data/test-diff-dwarf/test16-syms-only-v{0,1}.cc: Source code
for new test input.
* tests/data/test-diff-dwarf/test17-non-refed-syms-v{0,1}.o: New
test input.
* tests/data/test-diff-dwarf/test17-non-refed-syms-v{0,1}.cc: New
source code for test input.
* tests/data/test-diff-dwarf/libtest18-alias-sym-v{0,1}.so: New
test input.
* tests/data/test-diff-dwarf/test18-alias-sym-report-0.txt:
Reference output for new test input.
* tests/data/test-diff-dwarf/test18-alias-sym-v{0,1}.cc: Source
code for new test input.
* tests/data/test-diff-dwarf/test18-alias-sym-version-script:
Source code for new test input.
* tests/Makefile.am: Add the new test materials to the source
distribution.
* tests/test-diff-dwarf.cc(in_out_specs): Add the new input tests
above to the array of tests to run by this harness.
(main): Emit empty reports for empty resulting diffs.
* tests/data/test-diff-dwarf/test{0,8,9,12,14-inline-report,}-report.txt:
Adjust.
* tests/data/test-diff-filter/test{0,01,2,4,5,7,8,9,10,12,13,15-0,15-1}-report.txt:
Likewise.
* tests/data/test-diff-filter/test{19-enum,20-inline,}-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-{1,2}.txt:
Likewise.
* tests/data/test-diff-suppr/test{1,2}-typedef-suppr-report-1.txt:
Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-10-22 16:05:31 +00:00
|
|
|
For a comprehensive ABI change report that includes changes about
|
|
|
|
function and variable sub-types, the two input shared libraries must
|
|
|
|
be accompanied with their debug information in `DWARF`_ format.
|
|
|
|
Otherwise, only `ELF`_ symbols that were added or removed are
|
|
|
|
reported.
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
Invocation
|
|
|
|
==========
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
abidiff [options] <first-shared-library> <second-shared-library>
|
|
|
|
|
|
|
|
Options
|
|
|
|
=======
|
|
|
|
|
|
|
|
* --help
|
|
|
|
|
|
|
|
Displays a short help about the command and exit.
|
|
|
|
|
|
|
|
* --debug-info-dir1 <*di-path1*>
|
|
|
|
|
|
|
|
For cases where the debug information for *first-shared-library*
|
|
|
|
is split out into a separate file, tells ``abidiff`` where to find
|
|
|
|
that separate debug information file.
|
|
|
|
|
|
|
|
Note that *di-path* must point to the root directory under which
|
|
|
|
the debug information is arranged in a tree-like manner. Under
|
|
|
|
Red Hat based systems, that directory is usually
|
|
|
|
``<root>/usr/lib/debug``.
|
|
|
|
|
|
|
|
Note also that this option is not mandatory for split debug
|
|
|
|
information installed by your system's package manager because
|
|
|
|
then ``abidiff`` knows where to find it.
|
|
|
|
|
|
|
|
* --debug-info-dir2 <*di-path2*>
|
|
|
|
|
|
|
|
Like ``--debug-info-dir1``, this options tells ``abidiff`` where
|
|
|
|
to find the split debug information for the
|
|
|
|
*second-shared-library* file.
|
|
|
|
|
|
|
|
* --stat
|
|
|
|
|
|
|
|
Rather than displaying the detailed ABI differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, just display
|
|
|
|
some summary statistics about these differences.
|
|
|
|
|
|
|
|
* --symtabs
|
|
|
|
|
|
|
|
Only display the symbol tables of the *first-shared-library* and
|
|
|
|
*second-shared-library*.
|
|
|
|
|
|
|
|
* --deleted-fns
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the globally defined functions that got deleted from
|
|
|
|
*first-shared-library*.
|
|
|
|
|
|
|
|
* --changed-fns
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the changes in sub-types of the global functions defined in
|
|
|
|
*first-shared-library*.
|
|
|
|
|
|
|
|
* --added-fns
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the globally defined functions that were added to
|
|
|
|
*second-shared-library*.
|
|
|
|
|
|
|
|
* --deleted-vars
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the globally defined variables that were deleted from
|
|
|
|
*first-shared-library*.
|
|
|
|
|
|
|
|
* --changed-vars
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the changes in the sub-types of the global variables defined in
|
|
|
|
*first-shared-library*
|
|
|
|
|
|
|
|
* --added-vars
|
|
|
|
|
|
|
|
In the resulting report about the differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, only display
|
|
|
|
the global variables that were added (defined) to
|
|
|
|
*second-shared-library*.
|
|
|
|
|
|
|
|
* --no-linkage-name
|
|
|
|
|
|
|
|
In the resulting report, do not display the linkage names of
|
|
|
|
the added, removed, or changed functions or variables.
|
|
|
|
|
Support comparing symbols not referenced by debug info
* doc/manuals/abidiff.rst: Adjust intro to mention that w/o debug
info, abidiff now works but just report about added/removed
symbols. Add documentation about the new
--no-unreferenced-symbols option.
* include/abg-comparison.h (string_elf_symbol_map): New typedef.
(diff_context::show_symbols_unreferenced_by_debug_info): Declare
new accessors.
* src/abg-comparison.cc
(diff_context::priv::show_syms_unreferenced_by_di_): New data
member.
(diff_context::priv::priv): Adjust.
(diff_context::show_symbols_unreferenced_by_debug_info): Implement
these accessors.
(corpus_diff::priv::{unrefed_fn_syms_edit_script_,
unrefed_var_syms_edit_script_, added_unrefed_fn_syms_,
deleted_unrefed_fn_syms_, added_unrefed_var_syms_,
deleted_unrefed_var_syms_}): New data members.
(corpus_diff::priv::diff_stats::{num_func_syms_removed,
num_func_syms_added, num_var_syms_removed, num_var_syms_added}):
New data members.
(corpus_diff::priv::diff_stats::diff_stats): Adjust.
(corpus_diff::ensure_lookup_tables_populated): Populate lookup
tables for added/removed symbols that are not referenced by any
debug info.
(corpus_diff::priv::apply_filters_and_compute_diff_stats): Compute
stats for the added/removed symbols not referenced by any debug
info.
(corpus_diff::priv::emit_diff_stats): Emit stats about
added/removed symbols that are not referenced by any debug info.
(corpus_diff::length): Adjust to take in account added/removed
symbols not referenced by any debug info.
(show_linkage_name_and_aliases): New static function.
(corpus_diff::report): When emitting a symbol name, emit its
version too, and tell if it aliases other symbols. Avoid emitted
extra new lines. Report added/removed symbols not referenced by
any debug info.
(compute_diff): In the overload for corpus_sptr, compute the diffs
for symbols not referenced by debug info.
* include/abg-corpus.h
(corpus::get_unreferenced_{function,variable}_symbols): Declare
new member functions.
* src/abg-corpus.cc (corpus_priv::{unrefed_fun_symbols,
unrefed_var_symbols}): New data members.
(corpus_priv::build_unreferenced_symbols_tables): Define new
member function.
(struct comp_elf_symbols_functor): New functor.
(corpus::is_empty): Adjust to take in account added/removed
symbols not referenced by debug info.
(corpus::{get_unreferenced_function_symbols,
corpus::get_unreferenced_variable_symbols}): Define these
accessors.
* include/abg-dwarf-reader.h (enum status): Transform this into
bitfields. Add a STATUS_UNKNOWN value that has the value 0.
(operator|(status, status), operator&(status, status))
(operator|=(status&, status), operator&=(status, status)): New
bit-wise operators to manipulate instances of the status bit-field.
* src/abg-dwarf-reader.cc (get_version_for_symbol): Fix this to
avoid returning garbage version sometimes.
(read_debug_info_into_corpus): Fix this to return a non-null but
empty corpus_sptr when there is no debug info available.
(operator|(status, status), operator&(status, status))
(operator|=(status&, status), operator&=(status, status)): Define
these new bitwise operators to manipulate instances of the status
bit-field.
(read_corpus_from_elf): Now that the abigail::dwarf_reader::status
is a bit-field, set it to reflect if debug info and/or symbol
tables have been found. Do not bail out if debug info hasn't been
found. Rather, keep going, and go look for symbols-only; this is
a kind of operating in degraded mode.
* include/abg-ir.h (elf_symbol::get_aliases_id_string): Add a flag
that says if the current instance of elf_symbol should be included
in the list of aliases or not.
* src/abg-ir.cc (elf_symbol::get_aliases_id_string): Define it.
* tests/data/test-diff-dwarf/test16-syms-only-v{0,1}.o: New test
input.
* tools/abidiff.cc
(options::show_symbols_not_referenced_by_debug_info): New data
member.
(options:options): Adjust.
(display_usage): Add an info string for the new
--no-unreferenced-symbols command line option.
(parse_command_line): Parse the new --no-unreferenced-symbols
command line.
(set_diff_context_from_opts): Set the diff_context according to
the presence of --no-unreferenced-symbols.
(main): Adjust for the fact that abigail::dwarf_reader::status is
now a bit-field.
* tools/abilint.cc (main): Adjust for the fact that
abigail::dwarf_reader::status is now a bit-field..
():
* tests/data/test-diff-dwarf/test16-syms-only-report.txt: New test
reference output.
* tests/data/test-diff-dwarf/test16-syms-only-v{0,1}.cc: Source code
for new test input.
* tests/data/test-diff-dwarf/test17-non-refed-syms-v{0,1}.o: New
test input.
* tests/data/test-diff-dwarf/test17-non-refed-syms-v{0,1}.cc: New
source code for test input.
* tests/data/test-diff-dwarf/libtest18-alias-sym-v{0,1}.so: New
test input.
* tests/data/test-diff-dwarf/test18-alias-sym-report-0.txt:
Reference output for new test input.
* tests/data/test-diff-dwarf/test18-alias-sym-v{0,1}.cc: Source
code for new test input.
* tests/data/test-diff-dwarf/test18-alias-sym-version-script:
Source code for new test input.
* tests/Makefile.am: Add the new test materials to the source
distribution.
* tests/test-diff-dwarf.cc(in_out_specs): Add the new input tests
above to the array of tests to run by this harness.
(main): Emit empty reports for empty resulting diffs.
* tests/data/test-diff-dwarf/test{0,8,9,12,14-inline-report,}-report.txt:
Adjust.
* tests/data/test-diff-filter/test{0,01,2,4,5,7,8,9,10,12,13,15-0,15-1}-report.txt:
Likewise.
* tests/data/test-diff-filter/test{19-enum,20-inline,}-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-{1,2}.txt:
Likewise.
* tests/data/test-diff-suppr/test{1,2}-typedef-suppr-report-1.txt:
Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2014-10-22 16:05:31 +00:00
|
|
|
* --no-unreferenced-symbols
|
|
|
|
|
|
|
|
In the resulting report, do not display change information about
|
|
|
|
function and variable symbols that are not referenced by any debug
|
|
|
|
information. Note that for these symbols not referenced by any
|
|
|
|
debug information, the change information displayed is either
|
|
|
|
added or removed symbols.
|
|
|
|
|
2014-10-15 20:32:56 +00:00
|
|
|
|
|
|
|
* --suppressions <*path-to-suppressions*>
|
|
|
|
|
|
|
|
Use a :ref:`suppression specification <suppr_spec_label>` file located
|
|
|
|
at *path-to-suppressions*.
|
|
|
|
|
2014-09-26 15:02:46 +00:00
|
|
|
* --drop <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, drop the globally defined
|
|
|
|
functions and variables which name match the regular expression
|
|
|
|
*regex*. As a result, no change involving these functions or
|
|
|
|
variables will be emitted in the diff report.
|
|
|
|
|
|
|
|
* --drop-fn <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, drop the globally defined
|
|
|
|
functions which name match the regular expression *regex*. As a
|
|
|
|
result, no change involving these functions will be emitted in the
|
|
|
|
diff report.
|
|
|
|
|
|
|
|
* --drop-fn <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, drop the globally defined
|
|
|
|
functions matching a the regular expression *regex*. As a result,
|
|
|
|
no change involving these functions will be emitted in the diff
|
|
|
|
report.
|
|
|
|
|
|
|
|
* --drop-var <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, drop the globally defined
|
|
|
|
variables matching a the regular expression *regex*.
|
|
|
|
|
|
|
|
* --keep <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, keep the globally defined
|
|
|
|
functions and variables which names match the regular expression
|
|
|
|
*regex*. All other functions and variables are dropped on the
|
|
|
|
floor and will thus not appear in the resulting diff report.
|
|
|
|
|
|
|
|
* --keep-fn <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, keep the globally defined
|
|
|
|
functions which name match the regular expression *regex*. All
|
|
|
|
other functions are dropped on the floor and will thus not appear
|
|
|
|
in the resulting diff report.
|
|
|
|
|
|
|
|
* --keep-var <*regex*>
|
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, keep the globally defined
|
|
|
|
which names match the regular expression *regex*. All other
|
|
|
|
variables are dropped on the floor and will thus not appear in the
|
|
|
|
resulting diff report.
|
|
|
|
|
|
|
|
* --harmless
|
|
|
|
|
2014-10-15 20:32:56 +00:00
|
|
|
In the diff report, display only the :ref:`harmless
|
|
|
|
<harmlesschangeconcept_label>` changes. By default, the harmless
|
|
|
|
changes are filtered out of the diff report keep the clutter to a
|
|
|
|
minimum and have a greater change to spot real ABI issues.
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
* --no-harmful
|
|
|
|
|
2014-10-15 20:32:56 +00:00
|
|
|
In the diff report, do not display the :ref:`harmful
|
|
|
|
<harmfulchangeconcept_label>` changes. By default, only the
|
|
|
|
harmful changes are displayed in diff report.
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
* --redundant
|
|
|
|
|
|
|
|
In the diff report, do not display redundant changes. A redundant
|
|
|
|
change is a change that has been displayed elsewhere in the report.
|
|
|
|
|
2014-11-03 14:35:17 +00:00
|
|
|
Usage examples
|
|
|
|
==============
|
|
|
|
|
|
|
|
1. Detecting a change in a sub-type of a function: ::
|
|
|
|
|
|
|
|
$ cat -n test-v0.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
3
|
|
|
|
4 struct S0
|
|
|
|
5 {
|
|
|
|
6 int m0;
|
|
|
|
7 };
|
|
|
|
8
|
|
|
|
9 void
|
|
|
|
10 foo(S0* /*parameter_name*/)
|
|
|
|
11 {
|
|
|
|
12 // do something with parameter_name.
|
|
|
|
13 }
|
|
|
|
$
|
|
|
|
$ cat -n test-v1.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
3
|
|
|
|
4 struct type_base
|
|
|
|
5 {
|
|
|
|
6 int inserted;
|
|
|
|
7 };
|
|
|
|
8
|
|
|
|
9 struct S0 : public type_base
|
|
|
|
10 {
|
|
|
|
11 int m0;
|
|
|
|
12 };
|
|
|
|
13
|
|
|
|
14 void
|
|
|
|
15 foo(S0* /*parameter_name*/)
|
|
|
|
16 {
|
|
|
|
17 // do something with parameter_name.
|
|
|
|
18 }
|
|
|
|
$
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
$
|
|
|
|
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
|
|
|
|
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
|
|
|
|
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
|
|
|
|
|
|
|
|
1 function with some indirect sub-type change:
|
|
|
|
|
|
|
|
[C]'function void foo(S0*)' has some indirect sub-type changes:
|
|
|
|
parameter 0 of type 'S0*' has sub-type changes:
|
|
|
|
in pointed to type 'struct S0':
|
|
|
|
size changed from 32 to 64 bits
|
|
|
|
1 base class insertion:
|
|
|
|
struct type_base
|
|
|
|
1 data member change:
|
|
|
|
'int S0::m0' offset changed from 0 to 32
|
|
|
|
$
|
|
|
|
|
|
|
|
|
|
|
|
2. Detecting another change in a sub-type of a function: ::
|
|
|
|
|
|
|
|
$ cat -n test-v0.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
3
|
|
|
|
4 struct S0
|
|
|
|
5 {
|
|
|
|
6 int m0;
|
|
|
|
7 };
|
|
|
|
8
|
|
|
|
9 void
|
|
|
|
10 foo(S0& /*parameter_name*/)
|
|
|
|
11 {
|
|
|
|
12 // do something with parameter_name.
|
|
|
|
13 }
|
|
|
|
$
|
|
|
|
$ cat -n test-v1.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
3
|
|
|
|
4 struct S0
|
|
|
|
5 {
|
|
|
|
6 char inserted_member;
|
|
|
|
7 int m0;
|
|
|
|
8 };
|
|
|
|
9
|
|
|
|
10 void
|
|
|
|
11 foo(S0& /*parameter_name*/)
|
|
|
|
12 {
|
|
|
|
13 // do something with parameter_name.
|
|
|
|
14 }
|
|
|
|
$
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
$
|
|
|
|
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
|
|
|
|
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
|
|
|
|
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
|
|
|
|
|
|
|
|
1 function with some indirect sub-type change:
|
|
|
|
|
|
|
|
[C]'function void foo(S0&)' has some indirect sub-type changes:
|
|
|
|
parameter 0 of type 'S0&' has sub-type changes:
|
|
|
|
in referenced type 'struct S0':
|
|
|
|
size changed from 32 to 64 bits
|
|
|
|
1 data member insertion:
|
|
|
|
'char S0::inserted_member', at offset 0 (in bits)
|
|
|
|
1 data member change:
|
|
|
|
'int S0::m0' offset changed from 0 to 32
|
|
|
|
|
|
|
|
|
|
|
|
$
|
|
|
|
|
|
|
|
3. Detecting that functions got removed or added to a library: ::
|
|
|
|
|
|
|
|
$ cat -n test-v0.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
3
|
|
|
|
4 struct S0
|
|
|
|
5 {
|
|
|
|
6 int m0;
|
|
|
|
7 };
|
|
|
|
8
|
|
|
|
9 void
|
|
|
|
10 foo(S0& /*parameter_name*/)
|
|
|
|
11 {
|
|
|
|
12 // do something with parameter_name.
|
|
|
|
13 }
|
|
|
|
$
|
|
|
|
$ cat -n test-v1.cc
|
|
|
|
1 // Compile this with:
|
|
|
|
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
3
|
|
|
|
4 struct S0
|
|
|
|
5 {
|
|
|
|
6 char inserted_member;
|
|
|
|
7 int m0;
|
|
|
|
8 };
|
|
|
|
9
|
|
|
|
10 void
|
|
|
|
11 bar(S0& /*parameter_name*/)
|
|
|
|
12 {
|
|
|
|
13 // do something with parameter_name.
|
|
|
|
14 }
|
|
|
|
$
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
|
|
|
|
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
|
|
|
|
$
|
|
|
|
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
|
|
|
|
Functions changes summary: 1 Removed, 0 Changed, 1 Added functions
|
|
|
|
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
|
|
|
|
|
|
|
|
1 Removed function:
|
|
|
|
'function void foo(S0&)' {_Z3fooR2S0}
|
|
|
|
|
|
|
|
1 Added function:
|
|
|
|
'function void bar(S0&)' {_Z3barR2S0}
|
|
|
|
|
|
|
|
$
|
|
|
|
|
2014-09-26 15:02:46 +00:00
|
|
|
.. _ELF: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
|
|
|
|
.. _DWARF: http://www.dwarfstd.org
|
|
|
|
|