forked from OSchip/llvm-project
[doc] Add llvm-ifs commandline guide
This patch adds llvm-ifs commandline guide Differential Review: https://reviews.llvm.org/D118514
This commit is contained in:
parent
4f5eb53e68
commit
8ada9b570d
|
@ -79,6 +79,7 @@ Developer Tools
|
||||||
mlir-tblgen
|
mlir-tblgen
|
||||||
lit
|
lit
|
||||||
llvm-exegesis
|
llvm-exegesis
|
||||||
|
llvm-ifs
|
||||||
llvm-locstats
|
llvm-locstats
|
||||||
llvm-pdbutil
|
llvm-pdbutil
|
||||||
llvm-profgen
|
llvm-profgen
|
||||||
|
|
|
@ -0,0 +1,201 @@
|
||||||
|
llvm-ifs - shared object stubbing tool
|
||||||
|
======================================
|
||||||
|
|
||||||
|
.. program:: llvm-ifs
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
|
||||||
|
:program:`llvm-ifs` [*options*] *inputs*
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
|
:program:`llvm-ifs` is a tool that jointly produces human readable text-based
|
||||||
|
stubs (.ifs files) for shared objects and linkable shared object stubs
|
||||||
|
(.so files) from either ELF shared objects or text-based stubs. The text-based
|
||||||
|
stubs is useful for monitoring ABI changes of the shared object. The linkable
|
||||||
|
shared object stubs can be used to avoid unnecessary relinks when the ABI of
|
||||||
|
shared libraries does not change.
|
||||||
|
|
||||||
|
|
||||||
|
IFS FORMATS
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Here is an example of the text representation (IFS) of a shared object produced
|
||||||
|
by the :program:`llvm-ifs`:
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
--- !ifs-v1
|
||||||
|
IFSVersion: 3.0
|
||||||
|
SoName: libtest.so /* Optional */
|
||||||
|
Target: x86_64-unknown-linux-gnu /* Optional, format 1, same format as llvm target triple */
|
||||||
|
Target: { Arch: x86_64, Endianness: little, Bitwidth: 64 } /* Optional, format 2 */
|
||||||
|
NeededLibs:
|
||||||
|
- libc.so.6
|
||||||
|
Symbols:
|
||||||
|
- { Name: sym0, Type: Notype }
|
||||||
|
- { Name: sym1, Type: Object, Size: 0 }
|
||||||
|
- { Name: sym2, Type: Func, Weak: false }
|
||||||
|
- { Name: sym3, Type: TLS }
|
||||||
|
- { Name: sym4, Type: Unknown, Warning: foo }
|
||||||
|
...
|
||||||
|
|
||||||
|
* ``IFSVersion``: Version of the IFS file for reader compatibility.
|
||||||
|
|
||||||
|
* ``SoName`` (optional): Name of the shared object file that is being stubbed.
|
||||||
|
|
||||||
|
* ``Target`` (optional): The architecture, endianness and bitwise information of
|
||||||
|
this shared object. It can be either in explicit format or in implicit LLVM
|
||||||
|
triple format. It can be optional and can be overridden from command line
|
||||||
|
options.
|
||||||
|
|
||||||
|
* ``NeededLibs``: The list of the external shared objects that this library depends on.
|
||||||
|
|
||||||
|
* ``Symbols``: A collection of all data needed to link objects for each symbol, sorted by name in ascending order.
|
||||||
|
|
||||||
|
+ ``Name``: Symbol name.
|
||||||
|
|
||||||
|
+ ``Type``: Whether the symbol is an object, function, no-type, thread local storage, or unknown. Symbol types not explicitly supported are mapped as unknown to improve signal-to-noise ratio.
|
||||||
|
|
||||||
|
+ ``Size``: The size of the symbol in question, doesn’t apply to functions, and is optional for NoType symbols.
|
||||||
|
|
||||||
|
+ ``Undefined``: Whether or not the symbol is defined in this shared object file.
|
||||||
|
|
||||||
|
+ ``Weak``: Whether or not the symbol should be treated as weak.
|
||||||
|
|
||||||
|
+ ``Warning`` (optional): Warning text to output when this symbol is linked against.
|
||||||
|
|
||||||
|
This YAML based text format contains everything that is needed to generate a
|
||||||
|
linkable ELF shared object as well as an Apple TAPI format file. The ordering
|
||||||
|
of symbols is sorted, so these files can be easily compared using diff tools.
|
||||||
|
If the content of the file changes, it indicates a potentially ABI breaking
|
||||||
|
change.
|
||||||
|
|
||||||
|
|
||||||
|
ELF STUB FORMAT
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A minimum ELF file that can be used by linker should have following sections properly populated:
|
||||||
|
|
||||||
|
* ELF header.
|
||||||
|
|
||||||
|
* Section headers.
|
||||||
|
|
||||||
|
* Dynamic symbol table (``.dynsym`` section).
|
||||||
|
|
||||||
|
* Dynamic string table (``.dynstr`` section).
|
||||||
|
|
||||||
|
* Dynamic table (``.dynamic`` section).
|
||||||
|
|
||||||
|
+ ``DT_SYMTAB`` entry.
|
||||||
|
|
||||||
|
+ ``DT_STRTAB`` entry.
|
||||||
|
|
||||||
|
+ ``DT_STRSZ`` entry.
|
||||||
|
|
||||||
|
+ ``DT_NEEDED`` entries. (optional)
|
||||||
|
|
||||||
|
+ ``DT_SONAME`` entry. (optional)
|
||||||
|
|
||||||
|
* Section header string table (``.shstrtab`` section)
|
||||||
|
|
||||||
|
This ELF file may have compatibility issues with ELF analysis tools that rely on the program headers.
|
||||||
|
Linkers like LLD work fine with such a minimum ELF file without errors.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. option:: --input-format=[IFS|ELF|OtherObjectFileFormats]
|
||||||
|
|
||||||
|
Specify input file format. Currently, only text IFS files and ELF shared
|
||||||
|
object files are supported. This flag is optional as the input format can be
|
||||||
|
inferred.
|
||||||
|
|
||||||
|
.. option:: --output-elf=<output-filename>
|
||||||
|
|
||||||
|
Specify the output file for ELF shared object stub.
|
||||||
|
|
||||||
|
.. option:: --output-ifs=<output-filename>
|
||||||
|
|
||||||
|
Specify the output file for text IFS.
|
||||||
|
|
||||||
|
.. option:: --output-tbd=<output-filename>
|
||||||
|
|
||||||
|
Specify the output file for Apple TAPI tbd.
|
||||||
|
|
||||||
|
.. option:: --arch=[x86_64|AArch64|...]
|
||||||
|
|
||||||
|
This flag is optional and it should only be used when reading an IFS file
|
||||||
|
which does not define the ``Arch`` (architecture). This flag defines the
|
||||||
|
architecture of the output file, and can be any string supported by ELF
|
||||||
|
'e_machine' field. If the value is conflicting with the IFS file, an error
|
||||||
|
will be reported and the program will stop.
|
||||||
|
|
||||||
|
.. option:: --endianness=[little|big]
|
||||||
|
|
||||||
|
This flag is optional and it should only be used when reading an IFS file
|
||||||
|
which does not define the ``Endianness``. This flag defines the endianness of
|
||||||
|
the output file. If the value is conflicting with the IFS file, an error
|
||||||
|
will be reported and the program will stop.
|
||||||
|
|
||||||
|
.. option:: --bitwidth=[32|64]
|
||||||
|
|
||||||
|
This flag is optional and it should only be used when reading an IFS file
|
||||||
|
which does not define the ``BitWidth``. This flag defines the bit width of the
|
||||||
|
output file. If the value is conflicting with the input IFS file, an error
|
||||||
|
will be reported and the program will stop.
|
||||||
|
|
||||||
|
.. option:: --target=<target triple>
|
||||||
|
|
||||||
|
This flag is optional and should only be used when reading an IFS file
|
||||||
|
which does not define any target information. This flag defines architecture,
|
||||||
|
endianness and bit width of the output file using llvm target triple.
|
||||||
|
This flag cannot be used simultaneously with other target related flags.
|
||||||
|
|
||||||
|
.. option:: --hint-ifs-target=<target triple>
|
||||||
|
|
||||||
|
This flag is optional and should only be used when reading an ELF shared
|
||||||
|
object and generating an IFS file. by default, llvm-ifs will use '``Arch``,
|
||||||
|
``Endianness`` and ``BitWidth``' fields to reflect the target information from the
|
||||||
|
input object file. Using this flag will tell llvm-ifs the expected target
|
||||||
|
triple in the output IFS file. If the value matches the target information
|
||||||
|
from the object file, this value will be used in the 'Target:' filed in the
|
||||||
|
generated IFS. If it conflicts with the input object file, an error will be
|
||||||
|
reported and the program will stop.
|
||||||
|
|
||||||
|
.. option:: --hint-ifs-target
|
||||||
|
|
||||||
|
This flag is optional and should only be used when outputting an IFS file.
|
||||||
|
This flag strips the ``Arch`` field from the IFS file so it can be overridden
|
||||||
|
later.
|
||||||
|
|
||||||
|
.. option:: --strip-ifs-endianness
|
||||||
|
|
||||||
|
This flag is optional and should only be used when outputting an IFS file.
|
||||||
|
This flag strips the ``Endianness`` field from the IFS file so it can be
|
||||||
|
overridden later.
|
||||||
|
|
||||||
|
.. option:: --strip-ifs-bitwidth
|
||||||
|
|
||||||
|
This flag is optional and should only be used when outputting an IFS file.
|
||||||
|
This flag strips the ``BitWidth`` field from the IFS file so it can be overridden
|
||||||
|
later.
|
||||||
|
|
||||||
|
.. option:: --strip-ifs-target
|
||||||
|
|
||||||
|
This flag is optional and should only be used when outputting an IFS file.
|
||||||
|
This flag strips the ``Target`` field from the IFS file so it can be overridden
|
||||||
|
later.
|
||||||
|
|
||||||
|
.. option:: --write-if-changed
|
||||||
|
|
||||||
|
When this flag is set, llvm-ifs will only write the output file if it does not
|
||||||
|
already exist or the content will be different from the existing file.
|
||||||
|
|
||||||
|
EXIT STATUS
|
||||||
|
-----------
|
||||||
|
|
||||||
|
If :program:`llvm-ifs` succeeds, it will exit with 0. Otherwise, if an
|
||||||
|
error occurs, it will exit with a non-zero value.
|
Loading…
Reference in New Issue