几种C库比较(musl uClibc dietlibc glibc)
| 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) | experimental | no | no | yes |
| MIPS | yes | yes | yes | yes |
| SuperH | experimental | yes | no | yes |
| Microblaze | yes | partial | no | yes |
| PowerPC | yes | yes | yes | yes |
| Sparc | no | yes | yes | yes |
| Alpha | no | yes | yes | yes |
| S/390 | no | no | yes | yes |
| OpenRISC 1000 (or1k) | yes | no | no | not upstream |
| MMU-less microcontrollers | no | yes | 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 |
refered to: http://www.etalabs.net/compare_libcs.html
浙公网安备 33010602011771号