LLVM-OBJCOPY(1)

๐Ÿ’… LLVM-OBJCOPY(1) โ€” the LLVM manual, section 1 โœจ

okay so bestie, gather round, because this is llvm-objcopy from the LLVM manual (section 1), and it's genuinely one of my faves. it copies objects. it edits objects. it does a little bit of everything and honestly? iconic. ๐ŸŽ€


โœจ NAME โœจ

llvm-objcopy โ€” the object copying and editing tool. yes, that's literally the whole vibe: copy stuff, edit stuff. ๐Ÿฆ‹


๐ŸŒธ SYNOPSIS ๐ŸŒธ

llvm-objcopy [options] input [output]

๐Ÿ’– DESCRIPTION ๐Ÿ’–

so llvm-objcopy is a tool to copy and manipulate objects, periodt. in basic usage it just makes a semantic copy of the input to the output โ€” like a little photocopier but for object files. but the second you throw any options at it, the output can get modified along the way, e.g. by removing sections. it's giving "glow-up on the way out the door". ๐Ÿ’…

if no output file is specified, the input file is modified in-place. and if - is specified for the input file, the input is read from the program's standard input stream. if - is specified for the output file, the output is written to the standard output stream of the program. no cap, - is the main character in both directions. ๐Ÿซถ

if the input is an archive, any requested operations will be applied to each archive member individually. every member gets its turn, nobody's left out. โœจ

the tool is still in active development, but in most scenarios it works as a drop-in replacement for GNU's objcopy. lowkey a glow-up in progress, but it ate. ๐Ÿ”ฅ


๐ŸŒˆ GENERIC AND CROSS-PLATFORM OPTIONS ๐ŸŒˆ

these options are either agnostic of the file format, or they apply to multiple file formats. so like, they work everywhere. universal icons only. ๐Ÿ‘‘

  • --add-gnu-debuglink <debug-file> โ€” adds a .gnu_debuglink section for <debug-file> to the output. ๐Ÿงš
  • --add-section <section=file> โ€” adds a section named <section> with the contents of <file> to the output. for ELF objects the section will be of type SHT_NOTE if the name starts with .note. otherwise it'll have type SHT_PROGBITS. can be specified multiple times to add multiple sections โ€” stack 'em up, bestie. ๐Ÿ“

for MachO objects, <section> must be formatted as <segment name>,<section name>.

  • --binary-architecture <arch>, -B โ€” ignored for compatibility. yeah, it's just there so nothing breaks. a decorative option, honestly. ๐Ÿ’€
  • --disable-deterministic-archives, -U โ€” use real values for UIDs, GIDs and timestamps when updating archive member headers. like, actually real. raw. unfiltered. ๐Ÿ™ˆ
  • --discard-all, -x โ€” removes most local symbols not referenced by relocations 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. so it's a spring clean but with exceptions, iykyk. ๐Ÿงน
  • --dump-section <section>=<file> โ€” dumps the contents of section <section> into the file <file>. can be specified multiple times to dump multiple sections to different files. <file> is unrelated to the input and output files provided to llvm-objcopy, and as such the normal copying and editing operations will still be performed. no operations are performed on the sections prior to dumping them. so it's a peek, not a pre-makeover. ๐Ÿ‘€

for MachO objects, <section> must be formatted as <segment name>,<section name>.

  • --enable-deterministic-archives, -D โ€” enables deterministic mode when copying archives, i.e. use 0 for archive member header UIDs, GIDs and timestamp fields. on by default โ€” she's already enabled, bestie, she's just that girl. โœจ
  • --extract-section <section>=<file> โ€” extracts the specified section <section> into the file <file> as a separate object. can be specified multiple times to extract multiple sections. <file> is unrelated to the input and output files provided to llvm-objcopy, and as such the normal copying and editing operations will still be performed. no operations are performed on the sections prior to dumping them. mhm, same energy as --dump-section but she leaves with a whole new object. ๐ŸŽ€
  • --globalize-symbol <symbol> โ€” marks any defined symbols named <symbol> as global symbols in the output. can be specified multiple times to mark multiple symbols. go off, be known. ๐ŸŒŸ
  • --globalize-symbols <filename> โ€” reads a list of names from the file <filename> and marks defined symbols with those names as global in the output. in the file, each line represents a single symbol, with leading and trailing whitespace ignored, as is anything following a #. can be specified multiple times to read names from multiple files. bulk glow-up. ๐Ÿ’–
  • --help, -h โ€” prints a summary of command line options. your little map when you're lost. ๐Ÿ—บ๏ธ
  • --keep-global-symbol <symbol>, -G โ€” marks all symbols local in the output, except for symbols with the name <symbol>. can be specified multiple times to ignore multiple symbols. so everyone's private except the chosen ones. ๐Ÿ‘‘
  • --keep-global-symbols <filename> โ€” marks all symbols local in the output, except for symbols named in the file <filename>. in the file, each line represents a single symbol, with leading and trailing whitespace ignored, as is anything following a #. can be specified multiple times to read names from multiple files. the VIP list, basically. ๐ŸŽŸ๏ธ
  • --localize-symbol <symbol>, -L โ€” marks any defined non-common symbol named <symbol> as a local symbol in the output. can be specified multiple times to mark multiple symbols as local. sorry babe, you're staying home. ๐Ÿ 
  • --localize-symbols <filename> โ€” reads a list of names from the file <filename> and marks defined non-common symbols with those names as local in the output. in the file, each line represents a single symbol, with leading and trailing whitespace ignored, as is anything following a #. can be specified multiple times to read names from multiple files. ๐Ÿฆ‹
  • --only-keep-debug โ€” produces a debug file as the output that only preserves contents of sections useful for debugging purposes. the "keep only the cute parts" of object files. ๐Ÿ’…

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.

  • --only-section <section>, -j โ€” removes all sections from the output, except for sections named <section>. can be specified multiple times to keep multiple sections. ruthless except to the ones you love. ๐Ÿ˜ญ

for MachO objects, <section> must be formatted as <segment name>,<section name>.

  • --redefine-sym <old>=<new> โ€” renames symbols called <old> to <new> in the output. can be specified multiple times to rename multiple symbols. rebranding era. โœจ
  • --redefine-syms <filename> โ€” renames symbols in the output as described in the file <filename>. in the file, each line represents a single symbol to rename, with the old name and new name separated by whitespace. leading and trailing whitespace is ignored, as is anything following a #. can be specified multiple times to read names from multiple files. ๐ŸŽ€
  • --regex โ€” if specified, symbol and section names specified by other switches are treated as extended POSIX regular expression patterns. regex girlies rise. ๐Ÿ”ฅ
  • --remove-symbol-prefix <prefix> โ€” removes <prefix> from the start of every symbol name. no-op for symbols that do not start with <prefix>. if it's not there, nothing happens, no drama. ๐Ÿ™ˆ
  • --remove-section <section>, -R โ€” removes the specified section from the output. can be specified multiple times to remove multiple sections simultaneously. bye bestie, blocked and deleted. ๐Ÿ’€

for MachO objects, <section> must be formatted as <segment name>,<section name>.

  • --set-section-alignment <section>=<align> โ€” sets the alignment of section <section> to <align>. can be specified multiple times to update multiple sections. posture check, but for sections. ๐Ÿ“
  • --set-section-flags <section>=<flag>[,<flag>,...] โ€” sets section properties in the output of section <section> based on the specified <flag> values. can be specified multiple times to update multiple sections. flag customization at its finest. ๐ŸŽจ

supported flag names are alloc, load, noload, readonly, exclude, debug, code, data, rom, share, contents, merge, strings, and large. not all flags are meaningful for all object file formats or target architectures โ€” so don't come for me if some of them do nothing on your target, okay? ๐Ÿ’…

for ELF objects, the flags have the following effects:

  • alloc = add the SHF_ALLOC flag.
  • load = if the section has SHT_NOBITS type, mark it as a SHT_PROGBITS section.
  • readonly = if this flag is not specified, add the SHF_WRITE flag.
  • exclude = add the SHF_EXCLUDE flag.
  • code = add the SHF_EXECINSTR flag.
  • merge = add the SHF_MERGE flag.
  • strings = add the SHF_STRINGS flag.
  • contents = if the section has SHT_NOBITS type, mark it as a SHT_PROGBITS section.
  • large = add the SHF_X86_64_LARGE on x86_64; rejected if the target architecture is not x86_64. like, she refuses. no x86_64, no entry. ๐Ÿšซ

for COFF objects, the flags have the following effects:

  • alloc = add the IMAGE_SCN_CNT_UNINITIALIZED_DATA and IMAGE_SCN_MEM_READ flags, unless the load flag is specified.
  • noload = add the IMAGE_SCN_LNK_REMOVE and IMAGE_SCN_MEM_READ flags.
  • readonly = if this flag is not specified, add the IMAGE_SCN_MEM_WRITE flag.
  • exclude = add the IMAGE_SCN_LNK_REMOVE and IMAGE_SCN_MEM_READ flags.
  • debug = add the IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE and IMAGE_SCN_MEM_READ flags.
  • code = add the IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE and IMAGE_SCN_MEM_READ flags.
  • data = add the IMAGE_SCN_CNT_INITIALIZED_DATA and IMAGE_SCN_MEM_READ flags.
  • share = add the IMAGE_SCN_MEM_SHARED and IMAGE_SCN_MEM_READ flags.
  • --skip-symbol <symbol> โ€” do not change the parameters of symbol <symbol> when executing other options that can change the symbol's name, binding or visibility. she's on do-not-disturb. ๐ŸŒธ
  • --skip-symbols <filename> โ€” do not change the parameters of symbols named in the file <filename> when executing other options that can change the symbol's name, binding or visibility. in the file, each line represents a single symbol, with leading and trailing whitespace ignored, as is anything following a #. can be specified multiple times to read names from multiple files. the whole group chat is exempt. ๐Ÿซถ
  • --strip-all-gnu โ€” removes all symbols, debug sections and relocations from the output. this option is equivalent to GNU objcopy's --strip-all switch. (yes, it's the GNU-flavored one, keep that in mind, iykyk.) โญ
  • --strip-all, -S โ€” for ELF objects, removes from the output all symbols and non-alloc sections not within segments, except for .gnu.warning, .ARM.attribute sections and the section name table. some things are simply too iconic to remove. ๐Ÿ‘‘

for COFF and Mach-O objects, removes all symbols, debug sections, and relocations from the output.

for WebAssembly objects, removes all custom sections except for those named metadata.code.*.

  • --strip-debug, -g โ€” removes all debug sections from the output. clean, fresh, no baggage. ๐Ÿงš
  • --strip-symbol <symbol>, -N โ€” removes all symbols named <symbol> from the output. can be specified multiple times to remove multiple symbols. ๐Ÿ—‘๏ธ

โœจ okay that's all the generic goodies โ€” more options coming right up, bestie, don't you dare close the tab ๐Ÿ’–

  • --strip-symbols <filename> โ€” bestie, this one removes all symbols whose names show up in <filename> from the output. In that file, each line is one symbol name, and leading + trailing whitespace gets ignored, along with anything after a #. You can use this multiple times to read names from multiple files. โœจ
  • --strip-unneeded-symbol <symbol> โ€” removes from the output every symbol named <symbol> that is local or undefined and not required by any relocation. no cap, itโ€™s picky on purpose ๐Ÿ’…
  • --strip-unneeded-symbols <filename> โ€” removes all symbols whose names appear in <filename> from the output, but only if theyโ€™re local or undefined and not required by any relocation. Same file rules as above: one symbol name per line, leading/trailing whitespace ignored, and anything after a # ignored too. Can be specified multiple times to read names from multiple files. ๐ŸŽ€
  • --strip-unneeded โ€” removes from the output all local or undefined symbols that are not required by relocations. Also removes all debug sections. itโ€™s giving cleanup era ๐Ÿงน
  • --update-section <name>=<file> โ€” replaces the contents of the section <name> with contents from the file <file>. If the section <name> is part of a segment, the new contents cannot be larger than the existing section. so like, donโ€™t try to overstuff it, bestie ๐Ÿ˜ญ
  • --verbose, -v โ€” prints the paths of files that are copied. tiny receipts, very main character ๐Ÿซถ
  • --version, -V โ€” displays the version of the llvm-objcopy executable. slay, now you know what youโ€™re running โญ
  • --wildcard, -w โ€” allows wildcard syntax for symbol-related flags. Itโ€™s on by default for section-related flags. It is incompatible with --regex. ๐Ÿ’ฅ

Wildcard syntax allows these special symbols, iykyk:

  • * โ€” 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 order of wildcards does not matter. For example, -w -N '*' -N '!x' is the same as -w -N '!x' -N '*'. periodt ๐Ÿ’…

  • @ <FILE> โ€” reads command-line options and commands from response file <FILE>. itโ€™s like a lil shortcut bestie, very convenient ๐ŸŒธ

โœจ ELF-SPECIFIC OPTIONS โœจ

Okay so these next ones are ELF-only, bestie. Like, they're literally just for ELF objects. If you try them on some other kind of object, llvm-objcopy will either hit you with an error or just silently ignore you (rude, but okay ๐Ÿ’…).


  • --add-symbol <name>=[<section>:]<value>[,<flags>] โ€” Adds a brand-new symbol called <name> to the output symbol table, living in the section named <section>, with value <value>. If you don't give a <section>, the symbol gets added as an absolute symbol. And the <flags>? They tweak the symbol's properties. Accepted values are:
    • global โ€” the symbol will have global binding.
    • local โ€” the symbol will have local binding.
    • weak โ€” the symbol will have weak binding.
    • default โ€” the symbol will have default visibility.
    • hidden โ€” the symbol will have hidden visibility.
    • protected โ€” the symbol will have protected visibility.
    • file โ€” the symbol will be an STT_FILE symbol.
    • section โ€” the symbol will be an STT_SECTION symbol.
    • object โ€” the symbol will be an STT_OBJECT symbol.
    • function โ€” the symbol will be an STT_FUNC symbol.
    • indirect-function โ€” the symbol will be an STT_GNU_IFUNC symbol.

Also, these flags below are accepted but ignored (they're just there for vibes, honestly): debug, constructor, warning, indirect, synthetic, unique-object, before.

You can pass this one multiple times to add multiple symbols ๐Ÿซถ.

  • --allow-broken-links โ€” Lets llvm-objcopy remove sections even when that would leave invalid section references behind. Any invalid sh_link fields just get set to zero. Crisis averted โœจ.
  • --change-section-lma \*{+-}<val> โ€” Shifts the LMA of non-zero-sized segments by <val>.
  • --change-section-address <section>{=+-}<val>, --adjust-section-vma โ€” Changes the address of sections matching the <section> pattern to the specified value, or applies +<val>/-<val> to the current value. You can specify it multiple times for multiple patterns. Heads up: each section only gets modified by one --change-section-address argument. If a section name matches multiple patterns, the rightmost change wins. Oh and the object file needs to be of ET_REL type. Periodt.
  • --change-start <incr>, --adjust-start โ€” Adds <incr> to the program's start address. Can be specified multiple times, and the values get applied cumulatively. Math is mathing ๐Ÿ’….
  • --compress-debug-sections [<format>] โ€” Compresses DWARF debug sections in the output using the format you pick. Supported formats are zlib and zstd. If you omit <format>, it uses zlib.
  • --compress-sections <section>=<format> โ€” Compresses (or decompresses!) sections matched by <section> using the specified format. Supported formats are zlib and zstd. Say none for decompression. When a section is matched by multiple options, the last one wins. A wildcard <section> starting with ! is disallowed. And sections within a segment can't be (de)compressed at all. Sorry bestie ๐Ÿ˜ญ.
  • --decompress-debug-sections โ€” Decompresses any compressed DWARF debug sections in the output. Undoing the thing, iconic.
  • --discard-locals, -X โ€” Removes local symbols starting with .L from the output, but only the ones not referenced by relocations. Bye babes ๐Ÿ‘‹.
  • --extract-dwo โ€” Removes all sections from the output that are not DWARF .dwo sections.
  • --extract-main-partition โ€” Extracts the main partition from the output.
  • --extract-partition <name> โ€” Extracts the named partition from the output.
  • --gap-fill <value> โ€” For binary outputs, fills the gaps between sections with <value> instead of zero. The value must be an unsigned 8-bit integer โ€” no funny business ๐Ÿ”ฅ.
  • --input-target <format>, -I โ€” Reads the input as the specified format. Check out SUPPORTED FORMATS for the list of valid <format> values. If you don't specify it, llvm-objcopy will try to figure the format out automatically. She's intuitive like that ๐Ÿ’–.
  • --keep-file-symbols โ€” Keeps symbols of type STT_FILE, even when they'd otherwise be stripped. Protect them at all costs ๐Ÿซถ.
  • --keep-section <section> โ€” When sections are being removed from the output, don't remove sections named <section>. Can be specified multiple times to keep multiple sections.
  • --keep-symbol <symbol>, -K โ€” When symbols are being removed from the output, don't remove symbols named <symbol>. Can be specified multiple times to keep multiple symbols.
  • --keep-symbols <filename> โ€” When removing symbols from the output, don't remove the symbols named in the file <filename>. In that file, each line is a single symbol, with leading and trailing whitespace ignored, and anything following a # is ignored too. Can be specified multiple times to read names from multiple files ๐Ÿ“‹.
  • --localize-hidden โ€” Marks all symbols with hidden or internal visibility as local in the output.
  • --new-symbol-visibility <visibility> โ€” Sets the visibility of the symbols that get automatically created when you use binary input or --add-symbol. Valid options are:
    • default
    • hidden
    • internal
    • protected

The default is default.

  • --no-verify-note-sections โ€” When adding note sections, skips verifying whether the section format is valid. Living dangerously, love that for you ๐Ÿ™ˆ.
  • --output-target <format>, -O โ€” Writes the output as the specified format. See SUPPORTED FORMATS for the list of valid <format> values. If you don't specify it, the output format is assumed to be whatever you gave to --input-target, or if that option's also missing, the input file's format.
  • --pad-to <address> โ€” For binary outputs, pads the output to the load address <address> using a value of zero, or the value specified by --gap-fill.
  • --prefix-alloc-sections <prefix> โ€” Adds <prefix> to the front of the names of all allocatable sections in the output.
  • --prefix-symbols <prefix> โ€” Adds <prefix> to the front of every single symbol name in the output. Every one. No cap.
  • --preserve-dates, -p โ€” Preserves access and modification timestamps in the output. Time is a construct but okay โญ.
  • --remove-note [<name>/]<type> โ€” Removes notes of integer type <type> and name <name> from SHT_NOTE sections that aren't in a segment. Can be specified multiple times.
  • --rename-section <old>=<new>[,<flag>,...] โ€” Renames sections called <old> to <new> in the output, and applies any <flag> values you throw at it. Check --set-section-flags for the list of supported flags. Can be specified multiple times to rename multiple sections. Glow-up for your sections ๐Ÿ’….
  • --set-section-type <section>=<type> โ€” Sets the type of section <section> to the integer <type>. Can be specified multiple times to update multiple sections.
  • --set-start <addr> โ€” Sets the start address of the output to <addr>. This one overrides any previously specified --change-start or --adjust-start options. She said what she said ๐Ÿ‘‘.
  • --set-symbol-visibility <symbol>=<visibility> โ€” Changes the visibility of a symbol to the specified value.
  • --set-symbols-visibility <filename>=<visibility> โ€” Reads a list of symbols from <filename> and changes their visibility to the specified value. Visibility values: default, internal, hidden, protected.
  • --split-dwo <dwo-file> โ€” Exactly equivalent to running llvm-objcopy with --extract-dwo and <dwo-file> as the output file and no other options, and then running it with --strip-dwo on the input file. Two-for-one โœจ.
  • --strip-dwo โ€” Removes all DWARF .dwo sections from the output.
  • --strip-non-alloc โ€” Removes from the output all non-allocatable sections that aren't within segments.
  • --strip-sections โ€” Removes from the output all section headers and all section data not within segments. > Careful bestie: many tools will not be able to use an object without section headers. Like, at all. You've been warned ๐Ÿ’€.
  • --target <format>, -F โ€” Equivalent to setting both --input-target and --output-target for the specified format. See SUPPORTED FORMATS for the list of valid <format> values. Two birds, one stone ๐Ÿฆ‹.
  • --verify-note-sections โ€” When adding note sections, verifies whether the section format is valid. On by default, so you're already good ๐ŸŒธ.
  • --weaken-symbol <symbol>, -W โ€” Marks global symbols named <symbol> as weak symbols in the output. Can be specified multiple times to weaken multiple symbols.
  • --weaken-symbols <filename> โ€” Reads a list of names from the file <filename> and marks global symbols with those names as weak in the output. In the file, each line is a single symbol, with leading and trailing whitespace ignored, and anything following a # is ignored too. Can be specified multiple times to read names from multiple files.
  • --weaken โ€” Marks all defined global symbols as weak in the output. All of them. Whole squad, weakened ๐Ÿ”ฅ.

๐ŸŒˆ MACH-O-SPECIFIC OPTIONS ๐ŸŒˆ

  • --keep-undefined โ€” Keeps undefined symbols, even if they'd otherwise be stripped. Protecting her peace ๐Ÿซถ.

๐ŸŽ€ COFF-SPECIFIC OPTIONS ๐ŸŽ€

  • --subsystem <name>[:<version>] โ€” Sets the PE subsystem, and optionally the subsystem version if you give it after the colon.

๐Ÿ’œ SUPPORTED FORMATS ๐Ÿ’œ

So these are the values llvm-objcopy currently supports for the --input-target, --output-target, and --target options. And because GNU objcopy compatibility matters, all the values are bfdnames (iykyk).

  • binary
  • ihex
  • elf32-i386
  • elf32-x86-64
  • elf64-x86-64
  • elf32-iamcu
  • elf32-littlearm
  • elf64-aarch64
  • elf64-littleaarch64
  • elf32-littleriscv
  • elf64-littleriscv
  • elf32-powerpc
  • elf32-powerpcle
  • elf64-powerpc
  • elf64-powerpcle
  • elf32-bigmips
  • elf32-ntradbigmips
  • elf32-ntradlittlemips
  • elf32-tradbigmips
  • elf32-tradlittlemips
  • elf64-tradbigmips
  • elf64-tradlittlemips
  • elf32-sparc
  • elf32-sparcel
  • elf32-hexagon
  • elf32-loongarch
  • elf64-loongarch
  • elf64-s390

The following formats are supported by llvm-objcopy for the --output-target only:

  • srec

And one more little detail, bestie โ€” additionally, all targets except binary, ihex, and srec can have -freebsd as a suffix. Cute, right? ๐Ÿงš

๐Ÿงš BINARY INPUT AND OUTPUT ๐Ÿงš

okay so this is the โœจspecialโœจ mode and you need to know about it, bestie, because it's lowkey iconic.

  • If binary is the value you pass to --input-target, your input file gets embedded as a data section inside an ELF relocatable object ๐ŸŽ€ โ€” and it comes with three lil symbols:
    • _binary_<file_name>_start โ€” where the data starts ๐Ÿ‘‘
    • _binary_<file_name>_end โ€” where it ends ๐Ÿ’…
    • _binary_<file_name>_size โ€” how big it is ๐Ÿ“
  • about <file_name> rq: it's the path of the input file exactly as you specified it on the command line, except every non-alphanumeric character gets converted to _. no cap, that's the rule.
  • If binary is the value you pass to --output-target, the output file is a raw binary file containing the memory image of the input file ๐Ÿฆ‹. Symbols and relocation information? Gone. Discarded. Not invited to the party ๐Ÿ’€. The image starts at the address of the first loadable section in the output โ€” that's where it begins, periodt.

๐Ÿ’€ EXIT STATUS ๐Ÿ’€

  • If there's an error, llvm-objcopy exits with a non-zero exit code.
  • Otherwise? It exits with code 0. slay ๐Ÿ’–
fr fr, a non-zero exit code means something went wrong โ€” check your vibe (and your error output) before you trust the result ๐Ÿ™ˆ

๐Ÿ› BUGS ๐Ÿ›

Got a bug? Don't suffer in silence, bestie โ€” go tell the LLVM team:

https://github.com/llvm/llvm-project/labels/tools:llvm-objcopy/strip/
โš ๏ธ There is a known issue with --input-target and --target where only binary and ihex formats have any effect. Any other value will just be ignored, and llvm-objcopy will attempt to guess the input format instead ๐Ÿ˜ญ. So like, don't expect those other values to do anything โ€” iykyk.

๐ŸŒˆ SEE ALSO ๐ŸŒˆ

  • llvm-strip(1) <llvm-strip.html> โ€” the sibling, the other half of the duo ๐Ÿซถ

๐ŸŽ€ Author ๐ŸŽ€

Maintained by the LLVM Team (https://llvm.org/). iconic behaviour, honestly ๐Ÿ‘‘

2003-2026, LLVM Project โ€” yeah, they've been at it a minute ๐Ÿ’œ


okay that's the whole page, bestie โ€” you're officially a llvm-objcopy girlie now ๐Ÿ’…โœจ this was LLVM-OBJCOPY(1), version 23, dated 2026-10-20 โ€” go forth and copy some objects ๐Ÿฆ‹๐ŸŽ€๐ŸŒŸ

๐Ÿ“ฆ where this page comes from
  • arch rolling: llvm 23.1.4-1 ยท Apache-2.0 WITH LLVM-exception
  • ๐Ÿ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms