mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-22 09:49:59 +00:00
3c0701d59d
There are use cases where the split debuginfo file of a given binary is under a given root directory and that the split debuginfo file itself depends on an alternate debuginfo file that is under another unrelated root directory. In that case, the dwarf reader must be able to look for the debuginfo files under several unrelated root directories. The tools abidiff and abidw must thus support having several occurences of the option --debug-info-dir1 (or --debug-info-dir2) meaning that the debuginfo files for the binary must be looked for under several root directories. This is what this patch does. * doc/manuals/abidiff.rst: Adjust doc for the --debug-info-dir{1,2} that can now be provided several times. * include/abg-dwarf-reader.h ({create, reset}_read_context) (read_corpus_from_elf): Take a vector of debug info root dirs. * include/abg-tools-utils.h (trim_leading_string) (find_file_under_dir, make_path_absolute_to_be_freed) (convert_char_stars_to_char_star_stars): Declare new functions. * src/abg-dwarf-reader.cc (find_alt_debug_info_link): Renamed find_alt_debug_info_location into this. (find_alt_debug_info_path): Define new static function. (find_alt_debug_info): Take a vector of debug info root dirs. Use the new find_alt_debug_info_path to look into the debug info root dirs for the alt debug info. (read_context::debug_info_root_paths_): Define new data member. (read_context::read_context): Take a vector of debug info root dirs and initialize the new read_context::debug_info_root_paths_. (read_context::{initialize, create_default_dwfl}): Take a vector of debug info root dirs and adjust. (read_context::{add_debug_info_root_paths, add_debug_info_root_path, find_alt_debug_info}): Define new member functions. (read_context::load_debug_info): Look into the debug info roots for split debug info files. (create_read_context, read_corpus_from_elf): Take a vector of debug info root dirs and adjust. (has_alt_debug_info): Adjust. * src/abg-tools-utils.cc (trim_leading_string) (make_path_absolute_to_be_freed, find_file_under_dir) (convert_char_stars_to_char_star_stars): Define new functions. (entry_of_file_with_name): Define new static function. (build_corpus_group_from_kernel_dist_under): Adjust. * tests/print-diff-tree.cc (main): Adjust. * tests/test-diff-dwarf.cc (main): Adjust. * tests/test-ir-walker.cc (main): Adjust. * tests/test-read-dwarf.cc (main): Adjust. * tools/abicompat.cc (main): Adjust. * tools/abidiff.cc (options::di_root_paths{1,2}): Changed di_root_path{1,2} into this, change their types into vectors of allocated char*. (options::prepared_di_root_paths{1,2}): Define new data members. (options::~options): Define new destructor. (parse_command_line): Adjust. (prepare_di_root_paths): Define new static function. (handle_error): Remove arguments input_file_name, debug_info_dir{1,2}. Now just take an instance of options instead. Adjust. (main): Adjust. * tools/abidw.cc (options::dir_root_paths): Renamed dir_root_path into this and make it be a vector of allocated char*. (options::prepared_di_root_paths): Define new data member. (options::~options): Free the allocated char* in options::dir_root_paths. (parse_command_line): Support several --debug-info-dir. (load_corpus_and_write_abixml): Adjust. (prepare_di_root_paths): Define static function. (main): Adjust. * tools/abilint.cc (main): Adjust. * tools/abipkgdiff.cc (compare): Adjust. Signed-off-by: Dodji Seketeli <dodji@redhat.com>
222 lines
8.3 KiB
ReStructuredText
222 lines
8.3 KiB
ReStructuredText
|
|
======
|
|
abidw
|
|
======
|
|
|
|
abidw reads a shared library in `ELF`_ format and emits an XML
|
|
representation of its ABI to standard output. The emitted
|
|
representation includes all the globally defined functions and
|
|
variables, along with a complete representation of their types. It
|
|
also includes a representation of the globally defined ELF symbols of
|
|
the file. The input shared library must contain associated debug
|
|
information in `DWARF`_ format.
|
|
|
|
When given the ``--linux-tree`` option, this program can also handle a
|
|
Linux kernel tree. That is, a directory tree that contains both the
|
|
vmlinux binary and Linux kernel modules. It analyses those Linux
|
|
kernel binaries and emits an XML representation of the interface
|
|
between the kernel and its module, to standard output. In this case,
|
|
we don't call it an ABI, but a KMI (Kernel Module Interface). The
|
|
emitted KMI includes all the globally defined functions and variables,
|
|
along with a complete representation of their types. The input
|
|
binaries must contain associated debug information in `DWARF`_ format.
|
|
|
|
Invocation
|
|
==========
|
|
|
|
::
|
|
|
|
abidw [options] [<path-to-elf-file>]
|
|
|
|
Options
|
|
=======
|
|
|
|
* ``--help | -h``
|
|
|
|
Display a short help about the command and exit.
|
|
|
|
* `--version | -v`
|
|
|
|
Display the version of the program and exit.
|
|
|
|
* ``--debug-info-dir | -d`` <*dir-path*>
|
|
|
|
In cases where the debug info for *path-to-elf-file* is in a
|
|
separate file that is located in a non-standard place, this tells
|
|
``abidw`` where to look for that debug info file.
|
|
|
|
Note that *dir-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``.
|
|
|
|
This option can be provided several times with different root
|
|
directories. In that case, ``abidw`` will potentially look into
|
|
all those root directories to find the split debug info for the
|
|
elf file.
|
|
|
|
Note that this option is not mandatory for split debug information
|
|
installed by your system's package manager because then
|
|
``abidw`` knows where to find it.
|
|
|
|
* ``--out-file`` <*file-path*>
|
|
|
|
This option instructs ``abidw`` to emit the XML representation of
|
|
*path-to-elf-file* into the file *file-path*, rather than emitting
|
|
it to its standard output.
|
|
|
|
* ``--noout``
|
|
|
|
This option instructs ``abidw`` to not emit the XML representation
|
|
of the ABI. So it only reads the ELF and debug information,
|
|
builds the internal representation of the ABI and exits. This
|
|
option is usually useful for debugging purposes.
|
|
|
|
* ``--no-corpus-path``
|
|
|
|
Do not emit the path attribute for the ABI corpus.
|
|
|
|
* ``--suppressions | suppr`` <*path-to-suppression-specifications-file*>
|
|
|
|
Use a :ref:`suppression specification <suppr_spec_label>` file
|
|
located at *path-to-suppression-specifications-file*. Note that
|
|
this option can appear multiple times on the command line. In
|
|
that case, all of the provided suppression specification files are
|
|
taken into account. ABI artifacts matched by the suppression
|
|
specifications are suppressed from the output of this tool.
|
|
|
|
|
|
* ``--kmi-whitelist | -kaw`` <*path-to-whitelist*>
|
|
|
|
When analyzing a Linux kernel binary, this option points to the
|
|
white list of names of ELF symbols of functions and variables
|
|
which ABI must be written out. That white list is called a "
|
|
Kernel Module Interface white list". This is because for the
|
|
Kernel, we don't talk about the ABI; we rather talk about the
|
|
interface between the Kernel and its module. Hence the term
|
|
``KMI`` rather than ``ABI``
|
|
|
|
Any other function or variable which ELF symbol are not present in
|
|
that white list will not be considered by the KMI writing process.
|
|
|
|
If this option is not provided -- thus if no white list is
|
|
provided -- then the entire KMI, that is, all publicly defined and
|
|
exported functions and global variables by the Linux Kernel
|
|
binaries is emitted.
|
|
|
|
* ``--linux-tree | --lt``
|
|
|
|
Make ``abidw`` to consider the input path as a path to a directory
|
|
containing the vmlinux binary as several kernel modules binaries.
|
|
In that case, this program emits the representation of the Kernel
|
|
Module Interface (KMI) on the standard output.
|
|
|
|
Below is an example of usage of ``abidw`` on a Linux Kernel tree.
|
|
|
|
First, checkout a Linux kernel source tree and build it. Then
|
|
install the kernel modules in a directory somewhere. Copy the
|
|
vmlinux binary into that directory too. And then serialize the
|
|
KMI of that kernel to disk, using ``abidw``: ::
|
|
|
|
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
|
|
$ cd linux && git checkout v4.5
|
|
$ make allyesconfig all
|
|
$ mkdir build-output
|
|
$ make INSTALL_MOD_PATH=./build-output modules_install
|
|
$ cp vmlinux build-output/modules/4.5.0
|
|
$ abidw --linux-tree build-output/modules/4.5.0 > build-output/linux-4.5.0.kmi
|
|
|
|
* ``--headers-dir | --hd`` <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 types that are not defined in public headers.
|
|
|
|
* ``--no-linux-kernel-mode``
|
|
|
|
Without this option, if abipkgiff detects that the binaries it is
|
|
looking at are Linux Kernel binaries (either vmlinux or modules)
|
|
then it only considers functions and variables which ELF symbols
|
|
are listed in the __ksymtab and __ksymtab_gpl sections.
|
|
|
|
With this option, abipkgdiff considers the binary as a non-special
|
|
ELF binary. It thus considers functions and variables which are
|
|
defined and exported in the ELF sense.
|
|
|
|
* ``--check-alternate-debug-info`` <*elf-path*>
|
|
|
|
If the debug info for the file *elf-path* contains a reference to
|
|
an `alternate debug info <alt-di-label>`_ file, ``abidw`` checks
|
|
that it can find that alternate debug info file. In that case, it
|
|
emits a meaningful success message mentioning the full path to the
|
|
alternate debug info file found. Otherwise, it emits an error
|
|
code.
|
|
|
|
* ``--no-show-locs``
|
|
|
|
In the emitted ABI representation, do not show file, line or column
|
|
where ABI artifacts are defined.
|
|
|
|
* ``--check-alternate-debug-info-base-name`` <*elf-path*>
|
|
|
|
|
|
Like ``--check-alternate-debug-info``, but in the success message,
|
|
only mention the base name of the debug info file; not its full path.
|
|
|
|
* ``--load-all-types``
|
|
|
|
By default, ``libabigail`` (and thus ``abidw``) only loads types
|
|
that are reachable from functions and variables declarations that
|
|
are publicly defined and exported by the binary. So only those
|
|
types are present in the output of ``abidw``. This option however
|
|
makes ``abidw`` load *all* the types defined in the binaries, even
|
|
those that are not reachable from public declarations.
|
|
|
|
* ``--abidiff``
|
|
|
|
Load the ABI of the ELF binary given in argument, save it in
|
|
libabigail's XML format in a temporary file; read the ABI from the
|
|
temporary XML file and compare the ABI that has been read back
|
|
against the ABI of the ELF binary given in argument. The ABIs
|
|
should compare equal. If they don't, the program emits a
|
|
diagnostic and exits with a non-zero code.
|
|
|
|
This is a debugging and sanity check option.
|
|
|
|
* ``--annotate``
|
|
|
|
Annotate the ABIXML output with comments above most elements. The
|
|
comments are made of the pretty-printed form types, declaration or
|
|
even ELF symbols. The purpose is to make the ABIXML output more
|
|
human-readable for debugging or documenting purposes.
|
|
|
|
* ``--stats``
|
|
|
|
Emit statistics about various internal things.
|
|
|
|
* ``--verbose``
|
|
|
|
Emit verbose logs about the progress of miscellaneous internal
|
|
things.
|
|
|
|
Notes
|
|
=====
|
|
|
|
.. _alt-di-label:
|
|
|
|
Alternate debug info files
|
|
--------------------------
|
|
|
|
As of the version 4 of the DWARF specification, `Alternate debug
|
|
information <http://www.dwarfstd.org/ShowIssue.php?issue=120604.1>`_
|
|
is a `GNU`_ extension to the DWARF specification. It has however been
|
|
proposed for inclusion into the upcoming version 5 of the DWARF
|
|
standard. You can read more about the GNU extensions to the DWARF
|
|
standard `here
|
|
<https://fedorahosted.org/elfutils/wiki/DwarfExtensions>`_.
|
|
|
|
.. _ELF: http://en.wikipedia.org/wiki/Executable_and_Linkable_Format
|
|
.. _DWARF: http://www.dwarfstd.org
|
|
.. _GNU: http://www.gnu.org
|
|
|