abidw¶
abidw reads a shared library in ELF format and emits an XML
representation of its ABI to standard output. The emitted
representation format, named ABIXML, 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.
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.
To generate either ABI or KMI representation, by default abidw
uses debug information in the DWARF format, if present, otherwise
it looks for debug information in CTF or BTF formats, if present.
Finally, if no debug info in these formats is found, it only considers
ELF symbols and report about their addition or removal.
This tool uses the libabigail library to analyze the binary as well as its associated debug information. Here is its general mode of operation.
When instructed to do so, a binary and its associated debug information is read and analyzed. To that effect, libabigail analyzes by default the descriptions of the types reachable by the interfaces (functions and variables) that are visible outside of their translation unit. Once that analysis is done, an Application Binary Interface Corpus is constructed by only considering the subset of types reachable from interfaces associated to ELF symbols that are defined and exported by the binary. It’s that final ABI corpus which libabigail considers as representing the ABI of the analyzed binary.
Libabigail then has capabilities to generate textual representations of ABI Corpora, compare them, analyze their changes and report about them.
Invocation¶
abidw [options] [<path-to-elf-file>]
Options¶
--abidiffLoad 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.
--abixml-versionDisplay the version of the ABIXML format emitted by this program and exit.
--add-binaries<bin1,bin2,…>For each of the comma-separated binaries given in argument to this option, if the binary is found in the directory specified by the –added-binaries-dir option, then load the ABI corpus of the binary and add it to a set of ABI corpora (called a ABI Corpus Group) made of the binary denoted by the Argument of
abidw. That corpus group is then serialized out.
--added-binaries-dir | --abd<dir-path>This option is to be used in conjunction with the
--add-binaries, the--follow-dependenciesor the--list-dependenciesoption. Binaries listed as arguments of the--add-binariesoption or being dependencies of the input binary in the case of the--follow-dependenciesoption and found in the directory <dir-path> are going to be loaded as ABI corpus and added to the set of ABI corpora (called an ABI corpus group) built and serialized.
--allow-non-exported-interfacesWhen looking at the debug information accompanying a binary, this tool analyzes the descriptions of the types reachable by the interfaces (functions and variables) that are visible outside of their translation unit. Once that analysis is done, an ABI corpus is constructed by only considering the subset of types reachable from interfaces associated to ELF symbols that are defined and exported by the binary. It’s that final ABI corpus which textual representation is saved as
ABIXML.The problem with that approach however is that analyzing all the interfaces that are visible from outside their translation unit can amount to a lot of data, especially when those binaries are applications, as opposed to shared libraries. One example of such applications is the Linux Kernel. Analyzing massive ABI corpora like these can be extremely slow.
In the presence of an “average sized” binary however one can afford having libabigail analyze all interfaces that are visible outside of their translation unit, using this option.
Note that this option is turned on by default, unless we are in the presence of the Linux Kernel.
--annotateAnnotate 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.
--btfExtract ABI information from BTF debug information, if present in the given object.
--check-alternate-debug-info<elf-path>If the debug info for the file elf-path contains a reference to an alternate debug info file,
abidwchecks 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.
--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.
--debug-abidiffSame as
--abidiffbut in debug mode. In this mode, error messages are emitted for types which fail type canonicalization.This is an optional debugging and sanity check option. To enable it the libabigail package needs to be configured with the –enable-debug-self-comparison option.
--ctfExtract ABI information from CTF debug information, if present in the given object.
--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
abidwwhere 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,
abidwwill 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
abidwknows where to find it.
--debug-type-canonicalization | --debug-tcDebug the type canonicalization process. This is done by using structural and canonical equality when canonicalizing every single type. Structural and canonical equality should yield the same result. If they don’t yield the same result for a given type, then it means that the canonicalization of that type went wrong. In that case, an error message is emitted and the execution of the program is aborted.
This option is available only if the package was configured with the –enable-debug-type-canonicalization option.
--drop-private-typesThis option is implicitly set by option –headers-dir and –header-file options.
With this option, types that are NOT defined in the headers are entirely dropped from the internal representation build by Libabigail to represent the ABI and will not end up in the abi XML file.
This option is provided or compatibility reasons only and should not be explicitly used anymore.
--drop-undefined-symsWith this option functions or variables for which the (exported) ELF symbol is undefined are dropped from the internal representation build by Libabigail to represent the ABI and will not end up in the abi XML file.
--exported-interfaces-onlyBy default, when looking at the debug information accompanying a binary, this tool analyzes the descriptions of the types reachable by the interfaces (functions and variables) that are visible outside of their translation unit. Once that analysis is done, an ABI corpus is constructed by only considering the subset of types reachable from interfaces associated to ELF symbols that are defined and exported by the binary. It’s that final ABI corpus which textual representation is saved as
ABIXML.The problem with that approach however is that analyzing all the interfaces that are visible from outside their translation unit can amount to a lot of data, especially when those binaries are applications, as opposed to shared libraries. One example of such applications is the Linux Kernel. Analyzing massive ABI corpora like these can be extremely slow.
To mitigate that performance issue, this option allows libabigail to only analyze types that are reachable from interfaces associated with defined and exported ELF symbols.
Note that this option is turned on by default when analyzing the Linux Kernel. Otherwise, it’s turned off by default.
--follow-dependenciesFor each dependency of the input binary of
abidw, if it is found in the directory specified by the--added-binaries-diroption, then construct an ABI corpus out of the dependency and add it to a set of ABI corpora (called an ABI Corpus Group) along with the ABI corpus of the input binary of the program. The ABI Corpus Group is then serialized out.
--force-early-suppressionThis option must be used alongside option –suppression.
It forces suppression specifications to be applied in early suppression mode. Artifacts of the internal representation that are matched by suppression specifications are thus suppressed from memory.
If this option is not used then only suppression specifications with the drop property set to ‘yes’ are effective. All other suppression specification directives will appear to be ignored.
--headers-dir | --hd<headers-directory-path-1>Specifies where to find the public headers of the binary that the tool has to consider. The tool will thus filter out types that are not defined in public headers. This option implicitly sets option –drop-private-types.
Note that several public header directories can be specified for the binary to consider. In that case the
--header-diroption should be present several times on the command line, like in the following example:$ abidw --header-dir /some/path \ --header-dir /some/other/path \ binary > binary.abi
--header-file | --hf<header-file-path>Specifies where to find one of the public headers of the abi file that the tool has to consider. The tool will thus filter out types that are not defined in public headers.
This option implicitly sets option –drop-private-types.
--help | -hDisplay a short help about the command and exit.
--kmi-whitelist | --kmi-stablelist |-w<path-to-stablelist>When analyzing a Linux Kernel binary, this option points to the list of names of ELF symbols of functions and variables which ABI must be written out. Any function or variable with a name that is not included in that list will not ignored. That list is called a “ Kernel Module Interface stable 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
KMIrather thanKABI.Any other function or variable which ELF symbol are not present in that stable list will not be considered by the KMI writing process.
If this option is not provided – thus if no stable 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.
--list-dependenciesFor each dependency of the input binary of``abidw``, if it’s found in the directory specified by the
--added-binaries-diroption, then the name of the dependency is printed out.
--load-all-typesBy default,
libabigail(and thusabidw) 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 ofabidw. This option however makesabidwload all the types defined in the binaries, even those that are not reachable from public declarations.
--linux-tree | --ltMake
abidwto 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
abidwon 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
--no-assume-odr-for-cplusplusWhen analysing a binary originating from C++ code using DWARF debug information, libabigail assumes the One Definition Rule to speed-up the analysis. In that case, when several types have the same name in the binary, they are assumed to all be equal.
This option disables that assumption and instructs libabigail to actually actually compare the types to determine if they are equal.
--no-corpus-pathDo not emit the path attribute for the ABI corpus.
--no-elf-neededDo not include the list of DT_NEEDED dependency names in the corpus.
--no-leverage-dwarf-factorizationWhen analysing a binary which DWARF debug information was processed with the DWZ tool, the type information is supposed to be already factorized. That context is used by libabigail to perform some speed optimizations.
This option disables those optimizations.
--no-load-undefined-interfacesBy default,
libabigail(and thusabidw) loads information about undefined function and variable symbols as well as functions and variables that are associated with those undefined symbols. Those are called undefined interfaces. This option however makes makesabidwavoid loading information about undefined interfaces. The resulting XML file thus doesn’t contain information about those undefined interfaces.
--no-linux-kernel-modeWithout 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.
--nooutThis option instructs
abidwto 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-parameter-namesIn the emitted ABI representation, do not show names of function parameters, just the types.
--no-show-locsIn the emitted ABI representation, do not show file, line or column where ABI artifacts are defined.
--no-write-default-sizesIn the XML ABI representation, do not write the size-in-bits for pointer type definitions, reference type definitions, function declarations and function types when they are equal to the default address size of the translation unit. Note that libabigail before 1.8 will not set the default size and will interpret types without a size-in-bits attribute as zero sized.
--out-file | -o<file-path>This option instructs
abidwto emit the XML representation of path-to-elf-file into the file file-path, rather than emitting it to its standard output.
--statsEmit statistics about various internal things.
--suppressions | suppr<path-to-suppression-specifications-file>Use a suppression specification 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.
Only suppression specifications that have the drop property set to ‘yes’ are going to be effective. All other suppression specification directives will appear as being ignored, unless the command line option –force-early-suppression is provided.
--type-id-style<sequence``|``hash>This option controls how types are idenfied in the generated XML files. The default
sequencestyle just numbers (withtype-id-as prefix) the types in the order they are encountered. Thehashstyle uses a (stable, portable) hash of libabigail’s internal type names and is intended to make the XML files easier to diff.
--verboseEmit verbose logs about the progress of miscellaneous internal things.
--version | -vDisplay the version of the program and exit.
Usage examples¶
Emitting an
ABIXMLrepresentation of a binary:$ abidw binary > binary.abiEmitting an
ABIXMLrepresentation of a set of binaries specified on the command line:$ abidw --added-binaries=bin1,bin2,bin3 \ --added-binaries-dir /some/where \ binary > binaries.abiNote that the binaries bin1, bin2 and bin3 are to be found in the directory
/some/where. A representation of the ABI of the set of binariesbinary, bin1, bin2andbin3called anABI corpus groupis serialized in the file binaries.abi.Emitting an
ABIXMLrepresentation of a binary and its dependencies:$ abidw --follow-dependencies \ --added-binaries-dir /some/where \ binary > binary.abiNote that only the dependencies that are found in the directory
/some/whereare analysed. Their ABIs, along with the ABI the binary namedbinaryare represented as an ABI corpus group and serialized in the filebinary.abi, in the ABIXML format.
Notes¶
Alternate debug info files¶
As of the version 4 of the DWARF specification, Alternate debug information 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.