More actions
m (Add reference to "bloat") Tag: 2017 source edit |
(Usage on operating systems and another alternatives/implementations.) Tag: 2017 source edit |
||
Line 1: | Line 1: | ||
== musl == | == musl == | ||
{{SoftwareInfobox | {{SoftwareInfobox | ||
| image = [[File:Musl.png|thumb]] | | image = [[File:Musl.png|thumb]] | ||
Line 7: | Line 8: | ||
| lastrelease = 1.2.5 (2024-02-29, commit[https://git.musl-libc.org/cgit/musl/commit/?h=v1.2.5&id=0784374d561435f7c787a555aeab8ede699ed298]) | | lastrelease = 1.2.5 (2024-02-29, commit[https://git.musl-libc.org/cgit/musl/commit/?h=v1.2.5&id=0784374d561435f7c787a555aeab8ede699ed298]) | ||
| languages = [[C]] | | languages = [[C]] | ||
| developers = Rich Felker | | developers = Rich Felker (dalias) and others | ||
| website = [https://musl.libc.org/ musl.libc.org] | | website = [https://musl.libc.org/ musl.libc.org] | ||
}} | }} | ||
Line 13: | Line 14: | ||
'''musl''' is a C standard library intended for operating systems based on the Linux kernel, released under the MIT License. It was developed by Rich Felker to write a clean, efficient, and standards-conformant libc implementation. | '''musl''' is a C standard library intended for operating systems based on the Linux kernel, released under the MIT License. It was developed by Rich Felker to write a clean, efficient, and standards-conformant libc implementation. | ||
=== Comparisons between different C | === Usage on Operating Systems === | ||
Linux distributions which use musl as their standard C library (some use ''only'' musl) include but are not limited to: | |||
* [[Alpine Linux]] | |||
* [[Dragora 3]] | |||
* [[Gentoo Linux]] ([[glibc]] by default, musl can be chosen at install time) | |||
* [[OpenWrt]] | |||
* [[postmarketOS]] | |||
* Sabotage | |||
* Morpheus Linux | |||
* [[Chimera Linux]] | |||
* [[Void Linux]] | |||
The seL4 microkernel ships with musl, for binaries that have been linked against [[glibc]], [[gcompat]], glibmus-hq. can be used to execute them on musl-based distros. | |||
=== Comparisons between different C library implementations. === | |||
{| class="wikitable sortable" | {| class="wikitable sortable" | ||
|+ | |+ | ||
Line 20: | Line 35: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Complete .a set | !Complete .a set | ||
Line 74: | Line 89: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Thread-local storage | !Thread-local storage | ||
Line 122: | Line 137: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Tiny allocation & free | !Tiny allocation & free | ||
Line 236: | Line 251: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Stable ABI | !Stable ABI | ||
Line 278: | Line 293: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Substring search (strstr) | !Substring search (strstr) | ||
Line 308: | Line 323: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Conformant printf | !Conformant printf | ||
Line 446: | Line 461: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!i386 | !i386 | ||
Line 548: | Line 563: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Legacy-code-friendly headers | !Legacy-code-friendly headers | ||
Line 584: | Line 599: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!Attention to corner cases | !Attention to corner cases | ||
Line 620: | Line 635: | ||
!uClibc | !uClibc | ||
!dietlibc | !dietlibc | ||
!glibc | ![[glibc]] | ||
|- | |- | ||
!License | !License | ||
Line 629: | Line 644: | ||
|} | |} | ||
Official benchmarks <ref>Etalabs [https://www.etalabs.net/compare_libcs.html]https://www.etalabs.net/compare_libcs.html</ref> | Official benchmarks <ref>Etalabs [https://www.etalabs.net/compare_libcs.html]https://www.etalabs.net/compare_libcs.html</ref> | ||
=== See also === | |||
* [[Bionic libc]] | |||
* [[dietlibc]] | |||
* [[Glibc]] | |||
* [[klibc]] | |||
* [[Newlib]] | |||
* [[uClibc]] | |||
==Notes== | ==Notes== | ||
<references /> | <references /> |
Revision as of 00:31, 26 October 2024
musl
musl ldd command output. | |
Release Status | Maintained |
---|---|
Last Release | 1.2.5 (2024-02-29, commit[2]) |
Language(s) | C |
Developer(s) | Rich Felker (dalias) and others |
Website | musl.libc.org |
musl is a C standard library intended for operating systems based on the Linux kernel, released under the MIT License. It was developed by Rich Felker to write a clean, efficient, and standards-conformant libc implementation.
Usage on Operating Systems
Linux distributions which use musl as their standard C library (some use only musl) include but are not limited to:
- Alpine Linux
- Dragora 3
- Gentoo Linux (glibc by default, musl can be chosen at install time)
- OpenWrt
- postmarketOS
- Sabotage
- Morpheus Linux
- Chimera Linux
- Void Linux
The seL4 microkernel ships with musl, for binaries that have been linked against glibc, gcompat, glibmus-hq. can be used to execute them on musl-based distros.
Comparisons between different C library implementations.
Bloat comparison | musl | uClibc | dietlibc | glibc |
---|---|---|---|---|
Complete .a set | 426k | 500k | 120k | 2.0M † |
Complete .so set | 527k | 560k | 185k | 7.9M † |
Smallest static C program | 1.8k | 5k | 0.2k | 662k |
Static hello (using printf) | 13k | 70k | 6k | 662k |
Dynamic overhead (min. dirty) | 20k | 40k | 40k | 48k |
Static overhead (min. dirty) | 8k | 12k | 8k | 28k |
Static stdio overhead (min. dirty) | 8k | 24k | 16k | 36k |
Configurable featureset | no | yes | minimal | minimal |
Behavior on resource exhaustion | musl | uClibc | dietlibc | glibc |
Thread-local storage | reports failure | aborts | n/a | aborts |
SIGEV_THREAD timers | no failure | n/a | n/a | lost overruns |
pthread_cancel | no failure | aborts | n/a | aborts |
regcomp and regexec | reports failure | crashes | reports failure | crashes |
fnmatch | no failure | unknown | no failure | reports failure |
printf family | no failure | no failure | no failure | reports failure |
strtol family | no failure | no failure | no failure | no failure |
Performance comparison | musl | uClibc | dietlibc | glibc |
Tiny allocation & free | 0.005 | 0.004 | 0.013 | 0.002 |
Big allocation & free | 0.027 | 0.018 | 0.023 | 0.016 |
Allocation contention, local | 0.048 | 0.134 | 0.393 | 0.041 |
Allocation contention, shared | 0.050 | 0.132 | 0.394 | 0.062 |
Zero-fill (memset) | 0.023 | 0.048 | 0.055 | 0.012 |
String length (strlen) | 0.081 | 0.098 | 0.161 | 0.048 |
Byte search (strchr) | 0.142 | 0.243 | 0.198 | 0.028 |
Substring (strstr) | 0.057 | 1.273 | 1.030 | 0.088 |
Thread creation/joining | 0.248 | 0.126 | 45.761 | 0.142 |
Mutex lock/unlock | 0.042 | 0.055 | 0.785 | 0.046 |
UTF-8 decode buffered | 0.073 | 0.140 | 0.257 | 0.351 |
UTF-8 decode byte-by-byte | 0.153 | 0.395 | 0.236 | 0.563 |
Stdio putc/getc | 0.270 | 0.808 | 7.791 | 0.497 |
Stdio putc/getc unlocked | 0.200 | 0.282 | 0.269 | 0.144 |
Regex compile | 0.058 | 0.041 | 0.014 | 0.039 |
Regex search (a{25}b) | 0.188 | 0.188 | 0.967 | 0.137 |
Self-exec (static linked) | 234µs | 245µs | 272µs | 457µs |
Self-exec (dynamic linked) | 446µs | 590µs | 675µs | 864µs |
ABI and versioning comparison | musl | uClibc | dietlibc | glibc |
Stable ABI | yes | no | unofficially | yes |
LSB-compatible ABI | incomplete | no | no | yes |
Backwards compatibility | yes | no | unofficially | yes |
Forwards compatibility | yes | no | unofficially | no |
Atomic upgrades | yes | no | no | no |
Symbol versioning | no | no | no | yes |
Algorithms comparison | musl | uClibc | dietlibc | glibc |
Substring search (strstr) | twoway | naive | naive | twoway |
Regular expressions | dfa | dfa | backtracking | dfa |
Sorting (qsort) | smoothsort | shellsort | naive quicksort | introsort |
Allocator (malloc) | musl-native | dlmalloc | diet-native | ptmalloc |
Features comparison | musl | uClibc | dietlibc | glibc |
Conformant printf | yes | yes | no | yes |
Exact floating point printing | yes | no | no | yes |
C99 math library | yes | partial | no | yes |
C11 threads API | yes | no | no | no |
C11 thread-local storage | yes | yes | no | yes |
GCC libstdc++ compatibility | yes | yes | no | yes |
POSIX threads | yes | yes, on most archs | broken | yes |
POSIX process scheduling | stub | incorrect | no | incorrect |
POSIX thread priority scheduling | yes | yes | no | yes |
POSIX localedef | no | no | no | yes |
Wide character interfaces | yes | yes | minimal | yes |
Legacy 8-bit codepages | no | yes | minimal | slow, via gconv |
Legacy CJK encodings | no | no | no | slow, via gconv |
UTF-8 multibyte | native; 100% conformant | native; nonconformant | dangerously nonconformant | slow, via gconv; nonconformant |
Iconv character conversions | most major encodings | mainly UTFs | no | the kitchen sink |
Iconv transliteration extension | no | no | no | yes |
Openwall-style TCB shadow | yes | no | no | no |
Sun RPC, NIS | no | yes | yes | yes |
Zoneinfo (advanced timezones) | yes | no | yes | yes |
Gmon profiling | no | no | yes | yes |
Debugging features | no | no | no | yes |
Various Linux extensions | yes | yes | partial | yes |
Target architectures comparison | musl | uClibc | dietlibc | glibc |
i386 | yes | yes | yes | yes |
x86_64 | yes | yes | yes | yes |
x86_64 x32 ABI (ILP32) | experimental | no | no | non-conforming |
ARM | yes | yes | yes | yes |
Aarch64 (64-bit ARM) | yes | no | no | yes |
MIPS | yes | yes | yes | yes |
SuperH | yes | yes | no | yes |
Microblaze | yes | partial | no | yes |
PowerPC (32- and 64-bit) | yes | yes | yes | yes |
Sparc | no | yes | yes | yes |
Alpha | no | yes | yes | yes |
S/390 (32-bit) | no | no | yes | yes |
S/390x (64-bit) | yes | no | yes | yes |
OpenRISC 1000 (or1k) | yes | no | no | not upstream |
Motorola 680x0 (m68k) | yes | yes | no | yes |
MMU-less microcontrollers | yes, elf/fdpic | yes, bflt | no | no |
Build environment comparison | musl | uClibc | dietlibc | glibc |
Legacy-code-friendly headers | partial | yes | no | yes |
Lightweight headers | yes | no | yes | no |
Usable without native toolchain | yes | no | yes | no |
Respect for C namespace | yes | LFS64 problems | no | LFS64 problems |
Respect for POSIX namespace | yes | LFS64 problems | no | LFS64 problems |
Security/hardening comparison | musl | uClibc | dietlibc | glibc |
Attention to corner cases | yes | yes | no | too much malloc |
Safe UTF-8 decoder | yes | yes | no | yes |
Avoids superlinear big-O's | yes | sometimes | no | yes |
Stack smashing protection | yes | yes | no | yes |
Heap corruption detection | yes | no | no | yes |
Misc. comparisons | musl | uClibc | dietlibc | glibc |
License | MIT | LGPL 2.1 | GPL 2 | LGPL 2.1+ w/exceptions |
Official benchmarks [1]