Fact-checked by Grok 2 weeks ago

musl

musl is a lightweight implementation of the (libc) designed for operating systems based on the , providing interfaces defined in the ISO and standards as well as common extensions, all built directly on the . Pronounced like the word "mussel," it emphasizes simplicity, resource efficiency, standards conformance, safety, and ease of deployment, making it suitable for both embedded systems and general-purpose desktops or servers. Development of musl traces its roots to 2005, with the project formally named and first released in 2011 by primary author Rich Felker as an alternative to established libraries like and , aiming to address their complexities and bloat while prioritizing correctness and minimalism. Released under the permissive since 2012, musl supports static linking to produce compact binaries as small as 10 kB for threaded applications or under 50 kB for typical programs, with a global data footprint below 8 kB and no reliance on external locale files for its default handling. Key innovations include the first safe mutexes and condition variables for use in reference-counted objects on , along with robust thread cancellation and minimal abstractions to reduce bugs. musl has gained prominence in resource-constrained environments and security-focused deployments, serving as the default libc in several lightweight Linux distributions, including Alpine Linux (since version 3.0), Void Linux (with official musl-based images), OpenWrt (default since 2015 for most architectures), and others like Adélie Linux, KISS Linux, and Dragora. These distributions often pair musl with tools like or to create minimal, secure systems ideal for containers, routers, and embedded devices. In November 2025, experimental support for musl was merged into , broadening its compatibility with major init systems. As of its latest stable release, version 1.2.5 (February 29, 2024), musl supports multiple architectures including x86, x86_64, , and others, and has supported 64-bit time_t on 32-bit systems since version 1.2.0 for year 2038 compatibility. Community support occurs via mailing lists and IRC, with commercial options available for specialized needs.

Introduction

Overview

musl is a lightweight implementation of the for Linux-based systems, providing standards-compliant interfaces for ISO and functionality built directly on the Linux . It serves as the core runtime library for programs, offering essential services such as memory allocation, file I/O, threading, and networking, while emphasizing simplicity and minimal resource usage. Developed by Rich Felker, musl was first released in 2011 as a new general-purpose C library option. The project prioritizes correctness in standards conformance and efficiency, enabling compact binaries suitable for a range of environments from embedded devices to servers. As open-source software licensed under the permissive MIT License, musl encourages widespread adoption and modification by developers and distributions.

Purpose and Goals

musl was developed as a implementation of the for systems, with the primary goal of providing a clean, efficient, and fully standards-conformant alternative to existing libraries. It aims to deliver ISO and POSIX functionality with minimal dependencies, avoiding bloat and unnecessary complexity to ensure correctness in terms of standards conformance and safety. By prioritizing simplicity in design, musl seeks to produce optimal code size and reasonable performance across a range of environments, from devices to servers. The creation of musl was motivated by the shortcomings of , which suffers from excessive complexity, resource leaks, and issues with dynamic linking that complicate deployment, and , which offers limited standards compliance and incomplete support. These limitations made existing libraries unsuitable for embedded systems, static-linked applications, and security-sensitive contexts where predictability and auditability are essential. musl addresses these by focusing on a lean architecture that eliminates vendor-specific extensions and reduces the risk of race conditions or deployment surprises. A key objective of musl is to enable straightforward static linking, producing reproducible binaries that operate without runtime dependencies or unexpected behavior, thereby enhancing portability across architectures and improving overall system reliability. This emphasis on auditability and minimal overhead supports its use in environments requiring high robustness, such as applications, while maintaining first-class support for features like locales.

History

Origins and Early Development

The development of musl traces its roots back to 2005, when Rich Felker, known online as dalias, began experimenting with lightweight alternatives to existing implementations as a . Felker, who would become the primary and maintainer of musl, was driven by dissatisfaction with the dominant options at the time, particularly glibc's emphasis on dynamic linking as a core design principle, which made static linking an afterthought, and uClibc's limitations in standards compliance and completeness for broader use cases. From these early explorations, Felker pursued a vision of building a new libc from scratch, prioritizing correctness, simplicity, and resource efficiency over incremental improvements to legacy codebases. This approach aimed to address gaps in specification adherence and safety features, such as robust mutex handling and thread cancellation, that were inadequately supported in glibc and uClibc. The project remained in private development for several years, allowing Felker to refine core concepts without external pressures, focusing on a clean implementation tailored for both embedded systems and general-purpose Linux environments. In , after six years of solitary work, Felker named the project "musl"—pronounced like "mussel" or "muscle"—and released its first public version, marking the transition from experimentation to an open-source endeavor. Initial community engagement occurred through the musl mailing list, where early discussions included patches, compatibility questions with older toolchains, and feedback on syscall wrappers, helping shape the library's foundational stability.

Release Timeline

The first stable release of musl, version 1.0.0, occurred on March 20, 2014, marking the culmination of three years of development and extensive testing to establish it as a production-ready alternative to existing libraries for systems. This milestone emphasized correctness, standards compliance, and support for static linking, with subsequent minor updates in the 1.0 series—such as 1.0.1 on April 16, 2014, and 1.0.5 on March 30, 2015—focusing on critical bug fixes, including floating-point issues, overflows like CVE-2014-3484, and enhancements for architectures like soft-float ABI. These early releases prioritized stability over new features, addressing foundational issues to build user trust. The 1.1 series began with version 1.1.0 on April 16, 2014, introducing bootstrap improvements such as out-of-tree builds, , and enhanced malloc capabilities to facilitate easier integration and deployment in diverse environments. Key milestones in this series included enhancements, like improved support for clock functions, and new architecture ports such as in 1.1.7 (March 18, 2015), alongside security fixes for issues like CVE-2015-1817 in 1.1.8. By 1.1.23 on July 16, 2019, the series had incorporated features like (64-bit) support and GLOB_TILDE for globbing (added in 1.1.24 on October 13, 2019), with changelogs consistently highlighting bug fixes, compatibility, and performance tweaks for threading and dynamic linking to maintain a focus on reliability. Version 1.2.0 arrived on February 20, 2020, as a significant update transitioning all 32-bit architectures to 64-bit time_t to avert the , enabling representation of dates beyond January 2038 without kernel changes. Subsequent releases in the 1.2 series addressed security vulnerabilities, such as buffer overflows in 1.2.2 (January 15, 2021, fixing CVE-2020-28928). Notable advancements included the mallocng allocator in 1.2.1 (August 4, 2020) for better performance and DNSSEC support, while 1.2.5 on February 29, 2024, added support for statx syscall, clone3, and new ports like loongarch64 and riscv32, with ongoing patches in the 1.2.x series through 2025 emphasizing compatibility and bug resolution. Version 1.2.6, released in mid-2025, included fixes for security issues such as CVE-2025-26519 (out-of-bounds write in iconv). As of November 2025, the 1.2.x branch continues with security and stability patches. Musl follows a roughly time-based release schedule aimed at achieving long-term stability, with changelogs underscoring correctness, minimal feature additions, and thorough testing over rapid iteration. This philosophy has enabled consistent milestones, from the production readiness of 1.0 to the security-focused evolutions in later series, without introducing breaking changes unless critical for compliance or safety.
VersionRelease DateKey Milestones
1.0.0March 20, 2014Initial stable release; production-ready with core standards support and static linking focus.
1.1.0April 16, 2014Bootstrap enhancements; RELRO, VDSO, and IPv6 improvements.
1.2.0February 20, 202064-bit time_t transition; Unicode 12.1.0 and Linux 5.x header support.
1.2.5February 29, 2024statx, new architectures (loongarch64, riscv32); ongoing security patches into 2025.
1.2.6Mid-2025Security fixes including CVE-2025-26519 (iconv out-of-bounds write).

Design Philosophy

Core Principles

musl's design is fundamentally guided by the principle of , aiming for a minimalist that minimizes and facilitates auditing by avoiding unnecessary . This approach unifies the C library, POSIX threads implementation, and into a single library, eliminating redundant code and ABI lock-in issues that arise from separate components. By streamlining the architecture, musl ensures that developers and auditors can more easily understand and verify the entire system, promoting reliability in resource-constrained environments. A core tenet is strict standards conformance, adhering closely to the and specifications without incorporating GNU-specific extensions, which guarantees predictable and portable behavior across compliant systems. For instance, musl's implementation of thread cancellation follows requirements precisely, ensuring proper side effects and resource cleanup as defined by the Austin Group, even in scenarios where deviations could simplify development. This commitment extends to time handling, where internal use of 64-bit integers prevents overflows in time conversions, aligning with standard expectations for robustness. musl prioritizes correctness over performance optimizations, favoring full specification compliance that may result in slower execution in edge cases but ensures safety and accuracy. In thread-local storage (TLS) management, for example, musl reserves all necessary storage upfront during allocation, allowing failures to be reported gracefully rather than leading to aborts or undefined behavior, which underscores a safety-first philosophy. This trade-off reflects the library's emphasis on verifiable correctness, reducing the risk of subtle errors that could compromise system integrity. Portability is another foundational principle, with musl engineered for cross-architecture through a clean separation of Linux-specific elements, such as syscall interfaces, from standard and components. The TLS subsystem, for instance, relies predominantly on portable code with minimal machine-specific dependencies, enabling straightforward adaptation to diverse without compromising core functionality. This design facilitates deployment on systems and static binaries, where broad is essential.

Focus on Static Linking

musl is engineered with static linking as a foundational element, enabling the creation of self-contained binaries that incorporate all required code directly into the , without reliance on a dynamic loader or external shared objects. This design inherently sidesteps dependencies on system dynamic linking infrastructure, such as the loader itself, which in turn mitigates security risks tied to mechanisms, including via variables like LD_PRELOAD that could inject malicious code. The benefits of this static linking emphasis are multifaceted. It facilitates by embedding all components deterministically, free from variations introduced by versions or system configurations on the build host. Distribution becomes simpler, as the resulting binary requires no additional library installations and can deploy across diverse environments matching the target architecture. Furthermore, runtime overhead is minimized by eliminating dynamic symbol resolution and loading at startup, while binaries gain immunity to conflicts arising from mismatched or absent versions on the host system. At its core, musl's mechanisms for static linking prioritize modularity and minimalism to keep binaries lean. By avoiding heavy internal coupling among library components, it ensures that only the code and data pertinent to an application's needs are included, preventing the inadvertent incorporation of extraneous runtime elements like large global data structures. This approach also accommodates relocatable code generation, making it particularly apt for embedded systems where position-independent executables enhance flexibility in memory-constrained or firmware-like deployments. A notable is the potential for increased binary sizes relative to dynamically linked counterparts, as all library functionality must be compiled in upfront. However, musl's compact footprint—yielding binaries as small as under 10 for threaded minimal programs and under 50 for practical applications—largely mitigates this, often resulting in more efficient overall resource usage compared to the bloat from dynamic linking dependencies.

Technical Features

Standards Compliance

musl provides comprehensive support for the ISO C standards, including full conformance to (ISO/IEC 9899:1999) and (ISO/IEC 9899:2011). This includes implementation of core language features, standard library functions such as printf for formatted output and malloc for dynamic memory allocation, as well as optional annexes like Annex F for IEC 60559 . In terms of compliance, musl adheres to the POSIX.1-2008 (IEEE Std 1003.1-2008) base specifications, incorporating selected common extensions while maintaining a conservative approach to avoid non-standard additions. It implements key interfaces, including wrappers for system calls and utilities like getaddrinfo for address resolution, alongside full support for threads () as the first post-NPTL implementation aimed at complete conformance and robustness. This enables portability for applications relying on standard behaviors without proprietary extensions. However, musl intentionally omits certain deprecated or non-standard features to prioritize simplicity and correctness, such as BSD-specific socket extensions beyond requirements. For instance, dlclose is implemented as a no-op, meaning dynamically loaded libraries remain in memory for the process lifetime, which aligns with allowances but differs from more aggressive unloading in other implementations. musl lacks formal certification from standards bodies, but its development emphasizes rigorous testing against conformance suites, including the libc-test , which verifies correctness and quality across implementations.

Security and Performance Optimizations

musl's model emphasizes a compact to minimize the , with a static library size of approximately 426 kB. This reduced size limits potential vulnerabilities compared to larger implementations like , which can exceed several megabytes. By prioritizing simplicity and correctness in its design, musl avoids complex features that could introduce bugs or exploitable weaknesses, relying on rigorous and adherence to standards rather than layered mitigations. Unlike , which includes default stack smashing protection () for user applications to guard against overflows, musl does not enable such runtime checks by default, instead focusing on preventing overflows through precise implementations that terminate processes rapidly upon detection of issues like stack protector failures or double-frees in internal code paths. In terms of performance, musl is optimized for static linking, resulting in a low where global data remains under 8 and minimal static-linked binaries can be as small as 10 , even with threading support. This efficiency stems from avoiding unnecessary dynamic allocations in core library paths, ensuring predictable behavior and reduced overhead in resource-constrained environments. For instance, musl implements string functions like isalnum using straightforward logical checks (e.g., isalpha(c) || isdigit(c)) rather than precomputed lookup tables, prioritizing correctness and simplicity over marginal speed gains from complexity. Such choices contribute to faster startup times and lower resource usage on embedded hardware, where the library's design outperforms bulkier alternatives despite occasional trade-offs in raw computational benchmarks. Further optimizations include streamlined handling of networking protocols, where musl performs parallel DNS queries across up to three nameservers, accepting the first valid response to enhance reliability without introducing bloat from sequential fallbacks or extensive IDN support. integration uses unified sockets for both IPv4 and traffic, avoiding redundant code paths and promoting efficiency in mixed environments. These approaches reflect musl's philosophy of favoring , robust algorithms that yield reasonable across scenarios, though can lead to slower execution in highly optimized, multi-threaded workloads on powerful —contrasted by superior on limited-resource systems due to the minimized .

Implementation Details

Supported Architectures

musl libc provides support for a variety of hardware architectures and application binary interfaces (ABIs) tailored to systems, emphasizing portability and minimal dependencies to facilitate use in embedded and resource-constrained environments. The primary supported architectures include x86 (both 32-bit with SysV ABI and 64-bit x86_64 with SysV ABI), (EABI for armv4t and later, including soft-float variants requiring 4.2.4 or later and hard-float variants requiring 4.5.4 or later), , (o32, n32, and n64 ABIs for MIPS1+ or MIPS2+, with support for both big-endian and little-endian variants like and mipsel), PowerPC (32-bit and 64-bit, with both little-endian and big-endian support using with secure PLT enabled), (64-bit since version 1.1.23 with soft-float, and full 32-bit support added in 1.2.5), LoongArch64 (since 1.2.5), (requiring toolchain and 3.13+), 1000, s390x, and m68k. These cover standard ABIs, ensuring compatibility with the interface on kernels version 2.6.39 or later for full conformance, though simpler applications may run on older kernels like 2.4. Experimental or partial support exists for architectures such as x32 (requiring 4.7+ and 3.4+, with known kernel issues) and (sh, including subvariants like sheb and sh-nofpu, often needing kernel patches). support, initially merged for 64-bit in 1.1.23, achieved fuller coverage with 32-bit in 1.2.5, demonstrating musl's ongoing expansion for emerging platforms. musl's clean, modular design—featuring a C-based common runtime framework for startup code—enables relatively quick of new architectures by the , as seen in contributions for and PowerPC variants. Developers can leverage tools like libc-test for validation during ports, fostering community-driven additions for niche platforms. Limitations include exclusive focus on Linux kernels, with no support for Windows or other non-Linux environments, and a primary emphasis on little-endian byte order, though big-endian is accommodated where architecturally feasible, such as in PowerPC and implementations.

Key Internal Components

musl's memory allocator, known as malloc, is a customized variant of Doug Lea's dlmalloc, adapted with fine-grained locking to enhance multi-threaded performance while maintaining simplicity suitable for static linking. This design avoids the complexity of glibc's ptmalloc by using per-bin locks rather than a single global lock, reducing contention in concurrent environments and ensuring compatibility with fully static binaries where dynamic replacement is not possible. In version 1.2.0 and later, musl introduced mallocng, a next-generation allocator that further improves robustness and efficiency, addressing limitations in the original implementation such as unbounded heap expansion races. The I/O subsystem in musl features streamlined handling of FILE* streams through direct integration with system calls like readv and writev, promoting efficient buffering without relying on complex heuristics. For networking, wrappers are implemented to ensure correct propagation of errors from underlying syscalls, adhering strictly to semantics for functions like connect and accept, which helps in predictable behavior across threaded applications. This approach minimizes overhead and supports static linking by avoiding dependencies on external buffering libraries. musl's dynamic linker, ld.so, is a minimal implementation integrated directly into libc.so to reduce startup overhead and enable atomic upgrades of the entire library via a single rename operation. It performs permanent loading of shared libraries for the process lifetime, treating dlclose as a no-op to simplify and avoid potential issues with unloading, which aligns with allowance but prioritizes reliability over dynamic reloading. Threading support in musl provides basic pthread functionality, leveraging futexes for synchronization primitives like mutexes and condition variables to enable efficient user-space operations without kernel involvement in uncontended cases. This implementation focuses on core features such as thread creation, joining, and cancellation, using operations and syscalls for locking, while omitting advanced scheduling policies to keep the codebase lightweight and suitable for embedded use.

Comparisons

With glibc

musl and differ significantly in size and complexity, with musl designed to be lightweight and minimalistic. As of 2015, the complete shared object set for musl totaled approximately 527 KB, in contrast to 's roughly 7.9 including additional iconv modules (~5 ). More recent assessments as of 2025 indicate musl's core library remains under 1 , while occupies tens of megabytes on disk, especially with locales and development files. This smaller footprint arises from musl's focus on essential functionality without the extensive features and optimizations accumulated in over decades. Regarding API behaviors, musl adheres more strictly to standards, leading to simpler and safer implementations; for instance, in functions like strtoll, musl consistently sets errno on underflow conditions where may not, enhancing predictability for developers relying on error reporting. In dynamic linking, glibc employs a flexible loader (ld.so) that supports unloading libraries via dlclose and handles complex dependency resolution, but this flexibility has historically introduced vulnerabilities, such as those exploited in loader attacks. Conversely, musl's dynamic linker loads libraries permanently for the process lifetime, treating dlclose as a no-op to simplify the model and reduce potential security risks from dynamic unloading. This approach aligns with musl's emphasis on reliability in resource-constrained environments but limits advanced scenarios supported by . Performance profiles between musl and glibc vary by workload. glibc often outperforms musl in compute-intensive tasks due to specialized optimizations, such as in matching where glibc's vectorized implementations yield higher throughput. However, musl excels in static linking and embedded scenarios, where its smaller code size reduces memory usage and startup time, making it preferable for containers and low-resource systems. As of 2024, optimized musl variants (e.g., in Alpaquita Linux) match or exceed glibc performance in some workloads, though default musl allocators can cause up to 7x slowdowns in certain multithreaded benchmarks compared to glibc. Benchmarks on multithreaded applications sometimes show glibc's advantages in allocation , but musl's can lead to faster execution in minimalistic, single-threaded programs. Compatibility challenges stem from glibc's inclusion of non-standard extensions and differing behaviors not present in musl, which prioritizes POSIX and C standard compliance. For example, glibc supports proprietary extensions like nscd caching for name resolution, absent in musl, requiring applications to adapt or use alternatives. Behavioral differences include getaddrinfo handling of IPv6; when called with AF_UNSPEC, glibc may return IPv4-mapped IPv6 addresses for hosts without native IPv6 support, whereas musl strictly adheres to separate family resolution and avoids such mappings to prevent unexpected dual-stack behavior. These variances can cause portability issues for software assuming glibc-specific quirks, though musl's predictability aids in cross-library verification.

With uClibc and Other Alternatives

As of 2015, musl provided superior standards compliance compared to , offering full mathematics library support, threads, and complete threads implementation, whereas offered only partial math and lacked threads support, with threads available on most architectures but with issues like incorrect process scheduling. musl also benefits from active maintenance, with multiple releases annually, in contrast to the original , which ceased updates after 2012; its fork, uClibc-ng, continues development as of September 2025 (version 1.0.55) but maintains a focus on configurability for embedded systems rather than full conformance. In comparison to , musl delivers a more comprehensive feature set suitable for general-purpose applications, including robust handling and priority scheduling, while dietlibc remains an ultra-minimal option prioritizing extreme size reduction for tiny binaries, at the cost of broken threads, absent math support, and no process scheduling. For instance, as of the static size for musl was approximately 426 , enabling small programs around 1.8 , whereas dietlibc achieved just 120 and 0.2 binaries but sacrifices functionality for such minimalism. musl contrasts with Android's Bionic libc by providing fuller compliance and avoiding ties to proprietary ecosystem optimizations, as Bionic explicitly does not claim compliance and deviates in areas like reduced slots to favor mobile performance. Bionic is tailored for Android's resource constraints, emphasizing low power and small footprint for devices, but it omits certain desktop-oriented features present in musl, such as complete standards-conforming thread cancellation. Overall, musl occupies a niche that bridges the embedded focus of libraries like uClibc—targeting resource-limited environments—with the robustness needed for general-purpose Linux systems, all without the overhead of larger implementations.

Adoption and Use Cases

Linux Distributions

Alpine Linux, a security-oriented and lightweight distribution, has used musl as its primary C library since switching from uClibc in 2014, making it one of the earliest and most prominent adopters. This choice enables Alpine's minimal footprint, with base installations as small as 5 MB, ideal for container environments like Docker and secure, resource-constrained setups. Void Linux offers a dedicated musl variant alongside its glibc-based one, officially supporting musl in its codebase for users seeking a lightweight, independent system without systemd. The musl variant emphasizes simplicity and performance, though it requires patching for incompatible software. postmarketOS, an extension of Alpine for mobile and embedded devices, inherits musl as its core libc, prioritizing portability across smartphones and tablets. Other distributions adopting musl include Adélie Linux, an independent system focused on reliability and broad architecture support using musl for its core runtime. Chimera Linux employs musl alongside /Clang and BSD-derived tools for a minimalist, secure base. Dragora /Linux-Libre incorporates musl to align with its libre software principles and lightweight ethos. Distributions adopt musl primarily for its small binary size—significantly smaller than equivalents—and reduced , enhancing in minimal installations and containerized applications. Its simplicity also aids static linking, beneficial for embedded and use cases where dynamic dependencies are minimized. However, challenges persist, as many upstream packages assume -specific behaviors, necessitating porting efforts or patches. In November 2025, merged experimental support for musl, potentially easing integration in more complex systems. As of 2025, musl-based distributions remain niche, comprising a growing but small fraction of the ecosystem, with adoption concentrated in specialized areas rather than mainstream desktops.

Embedded Systems and Containers

Musl has found significant adoption in embedded systems, where its lightweight design and compatibility with make it ideal for resource-constrained environments such as devices and routers. , a utility suite, integrates seamlessly with musl to provide a minimal POSIX-compliant environment, enabling the creation of compact systems that run on low-memory without the overhead of larger libraries like . For instance, many embedded distributions leverage this combination to deploy on numerous network routers worldwide. Musl's support for key embedded architectures further enhances its suitability for such applications. It provides robust implementations for ARM EABI (from armv4t onward, with softfp or hardfloat variants) and (both 32-bit and 64-bit, including floating-point options), allowing developers to target low-power processors common in and edge hardware. These ports ensure standards-compliant behavior on platforms like or RISC-V-based microcontrollers, facilitating cross-compilation for static binaries that operate reliably in isolated, non-desktop setups. In containerized environments, musl is a cornerstone of lightweight distributions like , which serves as a base for images. Alpine's official images, built with musl and , achieve a minimal footprint of approximately 5 MB, drastically reducing storage and transfer costs compared to glibc-based alternatives. This enables the creation of secure, efficient containers by avoiding the bloat and potential vulnerabilities associated with larger C libraries, promoting faster builds and lower attack surfaces in production deployments. Notable projects highlight musl's versatility in these domains. , positioned as a modern successor to , supports static linking with musl to produce portable, multi-call binaries for Unix utilities, suitable for both embedded firmware and container tools. Similarly, musl-cross-make provides a makefile-based system for generating fully static toolchains targeting musl, streamlining the development of self-contained applications for cross-platform use in embedded and container scenarios. Efforts to adapt musl for alternative mobile ecosystems, such as ports to Android-like platforms, demonstrate its potential in replacing Bionic for more standards-focused implementations. The advantages of musl in and contexts stem from its emphasis on and predictability, ensuring consistent in isolated environments without dynamic linking dependencies. As of , this has driven increasing in cloud-native applications via Alpine-based images and research, where musl enables efficient, secure processing on heterogeneous hardware like clusters.

Community and Licensing

Development Process

musl's development is led by its primary author and maintainer, Rich Felker, with contributions from a community of approximately 100 individuals who have submitted patches for ports, bug fixes, and enhancements over the years. The project emphasizes volunteer participation, particularly for architecture ports and targeted improvements, while core changes are overseen by a small team of trusted reviewers to ensure alignment with musl's goals of simplicity, correctness, and standards compliance. The development process relies heavily on mailing list-based discussions for collaboration, where proposed changes, bug reports, and feature requests are debated publicly. Code submissions undergo rigorous review by the core team, with a strong focus on reading relevant C and POSIX specifications to verify conformance, alongside extensive testing using tools like the libc-testsuite to catch regressions and edge cases. This approach prioritizes high-quality, minimalistic implementations, often rejecting proposals that introduce unnecessary complexity or deviate from strict standards. Development occurs primarily through the project's repository hosted at git.musl-libc.org, where changes are tracked and integrated after review. Releases follow a roughly time-based cycle, typically every 1-2 years, incorporating beta versions for community testing to identify issues before final stabilization. For example, version 1.2.6 was released in 2025 to address CVE-2025-26519. As of August 2025, the includes ongoing work toward full C23 standard support, with discussions on integration timing to balance completeness and stability. The project's strict adherence to standards has led to occasional debates among contributors. These discussions underscore musl's commitment to correctness over expediency, though they can extend review timelines for contentious patches.

License and Contributions

musl is released under the , a permissive that permits commercial and proprietary use without restrictions on distribution or modification. This includes support for static linking into closed-source software, enabling developers to create self-contained binaries without dependency concerns. The license text is available in the project's file. In contrast to copyleft licenses like the GNU General Public License (GPL), the imposes no obligations to share for derivative works, making musl particularly suitable for integration into and applications where licensing is critical. This permissiveness has contributed to musl's in environments requiring lightweight, redistributable components. Contributions to musl are welcomed under the and primarily submitted via patches to the project's , where submitters are required to include a Signed-off-by line certifying adherence to the Developer's (DCO) 1.1, affirming ownership and licensing compliance of the contributed code. This process ensures clean transfer while maintaining the project's permissive nature. The MIT License's transparency facilitates security audits by allowing unrestricted access and redistribution of the source code for review. musl's limited scope and design simplicity have resulted in few reported vulnerabilities, with eight CVEs assigned since 2017 as of November 2025—primarily minor issues like buffer overflows and handling flaws in functions such as iconv—which are typically addressed promptly through patches and release updates.

References

  1. [1]
    musl libc
    musl is an implementation of the C standard library built on top of the Linux system call API, including interfaces defined in the base language standard.About musl · Release history · Musl libc Reference Manual
  2. [2]
    About musl
    Due to lack of heavy internal coupling between libc components, static linking with musl pulls in very little code that the application isn't actually using.
  3. [3]
  4. [4]
    Projects using musl
    glaucus - A simple and lightweight Linux® distribution based on musl libc and toybox; Iglunix - An independent, self-hosting, Linux distribution with no GNU ...
  5. [5]
    index | Alpine Linux
    No readable text found in the HTML.<|separator|>
  6. [6]
    musl libc Release History
    This is the first release of musl to support building native x86_64 applications, and it features a source/build framework for additional ports. Some public ...
  7. [7]
    Support for musl
    Have questions about a project using musl that can't be discussed in public, or need rapid turnaround solving problems? Commercial support is available through ...
  8. [8]
    Funding Maintenance and Development - musl libc
    musl has a Patreon to fund maintenance and development by the main project author, Rich Felker. Other code contribitors have also performed porting and ...
  9. [9]
    musl FAQ - musl libc
    musl is a new general-purpose implementation of the C library. It is lightweight, fast, simple, free, and aims to be correct in the sense of standards- ...
  10. [10]
    Introduction - musl
    musl provides consistent quality and implementation behavior from tiny embedded systems to full-fledged servers.
  11. [11]
    How 'Free Riders' Make the Musl Open Source Project Grow
    Jun 16, 2020 · ” A few years later Felker decided to build musl libc, not to compete with existing libraries, but rather as a place to showcase proofs of ...
  12. [12]
    10 years Sabotage Linux - The history of the first musl-based distro
    Apr 9, 2021 · The standard in 2011 was the GLIBC libc. Rich Felker, musl's author, was frustrated with GLIBC because it was designed around a central idiom: ...Missing: origins | Show results with:origins
  13. [13]
    musl mailing list - 2011/05 - Openwall
    musl mailing list - 2011/05 ; using musl with older gcc (Szabolcs Nagy <nsz@...t70.net>) ; Re: using musl with older gcc (Rich Felker <dalias@...ifal.cx>) ; [PATCH] ...Missing: libc first posts
  14. [14]
    CVE-2025-26519 Detail - NVD
    Feb 13, 2025 · musl libc 0.9.13 through 1.2.5 before 1.2.6 has an out-of-bounds write vulnerability when an attacker can trigger iconv conversion of untrusted EUC-KR text to ...<|control11|><|separator|>
  15. [15]
    Roadmap - musl libc
    Jan 1, 2025 · We aim to follow roughly a time-based release schedule. The roadmap describes likely focus and goals for current and upcoming release cycles ...Missing: history | Show results with:history
  16. [16]
    Design Concepts - musl libc
    In the early design stages of musl, it was unclear whether musl would provide its own dynamic linker or use an existing one. The initial motivation for ...
  17. [17]
  18. [18]
  19. [19]
  20. [20]
    Functional differences from glibc - musl libc
    musl's dynamic loader loads libraries permanently for the lifetime of the process, until it exits or calls exec. dlclose is a no-op.<|control11|><|separator|>
  21. [21]
    musl 1.0.0 Reference Manual
    The interfaces in musl are modeled upon and intended to conform to the requirements of the ISO C99 standard (ISO/IEC 9899-1999), including Annex F, and POSIX ...Missing: compliance C17
  22. [22]
    musl 1.1.5 with full C11 library support - Jens Gustedt's Blog
    Oct 14, 2014 · Fortunately nothing that is a show stopper, so musl seems to be the first open source C library out there, that has full support for C11. This ...
  23. [23]
    Compiling with musl (an alternate libc)
    musl is an alternate libc (standard C library), with a stable ABI, strict full X/Open 2008 (SUS4), POSIX (latest version), and ISO C99 conformance.
  24. [24]
    libc-testsuite - correctness and quality tests for libc implementations
    git://git.musl-libc.org/libc-testsuite · https://git.musl-libc.org/git/libc-testsuite. generated by cgit v1.2.1 (git 2.18.0) at 2025-10-17 01:21:31 +0000.Missing: certification conformance suites
  25. [25]
    libc-test
    libc-test is a continuation of the original libc-testsuite, maintained by Szabolcs Nagy, the author of musl's math library.Missing: certification conformance
  26. [26]
    Comparison of C/POSIX standard library implementations for Linux
    ### Summary of musl libc from https://www.etalabs.net/compare_libcs.html
  27. [27]
    Re: list of security features in musl - Openwall
    Feb 11, 2016 · ... code paths which can themselves provide an attack surface. - Double-free protection (to the extent possible), with the same rapid ...Missing: smaller codebase
  28. [28]
    glibc - Minimus Documentation
    For example, glibc has built-in stack smashing to protect against buffer overflows, whereas musl will allow vulnerable programs to run without warning. ​. 2 ...
  29. [29]
    A tale of two libcs - Drew DeVault's blog
    Sep 25, 2020 · This is what the musl libc isalnum implementation looks like: int isalnum(int c) { return isalpha(c) || isdigit(c); } int isalpha( ...
  30. [30]
    Supported Platforms - musl libc
    Supported Compilers. Any conformant C and C++ compiler should be able to use musl (to compile and link application code). As of 2013-09- ...Missing: C17 | Show results with:C17
  31. [31]
    musl libc - Porting
    ### Summary of Porting Process for New Architectures in musl libc
  32. [32]
    Re: What's wrong with musl's malloc - Openwall
    Apr 23, 2018 · > > > The main benefits of musl's malloc vs the standard dlmalloc algorithms > > it's based on is the fine-grained locking. As long as there ...
  33. [33]
    pthread_create.c\thread\src - musl - musl - an implementation of the ...
    ... futex address pointing at the lock. * This needs to happen after any ... */ if (!--libc.threads_minus_1) libc.need_locks = -1; self->next->prev ...
  34. [34]
    Comparison of C/POSIX standard library implementations for Linux
    The table below and notes which follow are a comparison of some of the different standard library implementations available for Linux, with a particular focus ...
  35. [35]
    Adapting musl libc for openEuler Embedded
    May 25, 2023 · It is designed for static linking and is well-suited for making portable programs. It can also be easily used for cross compilation to compile ...Missing: relocatable | Show results with:relocatable
  36. [36]
    musl - strtoll() incompatibility - Openwall
    Oct 13, 2021 · I have two systems, one is musl-based and the other is Glibc-based ... Glibc's strtoll() did not set errno. I don't know what the ...
  37. [37]
    Musl porting notes - Gentoo Wiki
    Jun 25, 2025 · musl is very strict regarding standards-conformance compared to the widely used GNU C Library (glibc). This means that many of the GNU ...
  38. [38]
    musl vs glibc: Pros, Cons, and Key Differences - TuxCare
    Aug 8, 2025 · musl was introduced on February 11, 2011, as an alternative to glibc. That said, musl is not as feature-rich or as widely compatible as glibc.Missing: Felker dissatisfaction origins
  39. [39]
    glibc vs. musl - Chainguard Academy
    Jul 23, 2025 · According to the musl wiki open issues, GCC and LLVM sanitizer implementations rely on libc internals and are incompatible with musl. Feature ...
  40. [40]
    dns: getaddrinfo() differences between glibc and musl #2225 - GitHub
    Mar 25, 2019 · That means musl by default returns addresses that may be unreachable from the current machine whereas glibc won't. And on the flip side, glibc ...
  41. [41]
    Some things about getaddrinfo that surprised me - Julia Evans
    Feb 23, 2022 · You might think ok, Mac OS getaddrinfo is different, but the two versions of getaddrinfo in glibc and musl libc must be mostly the same, right?<|separator|>
  42. [42]
    A comparison of dietlibc, uclibc, musl, and glibc, by the author of musl
    * Supporting new versions of C, such as C11. * Improving performance of threading and memory allocation, among other things. * Updating Unicode tables for ...
  43. [43]
    musl libc
    Compatibility - software and standards compatibility of the API musl provides; Supported Platforms - compilers, architectures, platforms, where musl works ...
  44. [44]
  45. [45]
    About - Alpine Linux
    Small. Simple. Secure. Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.
  46. [46]
    Void Linux
    Void Linux supports both the musl and GNU libc implementations, patching incompatible software when necessary and working with upstream developers to improve ...Download · Packages · News · Acknowledgments
  47. [47]
    musl - Void Linux Handbook
    musl is a libc implementation which strives to be lightweight, fast, simple, and correct. Void officially supports musl by using it in its codebase for all ...
  48. [48]
    About postmarketOS
    Nov 4, 2024 · postmarketOS extends the free and open source operating system Alpine Linux to run on smartphones and other mobile devices.Principles · Developer facing · User facing
  49. [49]
    About - Adélie Linux
    Adélie is an independent Libre operating system based on the Linux kernel and musl runtime library. We focus on reliability, security, compatibility, ...
  50. [50]
    Building Busybox - musl libc
    Sabotage Linux has a kernel-headers repository based on Linux 3.12.6 headers for all arches supported by musl, where those patches are already applied.
  51. [51]
    Having a solid library foundation actually matters. - musl libc
    Can be used in place of: GNU libc (glibc) on servers and desktop systems; Bionic (Android) on mobile devices; uClibc in embedded systems. musl as a foundation.
  52. [52]
    Musl libc 1.2.5 Released With RISC-V 32-bit & LoongArch 64-bit Ports
    Mar 1, 2024 · Musl libc 1.2.5 released on Thursday as the newest version of this ... support for RISC-V 64-bit, and numerous bug fixes. On the fixes ...
  53. [53]
    alpine - Official Image | Docker Hub
    The alpine Docker image is a minimal, 5MB image based on Alpine Linux, built with musl libc and BusyBox, and has a complete package index.
  54. [54]
    glibc and musl - Docker Docs
    Compare glibc and musl variants of DHIs to choose the right base image for your application's compatibility, size, and performance needs.<|separator|>
  55. [55]
  56. [56]
    richfelker/musl-cross-make: Simple makefile-based build ... - GitHub
    This is the second generation of musl-cross-make, a fast, simple, but advanced makefile-based approach for producing musl-targeting cross compilers.Missing: Rich 2005 early
  57. [57]
    [musl] musl and android
    Jan 22, 2015 · I think this code or even whole musl should be ported to android as a separate project, or even musl should replace bionic in future androidMissing: comparison | Show results with:comparison
  58. [58]
    Enabling Heterogeneous-ISA Container Migration in Edge Computing
    Finally, Popcorn's musl libc was extended to let the C library initialization code enforce the same virtual address space aperture on every architecture.
  59. [59]
    How to Use - musl libc
    musl is designed to be simple and efficient to use whether as the system-wide libc or a tool for making robust static-linked applications.<|control11|><|separator|>
  60. [60]
    musl - Re: When should C23 support be merged? - Openwall
    Aug 19, 2025 · ... 2025 11:20:56 -0400 From: Rich Felker <dalias@...c.org> To: Aymeric ... C23 support be merged? On Tue, Aug 19, 2025 at 09:52:01AM +0000 ...
  61. [61]
    musl mailing list - 2024/07 - Openwall
    musl mailing list - 2024/07 · [PATCH 1/1] FD_SET() and FD_ISSET() warn on -Wsign-conversion (Brad House <brad@...d-house.com>) · Re: [PATCH] sys/epoll.h: add ...
  62. [62]
    musl mailing list - 2024/08 - Openwall
    musl mailing list - 2024/08 ; Re: Inquiry Regarding Patch Review Process for musl (Rich Felker <dalias@...c.org>) ; [PATCH] POSIX 2024: strptime %F (Oliver Webb < ...
  63. [63]
    Musl-libc Musl security vulnerabilities, CVEs, versions and CVE ...
    This page lists vulnerability statistics for all versions of Musl-libc » Musl. Vulnerability statistics provide a quick overview for security vulnerabilities ...