| 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. | |
| .. option:: --strip-size | |
| When this flag is set, llvm-ifs will remove the size field from the output ifs | |
| file. This is useful for shared objects that only intend to be linked against | |
| position independent code which doesn't need copy relocations, or where the size | |
| of an object is not a useful part of the abi to track. | |
| 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. |