LLVM-STRIP(1)

πŸ’– LLVM-STRIP(1) πŸ’–

okay bestie, welcome to the llvm-strip page, from the LLVM manual set. sit down, grab a strawberry, we're gonna learn how to strip object files and it's gonna be iconic πŸ“βœ¨


✨ NAME ✨

llvm-strip β€” object stripping tool. that's it, that's the whole vibe. it strips sections and symbols out of object files. slay πŸ’…


🌸 SYNOPSIS 🌸

llvm-strip [options] inputs...

πŸ¦‹ DESCRIPTION πŸ¦‹

so llvm-strip is literally a tool to strip sections and symbols from object files. if you don't specify any other stripping or remove options, --strip-all gets enabled automatically. it just turns on, like, on its own. main character energy fr fr πŸ‘‘

by default the input files get modified in-place. and if you specify - for the input file, the input is read from the program's standard input stream. cute, right? πŸŽ€

if the input is an archive, any requested operations get applied to each archive member individually. one by one, no skipping πŸ’–

ngl the tool is still in active development, but in most scenarios it works as a drop-in replacement for GNU's strip. lowkey a legend for that 🫢


🌈 GENERIC AND CROSS-PLATFORM OPTIONS 🌈

the following options are either agnostic of the file format, or apply to multiple file formats. they're the universal besties ✨

  • --disable-deterministic-archives, -U β€” use real values for UIDs, GIDs and timestamps when updating archive member headers. like, the actual ones. no pretending πŸ’…
  • --discard-all, -x β€” remove most local symbols from the output. different file formats may limit this to a subset of the local symbols. for example, file and section symbols in ELF objects will not be discarded. additionally, remove all debug sections. bye bestie 😭
  • --enable-deterministic-archives, -D β€” enable deterministic mode when stripping archives, i.e. use 0 for archive member header UIDs, GIDs and timestamp fields. it's on by default. periodt πŸŽ€
  • --help, -h β€” print a summary of command line options. the classic. the icon 🌟
  • --no-strip-all β€” disable --strip-all. yeah, it does exactly what it says, no plot twist πŸ’€
  • -o <file> β€” write output to file. multiple input files cannot be used in combination with -o. pick one, bestie, you can't have both πŸ™ˆ
  • --only-keep-debug β€” produce a debug file as the output that only preserves contents of sections useful for debugging purposes.

for ELF objects, this removes the contents of SHF_ALLOC sections that are not SHT_NOTE by making them SHT_NOBITS and shrinking the program headers where possible. very technical, very demure ✨

  • --regex β€” if specified, symbol and section names specified by other switches are treated as extended POSIX regular expression patterns. regex girlies rise πŸ”₯
  • --remove-section <section>, -R β€” remove the specified section from the output. can be specified multiple times to remove multiple sections simultaneously. stack 'em up πŸ’…
  • --strip-all-gnu β€” remove all symbols, debug sections and relocations from the output. this option is equivalent to GNU strip's --strip-all switch. it's giving "same energy" 🫢
  • --strip-all, -s β€” for ELF objects, remove from the output all symbols and non-alloc sections not within segments, except for .gnu.warning, .ARM.attribute sections and the section name table.

for COFF objects, remove all symbols, debug sections, and relocations from the output. nuke it πŸ”₯

  • --strip-debug, -d, -g, -S β€” remove all debug sections from the output. four aliases, one job, we love a multitasker πŸ’–
  • --strip-symbol <symbol>, -N β€” remove all symbols named symbol from the output. can be specified multiple times to remove multiple symbols. bye bye bye πŸ’œ
  • --strip-unneeded β€” remove from the output all local or undefined symbols that are not required by relocations. also remove all debug sections. if it's not needed, it's gone ✨
  • --version, -V β€” display the version of the llvm-strip executable. flex the build info πŸ’…
  • --wildcard, -w β€” allow wildcard syntax for symbol-related flags. on by default for section-related flags. incompatible with --regex. you can't have both, it's giving situationship drama 😭

wildcard syntax allows the following special symbols:

  • * β€” any number of characters β€” equivalent to .*
  • ? β€” any single character β€” equivalent to .
  • \ β€” escape the next character β€” equivalent to \
  • [a-z] β€” character class β€” equivalent to [a-z]
  • [!a-z], [^a-z] β€” negated character class β€” equivalent to [^a-z]

additionally, starting a wildcard with ! will prevent a match, even if another flag matches. for example -w -N '*' -N '!x' will strip all symbols except for x. the audacity of that x, honestly, keeping its symbol while everyone else gets yeeted πŸ’€

the order of wildcards does not matter. for example, -w -N '*' -N '!x' is the same as -w -N '!x' -N '*'. order is fake, results are real ✨

  • @<FILE> β€” read command-line options and commands from response file FILE. little @ doing big things πŸŽ€

πŸ’œ ELF-SPECIFIC OPTIONS πŸ’œ

the following options are implemented only for ELF objects. if used with other objects, llvm-strip will either emit an error or silently ignore them. it's giving "exclusive club only" 🧚

  • --allow-broken-links β€” allow llvm-strip to remove sections even if it would leave invalid section references. any invalid sh_link fields will be set to zero. messy but make it functional πŸ’…
  • --discard-locals, -X β€” remove local symbols starting with ".L" from the output. .L-girlies, your time is up 😭
  • --keep-file-symbols β€” keep symbols of type STT_FILE, even if they would otherwise be stripped. protected, shielded, blessed πŸ›‘οΈβœ¨
  • --keep-section <section> β€” when removing sections from the output, do not remove sections named section. can be specified multiple times to keep multiple sections. keep, keep, keep πŸŽ€
  • --keep-symbol <symbol>, -K β€” when removing symbols from the output, do not remove symbols named symbol. can be specified multiple times to keep multiple symbols. your faves are safe πŸ’–
  • --preserve-dates, -p β€” preserve access and modification timestamps in the output. time is a construct but timestamps are sacred ⏰
  • --strip-sections β€” remove from the output all section headers and all section data not within segments. note that many tools will not be able to use an object without section headers. this is a "you'll regret it" moment, proceed with caution ⚠️
  • -T β€” remove Swift symbols. swifties, i'm so sorry 😭 🫢

🌟 EXIT STATUS 🌟

llvm-strip exits with a non-zero exit code if there is an error. otherwise, it exits with code 0. zero is the slay number, anything else means something went wrong bestie πŸ’€


πŸ› BUGS πŸ›

to report bugs, please visit:

https://github.com/llvm/llvm-project/labels/tools:llvm-objcopy%2Fstrip

go tell them what's wrong, they want to know, we're all in this together 🫢


πŸ‘€ SEE ALSO πŸ‘€

llvm-objcopy(1) β€” its sibling, its partner in crime, iykyk πŸ’…


πŸ‘‘ AUTHOR πŸ‘‘

maintained by the LLVM Team (https://llvm.org/). icons, honestly 🌈


2003-2025, LLVM Project


okay that's the whole page bestie, you're officially a llvm-strip expert now, go strip something πŸ’–βœ¨

this has been the LLVM-STRIP(1) page, page 20, dated 2025-09-03, from LLVM. mwah, love u, bye πŸŽ€πŸ¦‹πŸŒΈ

πŸ“¦ where this page comes from