LD.LLD(1)
๐ NAME ๐
ld.lld โ ELF linker from the LLVM project. (Yes bestie, this is the ld.lld(1) page and she's literally the moment. ๐
)
โจ SYNOPSIS โจ
ld.lld [options] objfile ...
๐ DESCRIPTION ๐
Okay so picture this: a linker is the friend who takes all your object, archive, and library files and combines them into one output file โ could be an executable, a shared library, or another object file. She relocates code and data from the input files and resolves symbol references between them. It's giving matchmaker, but for symbols. ๐
ld.lld is a drop-in replacement for the GNU BFD and gold linkers. She accepts most of the same command line arguments and linker scripts as GNU linkers. No cap, she just slides right in. โจ
Right now ld.lld supports these targets: i386, x86-64, ARM, AArch64, LoongArch, PowerPC32, PowerPC64, MIPS32, MIPS64, RISC-V, AMDGPU, Hexagon and SPARC V9. And get this โ ld.lld acts as a Microsoft link.exe-compatible linker if invoked as lld-link, and as macOS's ld if invoked as ld.ld64. All these targets are always supported however ld.lld was built, so you can always use ld.lld as a native linker as well as a cross linker. Versatility? She invented it. ๐
๐ OPTIONS ๐
Many options have both a single-letter and long form. When using the long form options other than those beginning with the letter o may be specified using either one or two dashes preceding the option name. Long options beginning with o require two dashes to avoid confusion with the -o path option. (So like, don't be messy with the dashes, bestie. ๐)
--allow-multiple-definitionโ Do not error if a symbol is defined multiple times. The first definition will be used.--allow-shlib-undefinedโ Allow unresolved references in shared libraries. This option is enabled by default when linking a shared library.--apply-dynamic-relocsโ Apply link-time values for dynamic relocations.--as-neededโ Only setDT_NEEDEDfor shared libraries if used.--auxiliary=valueโ Set theDT_AUXILIARYfield to the specified name.--Bdynamic,--dyโ Link against shared libraries.--Bstatic,--static,--dnโ Do not link against shared libraries.-Bno-symbolicโ Don't bind default visibility defined symbols locally for-shared(default).-Bsymbolicโ Bind default visibility defined symbols locally for-shared. Also set theDF_SYMBOLICflag.-Bsymbolic-non-weakโ Bind default visibility definedSTB_GLOBALsymbols locally for-shared.-Bsymbolic-functionsโ Bind default visibility defined function symbols locally for-shared.-Bsymbolic-non-weak-functionsโ Bind default visibility definedSTB_GLOBALfunction symbols locally for-shared.---be8โ Write a Big Endian ELF File using BE8 format(AArch32 only). (Yes, that's three dashes. She's extra. ๐ )--build-id=valueโ Generate a build ID note.valuemay be one offast,md5,sha1,tree,uuid,0xhex-string, andnone.treeis an alias forsha1. Build-IDs of typefast,md5,sha1, andtreeare calculated from the object contents.fastis not intended to be cryptographically secure. (So like, don't use it for your secret diary, bestie. ๐)--build-idโ Synonym for--build-id=fast.--call-graph-profile-sort=algorithmโalgorithmmay be:noneโ Ignore call graph profile.hfsortโ Use hfsort.cdsortโ Use cdsort (default).
--color-diagnostics=valueโ Use colors in diagnostics.valuemay be one ofalways,auto, andnever.autoenables color if and only if output is to a terminal.--color-diagnosticsโ Alias for--color-diagnostics=auto.--compress-debug-sections=valueโ Compress DWARF debug sections.valuemay be:noneโ No compression.zlibโ The default compression level is 1 (fastest) as the debug info usually compresses well at that level. If you want to compress it more, you can specify-O2to set the compression level to 6.zstdโ The compression level is 5.
--crefโ Output cross reference table. If-Mapis specified, print to the map file.--defsym=symbol=expressionโ Define a symbol alias.expressionmay be another symbol or a linker script expression. For example,--defsym=foo=baror--defsym=foo=bar+0x100.--demangleโ Demangle symbol names.--disable-new-dtagsโ Disable new dynamic tags.--discard-all,-xโ Delete all local symbols.--discard-locals,-Xโ Delete temporary local symbols.--discard-noneโ Keep all symbols in the symbol table.--dynamic-linker=valueโ Specify the dynamic linker to be used for a dynamically linked executable. This is recorded in an ELF segment of typePT_INTERP.--dynamic-list=fileโ Similar to--export-dynamic-symbol-list. When creating a shared object, implies-Bsymbolicbut does not setDF_SYMBOLIC--EBโ Select the big-endian format in theOUTPUT_FORMATcommand.--ELโ Select the little-endian format in theOUTPUT_FORMATcommand.--eh-frame-hdrโ Request creation of.eh_frame_hdrsection andPT_GNU_EH_FRAMEsegment header.--emit-relocs,-qโ Generate relocations in the output.--enable-new-dtagsโ Enable new dynamic tags.--end-libโ End a grouping of objects that should be treated as if they were together in an archive.--entry=entryโ Name of entry point symbol.--error-limit=valueโ Maximum number of errors to emit before stopping. A value of zero indicates that there is no limit.--error-unresolved-symbolsโ Report unresolved symbols as errors.--error-handing-script=script_pathโ Call scriptscript_pathupon some error, withtagas first argument, and an extra parameter as second argument. The script is expected to return 0 on success. Any other value is considered a generic error.tagmay bemissing-libfollowed by the name of the missing library.undefined-symbolfollowed by the name of the undefined symbol. (Yes, it says "handing" not "handling" โ we don't make the rules, bestie. ๐ญ)--execute-onlyโ Mark executable sections unreadable. This option is currently only supported on AArch64.--exclude-libs=valueโ Exclude static libraries from automatic export.--export-dynamic,-Eโ Put symbols in the dynamic symbol table.--export-dynamic-symbol=globโ (executable) Put matched non-local defined symbols to the dynamic symbol table. (shared object) References to matched non-localSTV_DEFAULTsymbols shouldn't be bound to definitions within the shared object even if they would otherwise be due to-Bsymbolic,-Bsymbolic-functionsor--dynamic-list--export-dynamic-symbol-list=fileโ Read a list of dynamic symbol patterns fromfile. Apply--export-dynamic-symbolon each pattern.--fatal-warningsโ Treat warnings as errors.--filter=value,-F valueโ Set theDT_FILTERfield to the specified value.--fini=symbolโ Specify a finalizer function.--format=input-format,-b input-formatโ Specify the format of the inputs following this option.input-formatmay be one ofbinary,elf, anddefault.defaultis a synonym forelf.--gc-sectionsโ Enable garbage collection of unused sections.--gdb-indexโ Generate.gdb_indexsection.--hash-style=valueโ Specify hash style.valuemay besysv,gnu, orboth.bothis the default.--helpโ Print a help message.--icf=allโ Enable identical code folding.--icf=safeโ Enable safe identical code folding.--icf=noneโ Disable identical code folding.--ignore-data-address-equalityโ Ignore address equality of data. C/C++ requires each data to have a unique address. This option allows lld to do unsafe optimization that breaks the requirement: create copies of read-only data or merge two or more read-only data that happen to have the same value. (Unsafe, bestie. She said what she said. โ ๏ธ)--ignore-function-address-equalityโ Ignore address equality of functions. This option allows non-PIC calls to a function with non-default visibility in a shared object. The function may have different addresses within the executable and within the shared object.--image-base=valueโ Set the base address tovalue.--init=symbolโ Specify an initializer function.--keep-unique=symbolโ Do not fold symbol during ICF.-l libName,--library=libNameโ Root name of library to use.-L dir,--library-path=dirโ Add a directory to the library search path.--lto-aa-pipeline=valueโ AA pipeline to run during LTO. Used in conjunction with--lto-newpm-passes.--lto-newpm-passes=valueโ Passes to run during LTO.--lto-Oopt-levelโ Optimization level for LTO.--lto-partitions=valueโ Number of LTO codegen partitions.-m valueโ Set target emulation.--Map=file,-M fileโ Print a link map tofile.--nmagic,-nโ Do not page align sections, link against static libraries.--no-allow-shlib-undefinedโ Do not allow unresolved references in shared libraries. This option is enabled by default when linking an executable.--no-as-neededโ Always setDT_NEEDEDfor shared libraries.--no-color-diagnosticsโ Do not use colors in diagnostics.--no-demangleโ Do not demangle symbol names.--no-dynamic-linkerโ Inhibit output of an.interpsection.--no-fortran-commonโ Do not search archive members for definitions to override COMMON symbols.--no-gc-sectionsโ Disable garbage collection of unused sections.--no-gnu-uniqueโ DisableSTB_GNU_UNIQUEsymbol binding.--no-merge-exidx-entriesโ Disable merging.ARM.exidxentries.--no-nmagicโ Page align sections.--no-omagicโ Do not set the text data sections to be writable, page align sections.--no-relaxโ Disable target-specific relaxations. For x86-64 this disablesR_X86_64_GOTPCRELXandR_X86_64_REX_GOTPCRELXGOT optimization.--no-rosegmentโ Do not put read-only non-executable sections in their own segment.--undefined-versionโ Do not report version scripts that refer to undefined symbols.--no-undefinedโ bestie, this one reports unresolved symbols even if the linker is busy creating a shared library. no hiding, we're being strict โจ--no-warn-symbol-orderingโ do not warn about problems with the symbol ordering file or the call graph profile. silence is golden ๐--no-warnings,-wโ suppress warnings, and cancel out--fatal-warningswhile you're at it.--no-whole-archiveโ restores the default behavior of loading archive members. we're back to normal, periodt ๐--no-pie,--no-pic-executableโ do not create a position independent executable.--noinhibit-execโ retain the executable output file whenever it's still usable. keep the artifact, queen ๐--nostdlibโ only search directories specified on the command line. nowhere else, no extras.-o pathโ write the output executable, library, or object to path. if you don't specify it,a.outis used as a default. iconic default behavior, honestly ๐ธ-Ovalueโ optimize output file size. value may be:0โ disable string merging.1โ enable string merging.2โ enable string tail merging. if--compress-debug-sectionsis given, compress debug sections at compression level 6 instead of 1.
-O1 is the default. so if you say nothing, you get 1 ๐ฆ
--oformat=formatโ specify the format for the output object file. the only supported format isbinary, which produces output with no ELF header. that's the whole list, fr fr.--omagic,-Nโ set the text and data sections to be readable and writable, don't page align sections, and link against static libraries.--opt-remarks-filename fileโ write optimization remarks in YAML format to file.--opt-remarks-passes pass-regexโ filter optimization remarks by only allowing the passes matching pass-regex.--opt-remarks-with-hotnessโ include hotness information in the optimization remarks file. spicy metadata ๐ฅ--orphan-handling=modeโ control how orphan sections are handled. an orphan section is one that's not specifically mentioned in a linker script (sad, unclaimed, we love them anyway ๐ฅบ). mode may be:placeโ place orphan sections in suitable output sections.warnโ place orphan sections as forplace, and also report a warning.errorโ place orphan sections as forplace, and also report an error.
place is the default.
--pack-dyn-relocs=formatโ pack dynamic relocations in the given format. format may be:noneโ do not pack. dynamic relocations are encoded inSHT_REL(A).androidโ pack dynamic relocations inSHT_ANDROID_REL(A).relrโ pack relative relocations inSHT_RELR, and the rest of dynamic relocations inSHT_REL(A).android+relrโ pack relative relocations inSHT_RELR, and the rest of dynamic relocations inSHT_ANDROID_REL(A).
none is the default. and if --use-android-relr-tags is specified, use SHT_ANDROID_RELR instead of SHT_RELR.
--pic-veneerโ always generate position independent thunks.--pie,--pic-executableโ create a position independent executable.--power10-stubs=modeโ whether to use Power10 instructions in call stubs forR_PPC64_REL24_NOTOCand TOC/NOTOC interworking. mode may be:yesโ (default) use.autoโ currently the same asyes.noโ don't use.
--print-gc-sectionsโ list removed unused sections. bye bye, garbage ๐๏ธ--print-icf-sectionsโ list identical folded sections.--print-mapโ print a link map to the standard output.--print-archive-stats=fileโ write archive usage statistics to the specified file. print the numbers of members and fetched members for each archive.--push-stateโ save the current state of--as-needed,--static, and--whole-archive. little save point, like a video game ๐ฎ--pop-stateโ restore the states saved by--push-state. load that save file back up.---relax-gpโ enable global pointer relaxation for RISC-V. (yes, three dashes, that's not a typo bestie, copy it exactly ๐)--relocatable,-rโ create relocatable object file.--remap-inputs=from-glob=to-fileโ input files matching from-glob are mapped to to-file. use/dev/nullto ignore an input file. love a glow-up for your inputs โจ--remap-inputs-file=fileโ remap input files based on patterns in file. each line in the remap file is of the formatfrom-glob=to-fileor a comment starting with#.--reproduce=pathโ write a tar file to path, containing all the input files needed to reproduce the link, a text file calledresponse.txtcontaining the command line options, and a text file calledversion.txtcontaining the output ofld.lld --version. the archive, when unpacked, can be used to re-run the linker with the same options and input files. it's giving time capsule ๐ฐ๏ธ--retain-symbols-file=fileโ retain only the symbols listed in file.--rpath=value,-R valueโ add aDT_RUNPATHto the output.--rsp-quoting=valueโ quoting style for response files. the supported values arewindowsandposix.--script=file,-T fileโ read linker script from file. if multiple linker scripts are given, they are processed as if they were concatenated in the order they appeared on the command line.--section-start=section=addressโ set address of section.--shared,--Bsharableโ build a shared object. (and yes,--Bsharableis spelled exactly like that, don't come for me ๐)--shuffle-sections=seedโ shuffle matched sections using the given seed before mapping them to the output sections. if-1, reverse the section order. if0, use a random seed. chaotic and I respect it ๐--soname=value,-h valueโ setDT_SONAMEto value.--sort-commonโ this option is ignored for GNU compatibility. it's just there, vibing, doing nothing ๐ซถ--sort-section=valueโ specifies sections sorting rule when linkerscript is used.--start-libโ start a grouping of objects that should be treated as if they were together in an archive.--strip-all,-sโ strip all symbols. implies--strip-debug.--strip-debug,-Sโ strip debugging information.--symbol-ordering-file=fileโ lay out sections in the order specified by file.--sysroot=valueโ set the system root.--target1-absโ interpretR_ARM_TARGET1asR_ARM_ABS32.--target1-relโ interpretR_ARM_TARGET1asR_ARM_REL32.--target2=typeโ interpretR_ARM_TARGET2as type, where type is one ofrel,abs, orgot-rel.--Tbss=valueโ same as--section-startwith.bssas the sectionname.--Tdata=valueโ same as--section-startwith.dataas the sectionname.--Ttext=valueโ same as--section-startwith.textas the sectionname.--thinlto-cache-dir=valueโ path to ThinLTO cached object file directory.--thinlto-cache-policy=valueโ pruning policy for the ThinLTO cache.--thinlto-jobs=valueโ number of ThinLTO jobs.--threads=Nโ number of threads.all(default) means all of concurrent threads supported.1disables multi-threading. parallelize, bestie ๐ง--fat-lto-objectsโ use the.llvm.ltosection, which contains LLVM bitcode, in fat LTO object files to perform LTO.--no-fat-lto-objectsโ ignore the.llvm.ltosection in relocatable object files (default).--time-traceโ record time trace. โฑ๏ธ--time-trace-file=fileโ write time trace output to file.--time-trace-granularity=valueโ minimum time granularity (in microseconds) traced by time profiler.--traceโ print the names of the input files.--trace-symbol=symbol,-y symbolโ trace references to symbol. following it around like a stan ๐--undefined=symbol,-u symbolโ if symbol is not defined after symbol resolution, and there's a static library that contains an object file defining the symbol, load the member to include the object file in the output file.--undefined-glob=patternโ synonym for--undefined, except that it takes a glob pattern. in a glob pattern,*matches zero or more characters,?matches any single character, and[...]matches the characters within brackets. all symbols that match a given pattern are handled as if they were given as arguments of--undefined.--uniqueโ creates a separate output section for every orphan input section.--unresolved-symbols=valueโ determine how to handle unresolved symbols.--use-android-relr-tagsโ useSHT_ANDROID_RELR/DT_ANDROID_RELR*tags instead ofSHT_RELR/DT_RELR*.-v,-Vโ display the version number and proceed with linking if object files are specified.--versionโ display the version number and exit.--verboseโ verbose mode. tell me everything, I'm nosy ๐--version-script=fileโ read version script from file.--warn-backrefsโ warn about reverse or cyclic dependencies to or between static archives. this can be used to ensure linker invocation remains compatible with traditional Unix-like linkers.--warn-backrefs-exclude=globโ glob describing an archive (or an object file within--start-lib) which should be ignored for--warn-backrefs.--warn-commonโ warn about duplicate common symbols.--warn-ifunc-textrelโ warn about using ifunc symbols in conjunction with text relocations. older versions of glibc library (2.28 and earlier) has a bug that causes the segment that includes ifunc symbols to be marked as not executable when they are relocated. as a result, although the program compiles and links successfully, it gives a segmentation fault when the instruction pointer reaches an ifunc symbol. use-warn-ifunc-textrelto let lld give a warning, if the code may include ifunc symbols, may do text relocations and be linked with an older glibc version. otherwise, there is no need to use it, as the default value does not give a warning. this flag has been introduced in late 2018, has no counter part in ld and gold linkers, and may be removed in the future.
ok that one is a whole saga ๐ญ read it twice, it's literally a real segfault warning. not a drill.
--warn-unresolved-symbolsโ report unresolved symbols as warnings.--whole-archiveโ force load of all members in a static library.--why-extract=fileโ print to a file about why archive members are extracted. the receipts, finally ๐งพ--wrap=symbolโ redirect symbol references to__wrap_symboland__real_symbolreferences to symbol.-z optionโ linker option extensions.
okay so the -z option list keeps going, bestie โ no skips, periodt: ๐
dead-reloc-in-nonalloc=section_glob=valueโ resolve a relocation in a matched non-SHF_ALLOCsection that references a discarded symbol to value. It accepts globs, and if a section matches more than one option, the last option takes precedence. An order of least specific to most specific match is recommended. ๐ฆexecstackโ make the main stack executable. Stack permissions are recorded in thePT_GNU_STACKsegment. ๐ซถbti-report=[none|warning|error]โ specify how to report the missingGNU_PROPERTY_AARCH64_FEATURE_1_BTIproperty.noneis the default, so the linker will not report the missing property; otherwise it will be reported as a warning or an error. โจcet-report=[none|warning|error]โ same energy, but for the missingGNU_PROPERTY_X86_FEATURE_1_IBTorGNU_PROPERTY_X86_FEATURE_1_SHSTKproperties.noneis the default, so the linker will not report the missing property; otherwise it will be reported as a warning or an error. ๐force-btiโ force-enable AArch64 BTI instruction in PLT, and warn if an input ELF file does not have theGNU_PROPERTY_AARCH64_FEATURE_1_BTIproperty. ๐force-ibtโ force-enable Intel Indirect Branch Tracking in PLT, and warn if an input ELF file does not have theGNU_PROPERTY_X86_FEATURE_1_IBTproperty. ๐ฆglobalโ sets theDF_1_GLOBALflag in theDYNAMICsection. Different loaders can decide how to handle this flag on their own. no cap. ๐ifunc-nopltโ do not emit PLT entries for ifunc symbols. Instead, emit text relocations referencing the resolver. This is an experimental optimization and only suitable for standalone environments where text relocations do not have the usual drawbacks. This option must be combined with the-z notextoption. ๐งinitfirstโ sets theDF_1_INITFIRSTflag to indicate the module should be initialized first. ๐ธinterposeโ set theDF_1_INTERPOSEflag to indicate to the runtime linker that the object is an interposer. During symbol resolution, interposers are searched after the application but before other dependencies. ๐muldefsโ do not error if a symbol is defined multiple times. The first definition will be used. This is a synonym for--allow-multiple-definition. ๐ฅnocombrelocโ disable combining and sorting multiple relocation sections. ๐nocopyrelocโ disable the creation of copy relocations. ๐ฆnodefaultlibโ set theDF_1_NODEFLIBflag to indicate that default library search paths should be ignored. ๐nodeleteโ set theDF_1_NODELETEflag to indicate that the object cannot be unloaded from a process. ๐ซถnodlopenโ set theDF_1_NOOPENflag to indicate that the object may not be opened bydlopen(3). ๐ญnognustackโ do not emit thePT_GNU_STACKsegment. ๐norelroโ do not indicate that portions of the object should be mapped read-only after initial relocation processing. The object will omit thePT_GNU_RELROsegment. ๐notextโ allow relocations against read-only segments. Sets theDT_TEXTRELflag in theDYNAMICsection. ๐nowโ set theDF_BIND_NOWflag to indicate that the run-time loader should perform all relocation processing as part of object initialization. By default, relocations may be performed on demand. โญoriginโ set theDF_ORIGINflag to indicate that the object requires$ORIGINprocessing. ๐pac-pltโ AArch64 only, use pointer authentication in PLT. ๐pack-relative-relocsโ similar to-pack-dyn-relocs=relr, but synthesizes theGLIBC_ABI_DT_RELRversion dependency if there is aGLIBC_2.*version dependency.glibc ld.sorejects loading a dynamically linked object without theGLIBC_ABI_DT_RELRversion dependency. ๐ฆrelโ use REL format for dynamic relocations. ๐relaโ use RELA format for dynamic relocations. โจretpolinepltโ emit retpoline format PLT entries as a mitigation forCVE-2017-5715. ๐ฅrodynamicโ make the.dynamicsection read-only. TheDT_DEBUGtag will not be emitted. ๐separate-loadable-segments,separate-code,noseparate-codeโ specify whether two adjacentPT_LOADsegments are allowed to overlap in pages.noseparate-code(default) allows overlap.separate-codeallows overlap between two executable segments, or two non-executable segments.separate-loadable-segmentsdisallows overlap. ๐shstkโ x86 only, use shadow stack. ๐ธstack-size=sizeโ set the main thread's stack size to size. The stack size is recorded as the size of the size.PT_GNU_STACKprogram segment. ๐ซถstart-stop-gcโ don't let__start_/__stop_references retain the associated C identifier name sections (default). ๐nostart-stop-gcโ let__start_/__stop_references retain the associated C identifier name sections. ๐ฆtextโ do not allow relocations against read-only segments. This is the default. โญwxneededโ create aPT_OPENBSD_WXNEEDEDsegment. ๐
๐ธ ENVIRONMENT VARIABLES ๐ธ
LLD_REPRODUCEโ create a reproduce tarball with the specified filename. If--reproduceis specified,--reproducetakes precedence. ๐LLD_VERSIONโld.lldcreates a section named.commentcontaining the LLD version string. The version string can be overridden by this environment variable, which is useful to eliminate differences in the binary caused by LLD version number differences. ๐
๐ง IMPLEMENTATION NOTES ๐ง
okay so ld.lld's handing of archive files (those with a .a file extension) is different from traditional linkers used on Unix-like systems. ๐
Traditional linkers maintain a set of undefined symbols during linking. The linker processes each file in the order in which it appears on the command line, until the set of undefined symbols becomes empty. An object file is linked into the output object when it is encountered, with its undefined symbols added to the set. Upon encountering an archive file, a traditional linker searches the objects contained therein, and processes those that satisfy symbols in the unresolved set. ๐ง
Handling mutually dependent archives may be awkward when using a traditional linker. Archive files may have to be specified multiple times, or the special command line options --start-group and --end-group may be used to have the linker loop over the files in the group until no new symbols are added to the set. ๐ญ
ld.lld records all symbols found in objects and archives as it iterates over command line arguments. When ld.lld encounters an undefined symbol that can be resolved by an object file contained in a previously processed archive file, it immediately extracts and links it into the output object. ๐
With certain archive inputs, ld.lld may produce different results compared to traditional linkers. In practice, large bodies of third party software have been linked with ld.lld without material issues. ๐ฅ
The --warn-backrefs option may be used to identify a linker invocation that may be incompatible with traditional Unix-like linker behavior. โญ
and that's a wrap! this page came from Debian, dated Jul 25, 2023, and it's LD.LLD(1). slay. ๐
๐ฆ where this page comes from
- debian trixie: lld-18 1:18.1.8-18+b1 ยท APACHE-2-LLVM-EXCEPTIONS
- ubuntu noble: lld-18 1:18.1.3-1 ยท APACHE-2-LLVM-EXCEPTIONS
- ubuntu noble: lld-18 1:18.1.3-1ubuntu1 ยท APACHE-2-LLVM-EXCEPTIONS
- ubuntu questing: lld-18 1:18.1.8-18ubuntu2
- ubuntu resolute: lld-18 1:18.1.8-20ubuntu8 ยท APACHE-2-LLVM-EXCEPTIONS
- ubuntu stonking: lld-18 1:18.1.8-20ubuntu11 ยท APACHE-2-LLVM-EXCEPTIONS
- ๐ the page's license: Apache-2.0 WITH LLVM-exception
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms