| Toolchains | https://www.toolchains.net/ |
| GCC | https://gcc.gnu.org |
| Git | https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git |
| GDB | https://www.gnu.org/software/gdb/ |
| Git | https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git |
| Binutils | https://www.gnu.org/software/binutils/ |
| Git | https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git |
| LLVM | https://llvm.org |
| Git | https://github.com/llvm/llvm-project/ |
| LLDB | https://lldb.llvm.org |
| Clang | https://clang.llvm.org |
| LLD | https://lld.llvm.org |
| Binutils Porting Guide To A New Target/Processor Architecture | https://sourceware.org/binutils/binutils-porting-guide.txt |
| How To Retarget the GNU Toolchain in 21 Patches | https://atgreen.github.io/ggx/ |
| GCC under the hood | https://gotplt.org/posts/gcc-under-the-hood.html |
| Everything I know about GNU toolchain | https://maskray.me/blog/2021-01-24-gnu-toolchain |
| The Architecture of Open Source Applications (Volume 2): GDB | https://aosabook.org/en/v2/gdb.html |
| GCC profiler internals | https://trofi.github.io/posts/243-gcc-profiler-internals.html |
| GCC for New Contributors | https://gcc-newbies-guide.readthedocs.io/en/latest/ |
| GCC Wiki | https://gcc.gnu.org/wiki/ |
| GNU Toolchain sourceware buildbot | https://builder.sourceware.org |
| Writing a GCC plugin in Python | https://kristerw.github.io/2022/10/20/gcc-python-plugin/ |
| Verifying GCC optimizations using an SMT solver | https://kristerw.github.io/2022/11/01/verifying-optimizations/ |
| GCC specs: an introduction | https://wozniak.ca/blog/2024/01/02/1/ |
| GCC specs for those deeply interested | https://wozniak.ca/blog/2024/01/09/1/ |
| The Architecture of Open Source Applications: LLVM | https://aosabook.org/en/v1/llvm.html |
| LLVM for Grad Students | https://www.cs.cornell.edu/~asampson/blog/llvm.html |
| Creating an LLVM Backend for the Cpu0 Architecture | https://jonathan2251.github.io/lbd/ |
| Let's Work on an LLVM Superoptimizer | https://blog.regehr.org/archives/1109 |
| Souper | https://github.com/google/souper |
| clang-tutor | https://github.com/banach-space/clang-tutor |
| llvm-tutor | https://github.com/banach-space/llvm-tutor |
| A Tourist's Guide to the LLVM Source Code | https://blog.regehr.org/archives/1453 |
| LLD from a user's perspective | https://archive.fosdem.org/2017/schedule/event/lld/ |
| What makes LLD so fast? | https://archive.fosdem.org/2019/schedule/event/llvm_lld/ |
| The LLVM Lexicon | https://llvm.org/docs/Lexicon.html |
| LLVM internals, part 1: the bitcode format | https://blog.yossarian.net/2021/07/19/LLVM-internals-part-1-bitcode-format |
| LLVM internals, part 2: parsing the bitstream | https://blog.yossarian.net/2021/08/10/LLVM-internals-part-2-parsing-the-bitstream |
| LLVM internals, part 3: from bitcode to IR | https://blog.yossarian.net/2021/09/14/LLVM-internals-part-3-from-bitcode-to-IR |
| LLVM internals, part 4: attributes and attribute groups | https://blog.yossarian.net/2021/11/29/LLVM-internals-part-4-attributes-and-attribute-groups |
| LLVM Passes for Security 101: A Brief Introduction (Part 1/4) | https://elmanto.github.io/posts/llvm_for_security_1_4 |
| LLVM Passes for Security 101: Static Analysis (Part 2/4) | https://elmanto.github.io/posts/llvm_for_security_2_4 |
| LLVM Passes for Security 101: Our First Transformation Pass (Part 3/4) | https://elmanto.github.io/posts/llvm_for_security_3_4 |
| LLVM Passes for Security 101: Passes for Fuzzing (Part 4/4) | https://elmanto.github.io/posts/llvm_for_security_4_4 |
| Lanai, the mystery CPU architecture in LLVM | https://q3k.org/lanai.html |
| Compilers and IRs: LLVM IR, SPIR-V, and MLIR | https://www.lei.chat/posts/compilers-and-irs-llvm-ir-spirv-and-mlir/ |
| LLVM: The middle-end optimization pipeline | https://www.npopov.com/2023/04/07/LLVM-middle-end-pipeline.html |
| LLVM: Canonicalization and target-independence | https://www.npopov.com/2023/04/10/LLVM-Canonicalization-and-target-independence.html |
| LLVM: Scalar evolution | https://www.npopov.com/2023/10/03/LLVM-Scalar-evolution.html |
| MLIR For Beginners | https://github.com/j2kun/mlir-tutorial |
| A deep dive into Clang's source file compilation | https://maskray.me/blog/2023-09-24-a-deep-dive-into-clang-source-file-compilation |
| Tools for Learning LLVM TableGen | https://blog.llvm.org/posts/2023-12-07-tools-for-learning-llvm-tablegen/ |
| Crosstool-NG | https://crosstool-ng.github.io |
| OSXCross | https://github.com/tpoechtrager/osxcross |
| PDF | https://refspecs.linuxfoundation.org/elf/TIS1.1.pdf |
| PDF | https://refspecs.linuxfoundation.org/elf/elf.pdf |
| ELF for the Arm Architecture | https://github.com/ARM-software/abi-aa/blob/main/aaelf32/aaelf32.rst |
| ELF for the Arm 64-bit Architecture (AArch64) | https://github.com/ARM-software/abi-aa/blob/main/aaelf64/aaelf64.rst |
| LSB 5: Executable And Linking Format (ELF) | https://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/elf-generic.html |
| elf(5) | https://man7.org/linux/man-pages/man5/elf.5.html |
| NetBSD vendor-specific ELF Note Elements | https://www.netbsd.org/docs/kernel/elf-notes.html |
| How programs get run: ELF binaries | https://lwn.net/Articles/631631/ |
| ELF's Linker's and other magical creatures | https://page-fault.io/kernel/2018/07/28/Elfs_Linkers_Other |
| ELF: symbol lookup via DT_HASH | https://flapenguin.me/elf-dt-hash |
| ELF: better symbol lookup via DT_GNU_HASH | https://flapenguin.me/elf-dt-gnu-hash |
| How to execute an object file: Part 1 | https://blog.cloudflare.com/how-to-execute-an-object-file-part-1/ |
| How to execute an object file: Part 2 | https://blog.cloudflare.com/how-to-execute-an-object-file-part-2/ |
| How to execute an object file: Part 3 | https://blog.cloudflare.com/how-to-execute-an-object-file-part-3/ |
| About ELF Auxiliary Vectors | https://articles.manugarg.com/aboutelfauxiliaryvectors.html |
| The Missing Link: Explaining ELF Static Linking, Semantically | https://www.cl.cam.ac.uk/~pes20/rems/papers/oopsla-elf-linking-2016.pdf |
| The Cost Of ELF Symbol Hashing | https://www.linker-aliens.org/blogs/ali/entry/the_cost_of_elf_symbol/ |
| Executable shared ELF files | https://stoppels.ch/2022/08/20/executable-shared-libraries.html |
| ELF introspection, robustly and portably | https://www.humprog.org/~stephen/blog/devel/elf-introspection.html |
| ELF dynamic linking: a brief introduction | https://www.humprog.org/~stephen/blog/devel/elf-dynamic-linking-intro.html |
| Compressed arbitrary sections | https://maskray.me/blog/2023-07-07-compressed-arbitrary-sections |
| ELF Tool Chain Project | https://sourceforge.net/p/elftoolchain/wiki/Home/ |
| Evolution of the ELF object file format | https://maskray.me/blog/2024-05-26-evolution-of-elf-object-file-format |
| PatchELF | https://github.com/NixOS/patchelf |
| elfcat | https://github.com/rbakbashev/elfcat |
| gwcheck | https://github.com/fcambus/gwcheck |
| Overview of the Mach-O Executable Format | https://developer.apple.com/library/archive/documentation/Performance/Conceptual/CodeFootprint/Articles/MachOOverview.html |
| OS X ABI Mach-O File Format Reference | https://github.com/aidansteele/osx-abi-macho-file-format-reference |
| Embedded Bitcode | https://jonasdevlieghere.com/post/embedded-bitcode/ |
| How Debuggers Work: Getting and Setting x86 Registers, Part 1 | https://web.archive.org/web/20250802101927/https://www.moritz.systems/blog/how-debuggers-work-getting-and-setting-x86-registers-part-1/ |
| How Debuggers Work: Getting and Setting x86 Registers, Part 2: XSAVE | https://web.archive.org/web/20250802101928/https://www.moritz.systems/blog/how-debuggers-work-getting-and-setting-x86-registers-part-2/ |
| Compressed debug sections | https://maskray.me/blog/2022-01-23-compressed-debug-sections |
| Distribution of debug information | https://maskray.me/blog/2022-10-30-distribution-of-debug-information |
| Separating debug symbols from executables | https://www.tweag.io/blog/2023-11-23-debug-fission/ |
| DWARF Debugging Standard | https://dwarfstd.org/ |
| PDF | https://dwarfstd.org/doc/DWARF5.pdf |
| PDF | https://dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf |
| DWARF for the Arm Architecture | https://github.com/ARM-software/abi-aa/blob/main/aadwarf32/aadwarf32.rst |
| DWARF for the Arm 64-bit Architecture (AArch64) | https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst |
| Linkers and Loaders | https://linker.iecc.com/ |
| Mirror | https://wh0rd.org/books/linkers-and-loaders/ |
| Beginner's Guide to Linkers | https://www.lurklurk.org/linkers/linkers.html |
| Linkers part 1 | https://www.airs.com/blog/archives/38 |
| Linkers part 2 | https://www.airs.com/blog/archives/39 |
| Linkers part 3 | https://www.airs.com/blog/archives/40 |
| Linkers part 4 | https://www.airs.com/blog/archives/41 |
| Linkers part 5 | https://www.airs.com/blog/archives/42 |
| Linkers part 6 | https://www.airs.com/blog/archives/43 |
| Linkers part 7 | https://www.airs.com/blog/archives/44 |
| Linkers part 8 | https://www.airs.com/blog/archives/45 |
| Linkers part 9 | https://www.airs.com/blog/archives/46 |
| Linkers part 10 | https://www.airs.com/blog/archives/47 |
| Linkers part 11 | https://www.airs.com/blog/archives/48 |
| Linkers part 12 | https://www.airs.com/blog/archives/49 |
| Linkers part 13 | https://www.airs.com/blog/archives/50 |
| Linkers part 14 | https://www.airs.com/blog/archives/51 |
| Linkers part 15 | https://www.airs.com/blog/archives/52 |
| Linkers part 16 | https://www.airs.com/blog/archives/53 |
| Linkers part 17 | https://www.airs.com/blog/archives/54 |
| Linkers part 18 | https://www.airs.com/blog/archives/55 |
| Linkers part 19 | https://www.airs.com/blog/archives/56 |
| Linkers part 20 | https://www.airs.com/blog/archives/57 |
| All about symbol versioning | https://maskray.me/blog/2020-11-26-all-about-symbol-versioning |
| All about thread-local storage | https://maskray.me/blog/2021-02-14-all-about-thread-local-storage |
| All about Global Offset Table | https://maskray.me/blog/2021-08-29-all-about-global-offset-table |
| All about Procedure Linkage Table | https://maskray.me/blog/2021-09-19-all-about-procedure-linkage-table |
| All about COMMON symbols | https://maskray.me/blog/2022-02-06-all-about-common-symbols |
| Explain GNU style linker options | https://maskray.me/blog/2020-11-15-explain-gnu-linker-options |
| LLD and GNU linker incompatibilities | https://maskray.me/blog/2020-12-19-lld-and-gnu-linker-incompatibilities |
| Copy relocations, canonical PLT entries and protected visibility | https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected |
| Metadata sections, COMDAT and SHF_LINK_ORDER | https://maskray.me/blog/2021-01-31-metadata-sections-comdat-and-shf-link-order |
| Linker garbage collection | https://maskray.me/blog/2021-02-28-linker-garbage-collection |
| The dark side of RISC-V linker relaxation | https://maskray.me/blog/2021-03-14-the-dark-side-of-riscv-linker-relaxation |
| Weak symbol | https://maskray.me/blog/2021-04-25-weak-symbol |
| ELF interposition and -Bsymbolic | https://maskray.me/blog/2021-05-16-elf-interposition-and-bsymbolic |
| -fno-semantic-interposition | https://maskray.me/blog/2021-05-09-fno-semantic-interposition |
| Dependency related linker options | https://maskray.me/blog/2021-06-13-dependency-related-linker-options |
| Symbol processing | https://maskray.me/blog/2021-06-20-symbol-processing |
| SECTIONS and OVERWRITE_SECTIONS | https://maskray.me/blog/2021-07-04-sections-and-overwrite-sections |
| COMDAT and section group | https://maskray.me/blog/2021-07-25-comdat-and-section-group |
| Extract an archive member to satisfy a DSO undef | https://maskray.me/blog/2021-08-15-extract-archive-member-to-satisfy-dso-undef |
| Relative relocations and RELR | https://maskray.me/blog/2021-10-31-relative-relocations-and-relr |
| .init, .ctors, and .init_array | https://maskray.me/blog/2021-11-07-init-ctors-init-array |
| Archives and –start-lib | https://maskray.me/blog/2022-01-16-archives-and-start-lib |
| Analysis and introspection options in linkers | https://maskray.me/blog/2022-02-27-analysis-and-introspection-options-in-linkers |
| Mold | https://github.com/rui314/mold |
| Linkers and Libraries Guide | https://docs.oracle.com/cd/E53394_01/html/E54813/index.html |
| A New ELF Linker (GNU Gold) | https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/34417.pdf |
| Relocations: fantastic symbols, but where to find them? | https://gotplt.org/posts/relocations-fantastic-symbols-but-where-to-find-them.html |
| Your own linker warnings using the GNU toolchain | https://ninjalj.blogspot.com/2011/11/your-own-linker-warnings-using-gnu.html |
| Why symbol visibility is good | https://www.technovelty.org/code/why-symbol-visibility-is-good.html |
| Everything You Never Wanted To Know About Linker Script | https://mcyoung.xyz/2021/06/01/linker-script/ |
| Library order in static linking | https://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking |
| Load-time relocation of shared libraries | https://eli.thegreenplace.net/2011/08/25/load-time-relocation-of-shared-libraries |
| Position Independent Code (PIC) in shared libraries | https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/ |
| Position Independent Code (PIC) in shared libraries on x64 | https://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64 |
| RISC-V linker relaxation in lld | https://maskray.me/blog/2022-07-10-riscv-linker-relaxation-in-lld |
| How and why to do link-time symbol wrapping (or not?) | https://www.humprog.org/~stephen/blog/2022/08/03/#elf-symbol-wrapping-via-replacement |
| Relocatable linking | https://maskray.me/blog/2022-11-21-relocatable-linking |
| Relocation overflow and code models | https://maskray.me/blog/2023-05-14-relocation-overflow-and-code-models |
| Linker notes on x86 | https://maskray.me/blog/2023-02-19-linker-notes-on-x86 |
| Linker notes on Power ISA | https://maskray.me/blog/2023-02-26-linker-notes-on-power-isa |
| Linker notes on AArch32 | https://maskray.me/blog/2023-04-23-linker-notes-on-aarch32 |
| Linker notes on AArch64 | https://maskray.me/blog/2023-03-05-linker-notes-on-aarch64 |
| Exploring the section layout in linker output | https://maskray.me/blog/2023-12-17-exploring-the-section-layout-in-linker-output |
| Wild | https://github.com/wild-linker/wild |
| Assemblers | https://maskray.me/blog/2023-05-08-assemblers |
| Compiler output files | https://maskray.me/blog/2023-04-25-compiler-output-files |
| Driving Compilers | https://fabiensanglard.net/dc/ |
| Precompiled headers | https://maskray.me/blog/2023-07-16-precompiled-headers |
| Toolchain notes on MIPS | https://maskray.me/blog/2023-09-04-toolchain-notes-on-mips |
| Exploring object file formats | https://maskray.me/blog/2024-01-14-exploring-object-file-formats |
| Understanding alignment - from source to object file | https://maskray.me/blog/2025-08-24-understanding-alignment-from-source-to-object-file |
| LLVM Weekly | https://llvmweekly.org |
| GNU Tools Weekly News | https://hachyderm.io/@gnutoolsweekly |
| Low-Level Software Security for Compiler Developers | https://github.com/llsoftsec/llsoftsecbook |
| All about sanitizer interceptors | https://maskray.me/blog/2023-01-08-all-about-sanitizer-interceptors |
| All about LeakSanitizer | https://maskray.me/blog/2023-02-12-all-about-leak-sanitizer |
| All about UndefinedBehaviorSanitizer | https://maskray.me/blog/2023-01-29-all-about-undefined-behavior-sanitizer |
| Control-flow integrity | https://maskray.me/blog/2022-12-18-control-flow-integrity |
| AddressSanitizer: global variable instrumentation | https://maskray.me/blog/2023-10-15-address-sanitizer-global-variable-instrumentation |
| Demystifying programs that create programs, part 1: A disassembler | https://briancallahan.net/blog/20210407.html |
| Demystifying programs that create programs, part 2: Starting an assembler | https://briancallahan.net/blog/20210408.html |
| Demystifying programs that create programs, part 3: Globals, passes, and error handling | https://briancallahan.net/blog/20210409.html |
| Demystifying programs that create programs, part 4: Parsing | https://briancallahan.net/blog/20210410.html |
| Demystifying programs that create programs, part 5: Processing our first opcode | https://briancallahan.net/blog/20210411.html |
| Demystifying programs that create programs, part 6: Processing more opcodes | https://briancallahan.net/blog/20210412.html |
| Demystifying programs that create programs, part 7: Further opcode processing | https://briancallahan.net/blog/20210413.html |
| Demystifying programs that create programs, part 8: Finishing opcode processing | https://briancallahan.net/blog/20210414.html |
| Demystifying programs that create programs, part 9: Pseudo-ops | https://briancallahan.net/blog/20210415.html |
| Frederic Cambus | https://www.cambus.net |
| Motyl | https://github.com/fcambus/motyl |