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
|
|
|
|
Make abidiff and abicompat return meaningful exit codes
As per https://sourceware.org/bugzilla/show_bug.cgi?id=18146, abidiff
the exit code of abidiff and abicompat is now a bit field that can be
inspected to know if the ABI change reported is incompatible for sure,
or if it needs user review of the output to decide.
This patch also updates the documentation.
* doc/manuals/abicompat.rst: Update documentation for abicompat
exit codes.
* doc/manuals/abidiff.rst: Likewise for abidiff exit codes.
* include/abg-tools-utils.h (enum abidiff_status): Declare new
enum.
(operator{|,&,|=}): Declare new operators for the new enum
abidiff_status.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Declare new
functions.
* src/abg-tools-utils.cc (operator{|,&,|=}): Define these new
operators.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Define new
functions.
* tests/test-diff-filter.cc (main): Adjust for the new exit code
of abidiff.
* tests/test-diff-suppr.cc (main): Likewise.
* tests/test-abicompat.cc (main): Likewise.
* tools/abicompat.cc (enum abicompat_status): Remove.
(operator{|,&,|=}): Remove these operators for enum
abicompat_status.
(perform_compat_check_in_normal_mode)
(perform_compat_check_in_weak_mode): Return abidiff_status instead
of abicompat_status. Adjust therefore.
(main): Adjust to return abidiff_status now, instead of a just
zero for all non-error cases.
* tools/abidiff.cc (main): Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-04-10 13:42:35 +00:00
|
|
|
.. _abidiff_invocation_label:
|
|
|
|
|
2014-09-26 15:02:46 +00:00
|
|
|
Invocation
|
|
|
|
==========
|
|
|
|
|
|
|
|
::
|
|
|
|
|
|
|
|
abidiff [options] <first-shared-library> <second-shared-library>
|
|
|
|
|
Bug 20180 - Support system-wide suppression specifications
This patch adds support for loading system and user level suppression
specifications for libabigail tools.
At launch time, relevant libabigail tools (abidiff, abipkgdiff
fedabipkgdiff for now) read the default system suppression
specification file, if it's present, from a file which path is the
value of the environment variable
LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE, if set, or from the file
$libdir/libabigail/default.abignore.
Then it reads the user system suppression specification file, if it's
present, from a file which path is the value of the environment
variable LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE, if set, or from the
file $HOME/.abignore.
The content of the user system suppression file is merged with the
content of default system suppression file.
That content is also merged with the content of the suppression
specification files that might be provided by the --suppressions
command line option of the invoked tools.
The resulting set of all these suppression specifications is thus used
to filter the ABI change reports that are emitted.
abidiff, abipkgdiff and abipkgdiff gain a --no-default-suppression
option to avoid loading any of these default suppression specification
files.
The patch also installs a default.abignore file into $(pkglibdir).
Note that on x86_64, that directory is /usr/lib64/libabigail. Now we
just need to think about the content of that default.abignore file.
* doc/manuals/abidiff.rst: Document the default suppression
scheme, its interaction with the --supprs option and the new
--no-default option.
* doc/manuals/abipkgdiff.rst: Likewise.
* doc/manuals/fedabipkgdiff.rst: Likewise.
* configure.ac: Generate the tests/runtestdefaultsupprs.py file
from the new tests/runtestdefaultsupprs.py.in template.
* default.abignore: New file.
* Makefile.am: Add it to source distribution.
* src/Makefile.am: Define the ABIGAIL_ROOT_SYSTEM_LIBDIR
preprocessor macro that is set the value of the $libdir autotools
macro.
* include/abg-tools-utils.h: Update copyright years.
(get_system_libdir, get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Declare new functions
* src/abg-tools-utils.cc (get_system_libdir)
(get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Define new functions.
(is_regular_file): Amend this so that it return true for symlinks
to regular files too.
(is_dir): Amend this so that it returns true for symlinks to
directories too.
* tools/abidiff.cc (options::no_default_supprs): New data member.
(options::options): Initialize the new data member.
(display_usage): Display a new help string for the new
--no-default-suppression command line option.
(parse_command_line): Parse this new command line option.
(set_diff_context_from_opts): Load the default suppression
specifications, unless --no-default-suppression or --supprs was
provided.
* tools/abipkgdiff.cc (options::no_default_supprs): New data
member.
(options::options): Initialize the new data member.
(parse_command_line): Parse the new --no-default-suppression
command line option.
(main): Load the default suppression specifications, unless
--no-default-suppression or --supprs was provided.
* tools/fedabipkgdiff (abipkgdiff): Add --no-default-suppression
to the invocation of abipkgdiff if it was provided on the command
line.
(build_commandline_args_parser): Parse the new
--no-default-suppression command line option.
* tests/runtestdefaultsupprs.py.in: New test harness template.
* tests/Makefile.am: Add the new runtestdefaultsupprs.py to the
set of tests.
* tests/data/test-default-supprs/test0-type-suppr-0.suppr: New
test input.
* tests/data/test-default-supprs/test0-type-suppr-report-0.txt: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v0.o: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v1.o: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir-report-0.txt:
Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir1: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir2: Likewise.
* tests/data/Makefile.am: Add new the new tests input above to
Makefile.am.
* tests/runtestcanonicalizetypes.sh.in: Pass
--no-default-suppression to abidiff invocations.
* tests/runtestdefaultsupprs.py.in: Likewise.
* tests/test-abidiff-exit.cc: Likewise.
* tests/test-diff-dwarf-abixml.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tools/abidiff.cc: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-05-30 08:37:48 +00:00
|
|
|
|
|
|
|
Environment
|
|
|
|
===========
|
|
|
|
|
|
|
|
.. _abidiff_default_supprs_label:
|
|
|
|
|
|
|
|
abidiff loads two default :ref:`suppression specifications files
|
|
|
|
<suppr_spec_label>`, merges their content and use it to filter out ABI
|
|
|
|
change reports that might be considered as false positives to users.
|
|
|
|
|
|
|
|
* Default system-wide suppression specification file
|
|
|
|
|
|
|
|
It's located by the optional environment variable
|
|
|
|
LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE. If that environment
|
|
|
|
variable is not set, then abidiff tries to load the suppression file
|
|
|
|
$libdir/libabigail/libabigail-default.abignore. If that file is not
|
|
|
|
present, then no default system-wide suppression specification file
|
|
|
|
is loaded.
|
|
|
|
|
|
|
|
* Default user suppression specification file.
|
|
|
|
|
|
|
|
It's located by the optional environment
|
|
|
|
LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE. If that environment
|
|
|
|
variable is not set, then abidiff tries to load the suppression file
|
|
|
|
$HOME/.abignore. If that file is not present, then no default user
|
|
|
|
suppression specification is loaded.
|
|
|
|
|
Make abidiff and abicompat return meaningful exit codes
As per https://sourceware.org/bugzilla/show_bug.cgi?id=18146, abidiff
the exit code of abidiff and abicompat is now a bit field that can be
inspected to know if the ABI change reported is incompatible for sure,
or if it needs user review of the output to decide.
This patch also updates the documentation.
* doc/manuals/abicompat.rst: Update documentation for abicompat
exit codes.
* doc/manuals/abidiff.rst: Likewise for abidiff exit codes.
* include/abg-tools-utils.h (enum abidiff_status): Declare new
enum.
(operator{|,&,|=}): Declare new operators for the new enum
abidiff_status.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Declare new
functions.
* src/abg-tools-utils.cc (operator{|,&,|=}): Define these new
operators.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Define new
functions.
* tests/test-diff-filter.cc (main): Adjust for the new exit code
of abidiff.
* tests/test-diff-suppr.cc (main): Likewise.
* tests/test-abicompat.cc (main): Likewise.
* tools/abicompat.cc (enum abicompat_status): Remove.
(operator{|,&,|=}): Remove these operators for enum
abicompat_status.
(perform_compat_check_in_normal_mode)
(perform_compat_check_in_weak_mode): Return abidiff_status instead
of abicompat_status. Adjust therefore.
(main): Adjust to return abidiff_status now, instead of a just
zero for all non-error cases.
* tools/abidiff.cc (main): Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-04-10 13:42:35 +00:00
|
|
|
.. _abidiff_options_label:
|
|
|
|
|
2014-09-26 15:02:46 +00:00
|
|
|
Options
|
|
|
|
=======
|
|
|
|
|
2015-08-13 21:07:24 +00:00
|
|
|
* ``--help | -h``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
2014-12-27 09:20:56 +00:00
|
|
|
Display a short help about the command and exit.
|
2014-09-26 15:02:46 +00:00
|
|
|
|
Add --version option to several libabigail tools
This patch changed the revision number of the libabigail library to
make it reflect the fact that we are not in "release candidate" mode,
before the first 1.0 release. So the revision number is now "rc0".
The configuration manager has been updated to support version numbers
that are strings, so that it can supports things like "rc0".
Then, several libabigail tools have been modified to support the
--version option to display their version number.
* configure.ac: Set the version revision to "rc0".
* doc/manuals/abicompat.rst: Adjust manual for new --version
option.
* doc/manuals/abidiff.rst: Likewise.
* doc/manuals/abidw.rst: Likewise.
* doc/manuals/abilint.rst: Likewise.
* doc/manuals/abipkgdiff.rst: Likewise.
* include/abg-config.h (config::{m_format_minor, m_format_major}):
Make these be strings.
(config::{get,set}_format_minor_version_number): Make these return
strings.
(config::{get,set}_format_major_version_number): Make these return
or take strings.
(abigail_get_library_version): Make this take strings.
* src/abg-config.cc (config::config): Adjust.
(config::{get,set}_format_major_version_number): Make these return
or take strings.
(config::{get,set}_format_minor_version_number): Make these return
strings.
(abigail_get_library_version): Make this take strings.
* include/abg-version.h.in: Make the version variables be strings.
* src/abg-writer.cc (write_translation_unit): The version numbers
are now strings so adjust.
* tools/{abicompat,abidiff,abidw,abilint,abipkgdiff,abisym}.cc
(options::display_version): New data member.
(options::options): Initialize it.
(display_usage): Add documentation for new --version option.
(parse_command_line): Parse new --version option.
(main): Support --version.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-11-16 10:39:15 +00:00
|
|
|
* `--version | -v`
|
|
|
|
|
|
|
|
Display the version of the program and exit.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--debug-info-dir1 | --d1`` <*di-path1*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--debug-info-dir2 | --d2`` <*di-path2*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
Like ``--debug-info-dir1``, this options tells ``abidiff`` where
|
|
|
|
to find the split debug information for the
|
|
|
|
*second-shared-library* file.
|
|
|
|
|
Make abi{pkg}diff filter out changes about private types
This is to address the following enhancement requests:
#19588 - Add a --headers-dir1 and --headers-dir2 option to abidiff
#19948 - Add --devel-pkg1 and --devel-pkg2 options to abipkgdiff
When the user specifies where to find header files for two binaries
(or packages) being compared, this patch generates a type suppression
specification that filters out change reports about types that are
defined in files that are not in the set of header files specified.
The type suppression specification also suppresses change reports
about changed/added/removed virtual member functions which enclosing
class type matches the type suppression specification.
There is a corner case that the patch handles too, and that is
exhibited by the accompanying test case for abidiff. There can be a
class defined by DWARF as having no source location and as being a
pure declaration. This can be a class declaration that has inline
virtual members only, and one or several non-defined virtual methods
too. When that declaration is included in a source file, GCC
generates debug info that describes that class as being a
declaration-only class with no source declaration. This patch
considers such a class as being non defined; you know, like a true
opaque type. So it's considered being not defined in any public
header file. Changes to this kind of class are thus filtered out.
* include/abg-comp-filter.h: Update copyright year.
* src/abg-comp-filter.cc (has_virtual_mem_fn_change): Make this
static function become exported.
(has_virtual_mem_fn_change): Declare new function.
* include/abg-suppression.h
(suppression_base::{get,set}_is_artificial): Declare new
accessors.
(type_suppression::get_source_locations_to_keep): Return an
unordered set of strings, not a vector. Add a non-const overload.
(type_suppression::set_source_locations_to_keep): Set an unordered
set of strings, not a vector.
* src/abg-suppression.cc (suppression_base::priv::is_artificial_):
New data member.
(suppression_base::priv::priv): Initialize the new data member.
(suppression_base::{get,set}_is_artificial): Define new accessors.
(type_suppression::priv::source_locations_to_keep_): Change the
vector of strings representing source file names into unordered
set of string.
(type_suppression::get_source_locations_to_keep): Return an
unordered set of strings, not a vector. Define a non-const
overload.
(type_suppression::set_source_locations_to_keep): Set an unordered
set of strings, not a vector.
(type_suppression::suppresses_diff): Make this suppress virtual
member function diffs if the enclosing type of the changed virtual
member is suppressed by the current type_suppression.
(read_type_suppression): Adjust to use the fact that the source
locations are not stored in an unordered set, not in a vector
anymore. Otherwise, using a vector here make things too slow.
(type_suppression::suppresses_type): Likewise. Also, If the type
we are looking at has no location because it's a true opaque type
and if the current suppression is an artificial suppression that
is meant to suppress change reports about non-public types, then
suppress the type.
* include/abg-tools-utils.h (gen_suppr_spec_from_headers): Declare
new public function.
* src/abg-tools-utils.cc (PRIVATE_TYPES_SUPPR_SPEC_NAME): Define a
new constant variable.
(handle_fts_entry): Define new static function.
(gen_suppr_spec_from_headers): Define new public function.
* src/abg-comparison.cc
(corpus_diff::priv::apply_suppressions_to_added_removed_fns_vars):
If a type suppression suppresses a given class C, make it change
added/removed virtual functions whose enclosing type is C.
* tools/abidiff.cc (options::{headers_dir1, headers_dir2}): New
data members.
(display_usage): Add help strings for --headers-dir1 and
--headers-dir2.
(parse_command_line): Parse the new --headers-dir1 and
--headers-dir2 options.
(set_diff_context_from_opts): Generate suppression specifications
to filter out changes on private types, if --headers-dir1 or
--headers-dir2 is given.
* tools/abipkgdiff.cc (options::{devel_package1, devel_package2}):
New data members.
(typedef package_sptr): New typedef.
(enum package::kind): New enum.
(package::kind_): New data member. This replaces ...
(package::is_debug_info_): ... this data member.
(package::{devel_package_, private_types_suppressions_}): New data
members.
(package::package): Adjust.
(package::get_kind): Define new member function. This replaces
...
(package::is_debug_info): ... this member function overload.
(package::set_kind): Define new member functin. It replaces ...
(package::is_debug_info): ... this member function overload.
(package::{devel_package, private_types_suppressions}): Define new
accessors.
(package::erase_extraction_directies): Erase the sub-directory
where development packages are extracted to.
(compare_args::private_types_suppr{1,2}): New data members.
(compare_args::compare_args): Adjust.
(display_usage): Add help strings for --devel-pkg1/--devel-pkg2.
(compare): Make the overload that compares elf files take private
types suppressions. Add the private types suppressions to the
diff context.
(pthread_routine_compare): Adjust the call to compare.
(maybe_create_private_types_suppressions): Define new static
function.
(pthread_routine_extract_pkg_and_map_its_content): If a devel
package was specified for the main package then extract it in
parallel with the other package extraction. When the extraction
is done, create private types suppressions by visiting the
directories that contain the header files.
(compare): In the overload that compares packages by scheduling
comparison of individual elf files that are in the packages, pass
in the private type suppressions too.
(parse_command_line): Parse the new --devel-pkg{1,2} command line
options.
(main): Associate the devel package to the main package, if the
--devel-pkg{1,2}.
* doc/manuals/abidiff.rst: Add documentation about the new
--headers-dir1 and --headers-dir2 options.
* doc/manuals/abipkgdiff.rst: Likewise, add documentation about
the new --devel-pkg1 and --devel-pkg2 libraries.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
New test reference output.
* tests/data/test-diff-pkg/tbb-devel-4.1-9.20130314.fc22.x86_64.rpm:
New test input package.
* tests/data/test-diff-pkg/tbb-devel-4.3-3.20141204.fc23.x86_64.rpm: Likewise.
* tests/test-diff-pkg.cc b/tests/test-diff-pkg.cc
(InOutSpec::{first,second}_in_devel_package_path): New data
members.
(in_out_specs): Adjust. Also, add a new entry describing the new
test inputs above.
(test_task::perform): When the new test entry contains devel
packages, pass them to abipkgdiff using the --devel1 and --devel2
options.
* tests/data/test-diff-suppr/test30-include-dir-v0/test30-pub-lib-v0.h:
A new test input source code.
* tests/data/test-diff-suppr/test30-include-dir-v1/test30-pub-lib-v1.h: Likewise.
* tests/data/test-diff-suppr/test30-priv-lib-v0.cc: Likewise.
* tests/data/test-diff-suppr/test30-priv-lib-v0.h: Likewise.
* tests/data/test-diff-suppr/test30-priv-lib-v1.cc: Likewise.
* tests/data/test-diff-suppr/test30-priv-lib-v1.h: Likewise.
* tests/data/test-diff-suppr/test30-pub-lib-v0.cc: Likewise.
* tests/data/test-diff-suppr/test30-pub-lib-v0.so: Add new test
binary input.
* tests/data/test-diff-suppr/test30-pub-lib-v1.cc: Add new test
input source code.
* tests/data/test-diff-suppr/test30-pub-lib-v1.so: Add new test
binary input.
* tests/data/test-diff-suppr/test30-report-0.txt: Add new test
reference output.
* tests/data/test-diff-suppr/test30-report-1.txt: Add new test
reference output.
* tests/test-diff-suppr.cc (InOutSpec::headers_dir{1,2}): New data
members.
(InOutSpec::abidiff_options): Renamed the bidiff_options data
member into this.
(in_out_specs): Adjust. Also, added the new test input above to
this.
(main): Adjust to invoke abidiff with the new --hd1 and --hd2
options if the input specs for the tests has the new
InOutSpec::headers_dir{1,2} data member set. Renamed bidiff into
abidiff.
* tests/data/Makefile.am: Add the new test inputs to the source
distribution.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-05-20 07:19:51 +00:00
|
|
|
* ``--headers-dir1 | --hd1`` <headers-directory-path-1>
|
|
|
|
|
|
|
|
Specifies where to find the public headers of the first shared
|
|
|
|
library that the tool has to consider. The tool will thus filter
|
|
|
|
out ABI changes on types that are not defined in public headers.
|
|
|
|
|
|
|
|
* ``--headers-dir2 | --hd2`` <headers-directory-path-1>
|
|
|
|
|
|
|
|
Specifies where to find the public headers of the second shared
|
|
|
|
library that the tool has to consider. The tool will thus filter
|
|
|
|
out ABI changes on types that are not defined in public headers.
|
|
|
|
|
A suppressed diff node implies suppressing all equivalent nodes too
When a diff node N is suppressed (for instance, using the
--headers-dir{1,2} option of abidiff}, it's only that diff node that
is suppressed. We forget to suppress diff nodes that are equivalent
to N.
Here is why we forget to suppress diff ndoes that are equivalent.
apply_suppressions walks the diff node graph to mark diff nodes as
suppressed. But it does the walking by making sure each diff node's
*class of equivalence* is visited once. This is not only a way to
prevent infinite loops while visiting the graph, but also an
optimization as it avoids walking two equivalent diff nodes.
But then it can happen that we forget to categorize some diff nodes
inside a given class of equivalence, even though we categorized some
others.
This patch makes it so that when a diff node inside a class of
equivalence is categorized as SUPPRESSED, the canonical diff node of
that class of equivalence is categorized as SUPPRESSED too. That way,
to know if a diff node is suppressed, we just need to look at its
canonical diff node.
While doing this, I noticed that abidiff and abipkgdiff are not
dropping private types from libabigail's internal representation, even
though the Library now has that capability. The patch fixes that.
But then the patch adds a --dont-drop-private-types option to abidiff
to avoid dropping those private types from the IR, so that regression
tests can make sure that a suppressed diff node implies suppression
all equivalent nodes too.
* doc/manuals/abidiff.rst b/doc/manuals/abidiff.rst: Document the
new --dont-drop-private-types option.
* src/abg-comparison.cc (diff::is_filtered_out): If the canonical
type was suppressed then the current diff node is filtered out.
(suppression_categorization_visitor::visit_{begin,end}):
Categorized the canonical node as SUPPRESSED if the current node
is suppressed.
* tools/abidiff.cc (options::drop_private_types): New data member.
(options::options): Initialize it.
(display_usage): Add new help string for the new
--dont-drop-private-types option.
(parse_command_line): Parse the new --dont-drop-private-types
option.
(set_suppressions): Generate suppression specification from header
directories given in parameter and stick them to the read context.
* tools/abipkgdiff.cc (compare): Likewise.
* tests/data/test-diff-suppr/libtest34-v0.so: New test input.
* tests/data/test-diff-suppr/libtest34-v1.so: Likewise.
* tests/data/test-diff-suppr/test34-report-0.txt: New reference
report.
* tests/data/test-diff-suppr/test34-v0.c: Source code for the new
test input.
* tests/data/test-diff-suppr/test34-v1.c: Likewise.
* tests/data/test-diff-suppr/test34-priv-include-dir-v0/test34-priv-include-v0.h:
Likewise.
* tests/data/test-diff-suppr/test34-priv-include-dir-v1/test34-priv-include-v1.h:
Likewise.
* tests/data/test-diff-suppr/test34-pub-include-dir-v0/test34-pub-include-v0.h:
Likewise.
* tests/data/test-diff-suppr/test34-pub-include-dir-v1/test34-pub-include-v1.h:
Likewise.
* tests/data/Makefile.am: Add new test input material above to
source distribution.
* tests/test-diff-suppr.cc (in_out_spec): Compare the two new test
library provided. Add --dont-drop-private-types to test30*.
signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-11-26 10:01:45 +00:00
|
|
|
* ``--dont-drop-private-types``
|
|
|
|
|
|
|
|
This option is to be used with the ``--headers-dir1`` and
|
|
|
|
``--headers-dir2`` options. Without this option, types that are
|
|
|
|
*NOT* defined in the headers are entirely dropped from the
|
|
|
|
internal representation build by Libabigail to represent the ABI.
|
|
|
|
They thus don't have to be filtered out from the final ABI change
|
|
|
|
report because they are not even present in Libabigail's
|
|
|
|
representation.
|
|
|
|
|
|
|
|
With this option however, those private types are kept in the
|
|
|
|
internal representation and later filtered out from the report.
|
|
|
|
|
|
|
|
This options thus potentially makes Libabigail to potentially
|
|
|
|
consume more memory. It's meant to be mainly used for debugging
|
|
|
|
purposes.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--stat``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
Rather than displaying the detailed ABI differences between
|
|
|
|
*first-shared-library* and *second-shared-library*, just display
|
|
|
|
some summary statistics about these differences.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--symtabs``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
Only display the symbol tables of the *first-shared-library* and
|
|
|
|
*second-shared-library*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--deleted-fns``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--changed-fns``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--added-fns``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--deleted-vars``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--changed-vars``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--added-vars``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--no-linkage-name``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
In the resulting report, do not display the linkage names of
|
|
|
|
the added, removed, or changed functions or variables.
|
|
|
|
|
Add the option of printing the file, line and column information about a type being reported.
* bash-completion/abicompat: Complete the new "--no-show-locs" option.
* bash-completion/abidiff: Likewise.
* bash-completion/abidw: Likewise.
* bash-completion/abipkgdiff: Likewise.
* doc/manuals/abicompat.rst: Mention the new "--no-show-locs" option.
* doc/manuals/abidiff.rst: Likewise.
* doc/manuals/abidw.rst: Likewise.
* doc/manuals/abipkgdiff.rst: Likewise.
* include/abg-comparison.h (show_locs): Add declarations.
* src/abg-comparison.cc: (diff_context::priv): Add a new switch
called "show_locs_" and set its default value to false.
(report_loc_info): New function. Outputting the extra information
is conditionalized based on the associated diff contexts settings.
(show_locs): define a getter/setter for
diff_context::priv::show_locs_.
({distinct,pointer,reference,qualified_type,enum,class,scope,fn_parm,
typedef,corpus}_diff::report): Call report_loc_info when
appropriate.
(maybe_report_diff_for_member): Likewise.
(represent): Accept a const reference to a diff_context_sptr as a first
argument and call report_loc_info on its second argument.
* src/abg-dwarf-reader.cc:
* tests/data/Makefile.am: Add the new test reference files.
* tests/data/test-abicompat/test0-fn-changed-report-2.txt: New test
reference output.
* tests/data/test-abicompat/test5-fn-changed-report-1.txt: Likewise.
* tests/data/test-abicompat/test6-var-changed-report-1.txt: Likewise.
* tests/data/test-abicompat/test7-fn-changed-report-2.txt: Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
Likewise.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
Likewise.
* tests/data/test-diff-pkg/dirpkg-3-report-2.txt: Likewise.
* tests/data/test-diff-suppr/test6-fn-suppr-report-0-1.txt: Likewise.
* tests/test-abidiff.cc: Explicitly create a diff context and turn off
location emitting.
* tests/test-diff-dwarf.cc: Likewise.
* tests/test-abicompat.cc: Add --no-show-locs to all existing test
arguments. Run a few of the existing tests again, but without this
option.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-pkg.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tools/abicompat.cc: Handle the new "--no-show-locs" option.
* tools/abidiff.cc: Likewise.
* tools/abidw.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.
Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
2015-11-16 09:55:28 +00:00
|
|
|
* ``--no-show-locs``
|
|
|
|
|
|
|
|
Do not show information about where in the *second shared library*
|
|
|
|
the respective type was changed.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--no-unreferenced-symbols``
|
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
|
|
|
|
|
|
|
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.
|
|
|
|
|
Bug 20180 - Support system-wide suppression specifications
This patch adds support for loading system and user level suppression
specifications for libabigail tools.
At launch time, relevant libabigail tools (abidiff, abipkgdiff
fedabipkgdiff for now) read the default system suppression
specification file, if it's present, from a file which path is the
value of the environment variable
LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE, if set, or from the file
$libdir/libabigail/default.abignore.
Then it reads the user system suppression specification file, if it's
present, from a file which path is the value of the environment
variable LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE, if set, or from the
file $HOME/.abignore.
The content of the user system suppression file is merged with the
content of default system suppression file.
That content is also merged with the content of the suppression
specification files that might be provided by the --suppressions
command line option of the invoked tools.
The resulting set of all these suppression specifications is thus used
to filter the ABI change reports that are emitted.
abidiff, abipkgdiff and abipkgdiff gain a --no-default-suppression
option to avoid loading any of these default suppression specification
files.
The patch also installs a default.abignore file into $(pkglibdir).
Note that on x86_64, that directory is /usr/lib64/libabigail. Now we
just need to think about the content of that default.abignore file.
* doc/manuals/abidiff.rst: Document the default suppression
scheme, its interaction with the --supprs option and the new
--no-default option.
* doc/manuals/abipkgdiff.rst: Likewise.
* doc/manuals/fedabipkgdiff.rst: Likewise.
* configure.ac: Generate the tests/runtestdefaultsupprs.py file
from the new tests/runtestdefaultsupprs.py.in template.
* default.abignore: New file.
* Makefile.am: Add it to source distribution.
* src/Makefile.am: Define the ABIGAIL_ROOT_SYSTEM_LIBDIR
preprocessor macro that is set the value of the $libdir autotools
macro.
* include/abg-tools-utils.h: Update copyright years.
(get_system_libdir, get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Declare new functions
* src/abg-tools-utils.cc (get_system_libdir)
(get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Define new functions.
(is_regular_file): Amend this so that it return true for symlinks
to regular files too.
(is_dir): Amend this so that it returns true for symlinks to
directories too.
* tools/abidiff.cc (options::no_default_supprs): New data member.
(options::options): Initialize the new data member.
(display_usage): Display a new help string for the new
--no-default-suppression command line option.
(parse_command_line): Parse this new command line option.
(set_diff_context_from_opts): Load the default suppression
specifications, unless --no-default-suppression or --supprs was
provided.
* tools/abipkgdiff.cc (options::no_default_supprs): New data
member.
(options::options): Initialize the new data member.
(parse_command_line): Parse the new --no-default-suppression
command line option.
(main): Load the default suppression specifications, unless
--no-default-suppression or --supprs was provided.
* tools/fedabipkgdiff (abipkgdiff): Add --no-default-suppression
to the invocation of abipkgdiff if it was provided on the command
line.
(build_commandline_args_parser): Parse the new
--no-default-suppression command line option.
* tests/runtestdefaultsupprs.py.in: New test harness template.
* tests/Makefile.am: Add the new runtestdefaultsupprs.py to the
set of tests.
* tests/data/test-default-supprs/test0-type-suppr-0.suppr: New
test input.
* tests/data/test-default-supprs/test0-type-suppr-report-0.txt: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v0.o: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v1.o: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir-report-0.txt:
Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir1: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir2: Likewise.
* tests/data/Makefile.am: Add new the new tests input above to
Makefile.am.
* tests/runtestcanonicalizetypes.sh.in: Pass
--no-default-suppression to abidiff invocations.
* tests/runtestdefaultsupprs.py.in: Likewise.
* tests/test-abidiff-exit.cc: Likewise.
* tests/test-diff-dwarf-abixml.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tools/abidiff.cc: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-05-30 08:37:48 +00:00
|
|
|
* ``--no-default-suppression``
|
|
|
|
|
|
|
|
Do not load the :ref:`default suppression specification files
|
|
|
|
<abidiff_default_supprs_label>`.
|
2014-10-15 20:32:56 +00:00
|
|
|
|
2015-07-19 14:33:32 +00:00
|
|
|
* ``--suppressions | --suppr`` <*path-to-suppressions*>
|
2014-10-15 20:32:56 +00:00
|
|
|
|
2016-05-08 10:28:16 +00:00
|
|
|
Use a :ref:`suppression specification <suppr_spec_label>` file
|
|
|
|
located at *path-to-suppressions*. Note that this option can
|
Bug 20180 - Support system-wide suppression specifications
This patch adds support for loading system and user level suppression
specifications for libabigail tools.
At launch time, relevant libabigail tools (abidiff, abipkgdiff
fedabipkgdiff for now) read the default system suppression
specification file, if it's present, from a file which path is the
value of the environment variable
LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE, if set, or from the file
$libdir/libabigail/default.abignore.
Then it reads the user system suppression specification file, if it's
present, from a file which path is the value of the environment
variable LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE, if set, or from the
file $HOME/.abignore.
The content of the user system suppression file is merged with the
content of default system suppression file.
That content is also merged with the content of the suppression
specification files that might be provided by the --suppressions
command line option of the invoked tools.
The resulting set of all these suppression specifications is thus used
to filter the ABI change reports that are emitted.
abidiff, abipkgdiff and abipkgdiff gain a --no-default-suppression
option to avoid loading any of these default suppression specification
files.
The patch also installs a default.abignore file into $(pkglibdir).
Note that on x86_64, that directory is /usr/lib64/libabigail. Now we
just need to think about the content of that default.abignore file.
* doc/manuals/abidiff.rst: Document the default suppression
scheme, its interaction with the --supprs option and the new
--no-default option.
* doc/manuals/abipkgdiff.rst: Likewise.
* doc/manuals/fedabipkgdiff.rst: Likewise.
* configure.ac: Generate the tests/runtestdefaultsupprs.py file
from the new tests/runtestdefaultsupprs.py.in template.
* default.abignore: New file.
* Makefile.am: Add it to source distribution.
* src/Makefile.am: Define the ABIGAIL_ROOT_SYSTEM_LIBDIR
preprocessor macro that is set the value of the $libdir autotools
macro.
* include/abg-tools-utils.h: Update copyright years.
(get_system_libdir, get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Declare new functions
* src/abg-tools-utils.cc (get_system_libdir)
(get_default_system_suppression_file_path)
(get_default_user_suppression_file_path)
(load_default_system_suppressions)
(load_default_user_suppressions): Define new functions.
(is_regular_file): Amend this so that it return true for symlinks
to regular files too.
(is_dir): Amend this so that it returns true for symlinks to
directories too.
* tools/abidiff.cc (options::no_default_supprs): New data member.
(options::options): Initialize the new data member.
(display_usage): Display a new help string for the new
--no-default-suppression command line option.
(parse_command_line): Parse this new command line option.
(set_diff_context_from_opts): Load the default suppression
specifications, unless --no-default-suppression or --supprs was
provided.
* tools/abipkgdiff.cc (options::no_default_supprs): New data
member.
(options::options): Initialize the new data member.
(parse_command_line): Parse the new --no-default-suppression
command line option.
(main): Load the default suppression specifications, unless
--no-default-suppression or --supprs was provided.
* tools/fedabipkgdiff (abipkgdiff): Add --no-default-suppression
to the invocation of abipkgdiff if it was provided on the command
line.
(build_commandline_args_parser): Parse the new
--no-default-suppression command line option.
* tests/runtestdefaultsupprs.py.in: New test harness template.
* tests/Makefile.am: Add the new runtestdefaultsupprs.py to the
set of tests.
* tests/data/test-default-supprs/test0-type-suppr-0.suppr: New
test input.
* tests/data/test-default-supprs/test0-type-suppr-report-0.txt: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v0.o: Likewise.
* tests/data/test-default-supprs/test0-type-suppr-v1.o: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir-report-0.txt:
Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir1: Likewise.
* tests/data/test-default-supprs/dirpkg-1-dir2: Likewise.
* tests/data/Makefile.am: Add new the new tests input above to
Makefile.am.
* tests/runtestcanonicalizetypes.sh.in: Pass
--no-default-suppression to abidiff invocations.
* tests/runtestdefaultsupprs.py.in: Likewise.
* tests/test-abidiff-exit.cc: Likewise.
* tests/test-diff-dwarf-abixml.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tools/abidiff.cc: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2016-05-30 08:37:48 +00:00
|
|
|
appear multiple times on the command line. In that case, all of
|
|
|
|
the provided suppression specification files are taken into
|
|
|
|
account.
|
|
|
|
|
|
|
|
Please note that, by default, if this option is not provided, then
|
|
|
|
the :ref:`default suppression specification files
|
|
|
|
<abidiff_default_supprs_label>` are loaded .
|
2014-10-15 20:32:56 +00:00
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--drop`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--drop-fn`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--drop-var`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
When reading the *first-shared-library* and
|
|
|
|
*second-shared-library* ELF input files, drop the globally defined
|
|
|
|
variables matching a the regular expression *regex*.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--keep`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--keep-fn`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--keep-var`` <*regex*>
|
2014-09-26 15:02:46 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--harmless``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
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
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--no-harmful``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
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
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--redundant``
|
2014-09-26 15:02:46 +00:00
|
|
|
|
2014-12-26 18:03:16 +00:00
|
|
|
In the diff report, do display redundant changes. A redundant
|
|
|
|
change is a change that has been displayed elsewhere in the
|
|
|
|
report.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--no-redundant``
|
2014-12-26 18:03:16 +00:00
|
|
|
|
|
|
|
In the diff report, do *NOT* display redundant changes. A
|
|
|
|
redundant change is a change that has been displayed elsewhere in
|
|
|
|
the report. This option is switched on by default.
|
2014-09-26 15:02:46 +00:00
|
|
|
|
2015-08-29 10:59:13 +00:00
|
|
|
* ``--no-architecture``
|
|
|
|
|
|
|
|
Do not take architecture in account when comparing ABIs.
|
|
|
|
|
2015-07-17 09:14:46 +00:00
|
|
|
* ``--dump-diff-tree``
|
2014-12-27 11:42:34 +00:00
|
|
|
|
|
|
|
After the diff report, emit a textual representation of the diff
|
|
|
|
nodes tree used by the comparison engine to represent the changed
|
|
|
|
functions and variables. That representation is emitted to the
|
|
|
|
error output for debugging purposes. Note that this diff tree is
|
|
|
|
relevant only to functions and variables that have some sub-type
|
|
|
|
changes. Added or removed functions and variables do not have any
|
|
|
|
diff nodes tree associated to them.
|
|
|
|
|
2015-08-20 10:28:38 +00:00
|
|
|
* ``--stats``
|
|
|
|
|
|
|
|
Emit statistics about various internal things.
|
|
|
|
|
2016-02-18 14:13:13 +00:00
|
|
|
* ``--verbose``
|
|
|
|
|
|
|
|
Emit verbose logs about the progress of miscellaneous internal
|
|
|
|
things.
|
|
|
|
|
Make abidiff and abicompat return meaningful exit codes
As per https://sourceware.org/bugzilla/show_bug.cgi?id=18146, abidiff
the exit code of abidiff and abicompat is now a bit field that can be
inspected to know if the ABI change reported is incompatible for sure,
or if it needs user review of the output to decide.
This patch also updates the documentation.
* doc/manuals/abicompat.rst: Update documentation for abicompat
exit codes.
* doc/manuals/abidiff.rst: Likewise for abidiff exit codes.
* include/abg-tools-utils.h (enum abidiff_status): Declare new
enum.
(operator{|,&,|=}): Declare new operators for the new enum
abidiff_status.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Declare new
functions.
* src/abg-tools-utils.cc (operator{|,&,|=}): Define these new
operators.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Define new
functions.
* tests/test-diff-filter.cc (main): Adjust for the new exit code
of abidiff.
* tests/test-diff-suppr.cc (main): Likewise.
* tests/test-abicompat.cc (main): Likewise.
* tools/abicompat.cc (enum abicompat_status): Remove.
(operator{|,&,|=}): Remove these operators for enum
abicompat_status.
(perform_compat_check_in_normal_mode)
(perform_compat_check_in_weak_mode): Return abidiff_status instead
of abicompat_status. Adjust therefore.
(main): Adjust to return abidiff_status now, instead of a just
zero for all non-error cases.
* tools/abidiff.cc (main): Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-04-10 13:42:35 +00:00
|
|
|
.. _abidiff_return_value_label:
|
|
|
|
|
|
|
|
Return values
|
|
|
|
=============
|
|
|
|
|
|
|
|
The exit code of the ``abidiff`` command is either 0 if the ABI of the
|
|
|
|
binaries being compared are equal, or non-zero if they differ or if
|
|
|
|
the tool encountered an error.
|
|
|
|
|
|
|
|
In the later case, the exit code is a 8-bits-wide bit field in which
|
|
|
|
each bit has a specific meaning.
|
|
|
|
|
|
|
|
The first bit, of value 1, named ``ABIDIFF_ERROR`` means there was an
|
|
|
|
error.
|
|
|
|
|
|
|
|
The second bit, of value 2, named ``ABIDIFF_USAGE_ERROR`` means there
|
|
|
|
was an error in the way the user invoked the tool. It might be set,
|
|
|
|
for instance, if the user invoked the tool with an unknown command
|
|
|
|
line switch, with a wrong number or argument, etc. If this bit is
|
|
|
|
set, then the ``ABIDIFF_ERROR`` bit must be set as well.
|
|
|
|
|
|
|
|
The third bit, of value 4, named ``ABIDIFF_ABI_CHANGE`` means the ABI
|
|
|
|
of the binaries being compared are different.
|
|
|
|
|
|
|
|
The fourth bit, of value 8, named ``ABIDIFF_ABI_INCOMPATIBLE_CHANGE``
|
|
|
|
means the ABI of the binaries compared are different in an
|
|
|
|
incompatible way. If this bit is set, then the ``ABIDIFF_ABI_CHANGE``
|
|
|
|
bit must be set as well. If the ``ABIDIFF_ABI_CHANGE`` is set and the
|
|
|
|
``ABIDIFF_INCOMPATIBLE_CHANGE`` is *NOT* set, then it means that the
|
|
|
|
ABIs being compared might or might not be compatible. In that case, a
|
|
|
|
human being needs to review the ABI changes to decide if they are
|
|
|
|
compatible or not.
|
|
|
|
|
2016-03-16 19:39:39 +00:00
|
|
|
Note that, at the moment, there are only a few kinds of ABI changes
|
|
|
|
that would result in setting the flag ``ABIDIFF_ABI_INCOMPATIBLE_CHANGE``.
|
2016-03-18 19:17:25 +00:00
|
|
|
Those ABI changes are either:
|
2016-03-16 19:39:39 +00:00
|
|
|
|
|
|
|
- the removal of the symbol of a function or variable that has been
|
|
|
|
defined and exported.
|
|
|
|
- the modification of the index of a member of a virtual function
|
|
|
|
table (for C++ programs and libraries).
|
|
|
|
|
|
|
|
With time, when more ABI change patterns are found to *always*
|
|
|
|
constitute incompatible ABI changes, we will adapt the code to
|
|
|
|
recognize those cases and set the ``ABIDIFF_ABI_INCOMPATIBLE_CHANGE``
|
|
|
|
accordingly. So, if you find such patterns, please let us know.
|
|
|
|
|
Make abidiff and abicompat return meaningful exit codes
As per https://sourceware.org/bugzilla/show_bug.cgi?id=18146, abidiff
the exit code of abidiff and abicompat is now a bit field that can be
inspected to know if the ABI change reported is incompatible for sure,
or if it needs user review of the output to decide.
This patch also updates the documentation.
* doc/manuals/abicompat.rst: Update documentation for abicompat
exit codes.
* doc/manuals/abidiff.rst: Likewise for abidiff exit codes.
* include/abg-tools-utils.h (enum abidiff_status): Declare new
enum.
(operator{|,&,|=}): Declare new operators for the new enum
abidiff_status.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Declare new
functions.
* src/abg-tools-utils.cc (operator{|,&,|=}): Define these new
operators.
(abidiff_status_has_error, abidiff_status_has_abi_change)
(abidiff_status_has_incompatible_abi_change): Define new
functions.
* tests/test-diff-filter.cc (main): Adjust for the new exit code
of abidiff.
* tests/test-diff-suppr.cc (main): Likewise.
* tests/test-abicompat.cc (main): Likewise.
* tools/abicompat.cc (enum abicompat_status): Remove.
(operator{|,&,|=}): Remove these operators for enum
abicompat_status.
(perform_compat_check_in_normal_mode)
(perform_compat_check_in_weak_mode): Return abidiff_status instead
of abicompat_status. Adjust therefore.
(main): Adjust to return abidiff_status now, instead of a just
zero for all non-error cases.
* tools/abidiff.cc (main): Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-04-10 13:42:35 +00:00
|
|
|
The remaining bits are not used for the moment.
|
|
|
|
|
|
|
|
.. _abidiff_usage_example_label:
|
|
|
|
|
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
|
|
|
|
|