Provided by: llvm-18_18.1.3-1ubuntu1_amd64 bug

NAME

       llvm-ifs - shared object stubbing tool

SYNOPSIS

       llvm-ifs [options] inputs

DESCRIPTION

       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 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

       --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.

       --output-elf=<output-filename>
              Specify the output file for ELF shared object stub.

       --output-ifs=<output-filename>
              Specify the output file for text IFS.

       --output-tbd=<output-filename>
              Specify the output file for Apple TAPI tbd.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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.

       --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  llvm-ifs  succeeds,  it will exit with 0. Otherwise, if an error occurs, it will exit with a non-zero
       value.

AUTHOR

       Maintained by the LLVM Team (https://llvm.org/).

COPYRIGHT

       2003-2024, LLVM Project

15                                                 2024-05-27                                        LLVM-IFS(1)