LLVM-NM(1)

✨ llvm-nm β€” list LLVM bitcode and object file's symbol table πŸ’…

okay so bestie, this is the llvm-nm page from the LLVM manual set β€” it's the tool that spills the tea on every symbol in your binaries, and honestly it's giving main character energy. let's get into it 🫢


🌸 SYNOPSIS 🌸

llvm-nm [options] [filenames...]

πŸ’– DESCRIPTION πŸ’–

The llvm-nm utility lists the names of symbols from LLVM bitcode files, object files, and archives. Each symbol gets listed along with some simple info about where it came from β€” like a little receipt for every symbol, iykyk. If you don't specify a filename, a.out is used as the input ✨. And if you use - as a filename, llvm-nm will read a file from its standard input stream.

llvm-nm's default output format is the traditional BSD nm output format. Each such output record is made of an (optional) 8-digit hexadecimal address, then a type code character, then a name, for each symbol. One record per line, fields separated by spaces. When the address is omitted, it's replaced by 8 spaces β€” lowkey a little ghost πŸ‘».

The supported type code characters are as follows. Where both lower and upper-case characters are listed for the same meaning, a lower-case character represents a local symbol, whilst an upper-case character represents a global (external) symbol:

  • a, A β€” Absolute symbol.
  • b, B β€” Uninitialized data (bss) object.
  • C β€” Common symbol. Multiple definitions link together into one definition.
  • d, D β€” Writable data object.
  • i, I β€” COFF: .idata symbol or symbol in a section with IMAGE_SCN_LNK_INFO set.
  • n β€” ELF: local symbol from non-alloc section. COFF: debug symbol.
  • N β€” ELF: debug section symbol, or global symbol from non-alloc section.
  • s, S β€” COFF: section symbol. Mach-O: absolute symbol or symbol from a section other than __TEXT_EXEC __text, __TEXT __text, __DATA __data, or __DATA __bss.
  • r, R β€” Read-only data object.
  • t, T β€” Code (text) object.
  • u β€” ELF: GNU unique symbol.
  • U β€” Named object is undefined in this file.
  • v β€” ELF: Undefined weak object. It is not a link failure if the object is not defined.
  • V β€” ELF: Defined weak object symbol. This definition will only be used if no regular definitions exist in a link. If multiple weak definitions and no regular definitions exist, one of the weak definitions will be used.
  • w β€” Undefined weak symbol other than an ELF object symbol. It is not a link failure if the symbol is not defined.
  • W β€” Defined weak symbol other than an ELF object symbol. This definition will only be used if no regular definitions exist in a link. If multiple weak definitions and no regular definitions exist, one of the weak definitions will be used.
  • - β€” Mach-O: N_STAB symbol.
  • ? β€” Something unrecognizable. (we've all been there πŸ’€)

Because LLVM bitcode files typically contain objects that are not considered to have addresses until they are linked into an executable image or dynamically compiled "just-in-time", llvm-nm does not print an address for any symbol in an LLVM bitcode file β€” even symbols which are defined in the bitcode file. no address for you, bestie, not yet anyway πŸŽ€


πŸ¦‹ OPTIONS πŸ¦‹

  • -B β€” Use BSD output format. Alias for --format=bsd.
  • -X β€” Specify the type of XCOFF object file, ELF object file, or IR object file input from command line or from archive files that llvm-nm should examine. The mode must be one of the following:
    • 32 β€” Process only 32-bit object files.
    • 64 β€” Process only 64-bit object files.
    • 32_64 β€” Process both 32-bit and 64-bit object files.
    • any β€” Process all the supported object files.

On AIX OS, the default is to process 32-bit object files only and to ignore 64-bit objects. The can be changed by setting the OBJECT_MODE environment variable. For example, OBJECT_MODE=64 causes llvm-nm to process 64-bit objects and ignore 32-bit objects. The -X flag overrides the OBJECT_MODE variable.

On other operating systems, the default is to process all object files: the OBJECT_MODE environment variable is not supported.

  • --debug-syms, -a β€” Show all symbols, even those usually suppressed.
  • --defined-only, -U β€” Print only symbols defined in this file.
  • --demangle, -C β€” Demangle symbol names.
  • --dynamic, -D β€” Display dynamic symbols instead of normal symbols.
  • --export-symbols β€” Print sorted symbols with their visibility (if applicable), with duplicates removed.
  • --extern-only, -g β€” Print only symbols whose definitions are external; that is, accessible from other files.
  • --format=<format>, -f β€” Select an output format; format may be sysv, posix, darwin, bsd or just-symbols. The default is bsd.
  • --help, -h β€” Print a summary of command-line options and their meanings.
  • -j β€” Print just the symbol names. Alias for --format=just-symbols.
  • --line-numbers, -l β€” Use debugging information to print the filenames and line numbers where symbols are defined. Undefined symbols have the location of their first relocation printed instead.
  • -m β€” Use Darwin format. Alias for --format=darwin.
  • --no-demangle β€” Don't demangle symbol names. This is the default.
  • --no-llvm-bc β€” Disable the LLVM bitcode reader.
  • --no-sort, -p β€” Show symbols in the order encountered.
  • --no-weak, -W β€” Don't print weak symbols.
  • --numeric-sort, -n, -v β€” Sort symbols by address.
  • --portability, -P β€” Use POSIX.2 output format. Alias for --format=posix.
  • --print-armap β€” Print the archive symbol table, in addition to the symbols.
  • --print-file-name, -A, -o β€” Precede each symbol with the file it came from.
  • --print-size, -S β€” Show symbol size as well as address (not applicable for Mach-O).
  • --quiet β€” Suppress 'no symbols' diagnostic.
  • --radix=<RADIX>, -t β€” Specify the radix of the symbol address(es). Values accepted are d (decimal), x (hexadecimal) and o (octal).
  • --reverse-sort, -r β€” Sort symbols in reverse order.
  • --size-sort β€” Sort symbols by size.
  • --special-syms β€” Do not filter special symbols from the output.
  • --undefined-only, -u β€” Print only undefined symbols.
  • --version, -V β€” Display the version of the llvm-nm executable, then exit. Does not stack with other commands.
  • @<FILE> β€” Read command-line options from response file <FILE>.

πŸ“ MACH-O SPECIFIC OPTIONS πŸ“

  • --add-dyldinfo β€” Add symbols from the dyldinfo, if they are not already in the symbol table. This is the default.
  • --add-inlinedinfo β€” Add symbols from the inlined libraries, TBD file inputs only.
  • --arch=<arch1[,arch2,...]> β€” Dump the symbols from the specified architecture(s).
  • --dyldinfo-only β€” Dump only symbols from the dyldinfo.
  • --no-dyldinfo β€” Do not add any symbols from the dyldinfo.
  • -s <segment> <section> β€” Dump only symbols from this segment and section name.
  • -x β€” Print symbol entry in hex.

🧚 XCOFF SPECIFIC OPTIONS 🧚

  • --no-rsrc β€” Exclude resource file symbols (__rsrc) from export symbol list.

πŸ’€ BUGS πŸ’€

  • llvm-nm does not support the full set of arguments that GNU nm does. (not me having a smaller flag closet than GNU 😭)

⭐ EXIT STATUS ⭐

llvm-nm exits with an exit code of zero. that's it. slay, no drama, always zero πŸ’…


🌈 SEE ALSO 🌈

llvm-ar(1), llvm-objdump(1), llvm-readelf(1), llvm-readobj(1)


πŸ‘‘ AUTHOR πŸ‘‘

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


2003-2025, LLVM Project


k that's the whole page bestie, go read some symbol tables, the vibes are immaculate πŸ¦‹βœ¨

mwah πŸ’‹ β€” this lil page is from LLVM version 19, dated 2025-01-17, and it's brought to you by the LLVM Project (2003-2025). go forth and nm responsibly 🫢

πŸ“¦ where this page comes from