FreeBSD manual
download PDF document: llvm-ifs15.1.pdf
LLVM-IFS(1) LLVM LLVM-IFS(1)
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 }
...
o IFSVersion: Version of the IFS file for reader compatibility.
o SoName (optional): Name of the shared object file that is being
stubbed.
o 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.
o NeededLibs: The list of the external shared objects that this library
depends on.
o Symbols: A collection of all data needed to link objects for each
symbol, sorted by name in ascending order.
o Name: Symbol name.
o 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.
o Size: The size of the symbol in question, doesn't apply to
functions, and is optional for NoType symbols.
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:
o ELF header.
o Section headers.
o Dynamic symbol table (.dynsym section).
o Dynamic string table (.dynstr section).
o Dynamic table (.dynamic section).
o DT_SYMTAB entry.
o DT_STRTAB entry.
o DT_STRSZ entry.
o DT_NEEDED entries. (optional)
o DT_SONAME entry. (optional)
o 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
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
Maintained by the LLVM Team (https://llvm.org/).
COPYRIGHT
2003-2024, LLVM Project
15 2024-12-23 LLVM-IFS(1)