1.下载,解压musl libc库:
2.配置/编译:
./configure && make
或者./configure --prefix=/home/caozilong/Workspace/linux/musl/install && make
生成的库文件:
如果指定--prefix,则 make install 会安装头文件和库到指定目录:
可以看到,除了几个.o以及libc.a和libc.so有内容之外,其它的库都是空实现,这点和GLIBC有所不同,大概原因可能是MUSL将主要实现放在LIBC里面,而通过符号连接或者STUB的方式引用其他的库。
删除编译结果:make clean
最后一部在obj目录下生成的musl-gcc可执行文件,是对GCC的一个包装,用来编译基于musl的应用程序.
musl-gcc是一个脚本文件,在脚本中,对gcc的specs文件进行了替换,替换为musl的,这样,使用此脚本编译的程序就不会链接系统内的库了。
我们写一个应用:
编译:
./obj/musl-gcc -static main.c -Wl,-Map=linker.map
运行:
查看map 文件
gcc -std=c99 -nostdinc -ffreestanding -fexcess-precision=standard -frounding-math -Wa,--noexecstack -D_XOPEN_SOURCE=700 -I./arch/x86_64 -I./arch/generic -Iobj/src/internal -I./src/include -I./src/internal -Iobj/include -I./include -Os -pipe -fomit-frame-pointer -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -Wno-pointer-to-int-cast -Werror=implicit-function-declaration -Werror=implicit-int -Werror=pointer-sign -Werror=pointer-arith -Werror=int-conversion -Werror=incompatible-pointer-types -Werror=discarded-qualifiers -Werror=discarded-array-qualifiers -Waddress -Warray-bounds -Wchar-subscripts -Wduplicate-decl-specifier -Winit-self -Wreturn-type -Wsequence-point -Wstrict-aliasing -Wunused-function -Wunused-label -Wunused-variable -fno-stack-protector -fno-stack-protector -fPIC -c -o obj/ldso/dlstart.lo ldso/dlstart.c
gcc -std=c99 -nostdinc -ffreestanding -fexcess-precision=standard -frounding-math -Wa,--noexecstack -D_XOPEN_SOURCE=700 -I./arch/x86_64 -I./arch/generic -Iobj/src/internal -I./src/include -I./src/internal -Iobj/include -I./include -Os -pipe -fomit-frame-pointer -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -Wno-pointer-to-int-cast -Werror=implicit-function-declaration -Werror=implicit-int -Werror=pointer-sign -Werror=pointer-arith -Werror=int-conversion -Werror=incompatible-pointer-types -Werror=discarded-qualifiers -Werror=discarded-array-qualifiers -Waddress -Warray-bounds -Wchar-subscripts -Wduplicate-decl-specifier -Winit-self -Wreturn-type -Wsequence-point -Wstrict-aliasing -Wunused-function -Wunused-label -Wunused-variable -fno-stack-protector -fno-stack-protector -fPIC -c -o obj/ldso/dynlink.lo ldso/dynlink.c
gcc -std=c99 -nostdinc -ffreestanding -fexcess-precision=standard -frounding-math -Wa,--noexecstack -D_XOPEN_SOURCE=700 -I./arch/x86_64 -I./arch/generic -Iobj/src/internal -I./src/include -I./src/internal -Iobj/include -I./include -Os -pipe -fomit-frame-pointer -fno-unwind-tables -fno-asynchronous-unwind-tables -ffunction-sections -fdata-sections -Wno-pointer-to-int-cast -Werror=implicit-function-declaration -Werror=implicit-int -Werror=pointer-sign -Werror=pointer-arith -Werror=int-conversion -Werror=incompatible-pointer-types -Werror=discarded-qualifiers -Werror=discarded-array-qualifiers -Waddress -Warray-bounds -Wchar-subscripts -Wduplicate-decl-specifier -Winit-self -Wreturn-type -Wsequence-point -Wstrict-aliasing -Wunused-function -Wunused-label -Wunused-variable -Wl,--sort-section,alignment -Wl,--sort-common -Wl,--gc-sections -Wl,--hash-style=both -Wl,--no-undefined -Wl,--exclude-libs=ALL -Wl,--dynamic-list=./dynamic.list -nostdlib -shared \
-Wl,-e,_dlstart -o lib/libc.so obj/src/aio/aio.lo obj/src/aio/aio_suspend.lo obj/src/aio/lio_listio.lo obj/src/complex/__cexp.lo obj/src/complex/__cexpf.lo obj/src/complex/cabs.lo obj/src/complex/cabsf.lo obj/src/complex/cabsl.lo obj/src/complex/cacos.lo obj/src/complex/cacosf.lo obj/src/complex/cacosh.lo obj/src/complex/cacoshf.lo obj/src/complex/cacoshl.lo obj/src/complex/cacosl.lo obj/src/complex/carg.lo obj/src/complex/cargf.lo obj/src/complex/cargl.lo obj/src/complex/casin.lo obj/src/complex/casinf.lo obj/src/complex/casinh.lo obj/src/complex/casinhf.lo obj/src/complex/casinhl.lo obj/src/complex/casinl.lo obj/src/complex/catan.lo obj/src/complex/catanf.lo obj/src/complex/catanh.lo obj/src/complex/catanhf.lo obj/src/complex/catanhl.lo obj/src/complex/catanl.lo obj/src/complex/ccos.lo obj/src/complex/ccosf.lo obj/src/complex/ccosh.lo obj/src/complex/ccoshf.lo obj/src/complex/ccoshl.lo obj/src/complex/ccosl.lo obj/src/complex/cexp.lo obj/src/complex/cexpf.lo obj/src/complex/cexpl.lo obj/src/complex/cimag.lo obj/src/complex/cimagf.lo obj/src/complex/cimagl.lo obj/src/complex/clog.lo obj/src/complex/clogf.lo obj/src/complex/clogl.lo obj/src/complex/conj.lo obj/src/complex/conjf.lo obj/src/complex/conjl.lo obj/src/complex/cpow.lo obj/src/complex/cpowf.lo obj/src/complex/cpowl.lo obj/src/complex/cproj.lo obj/src/complex/cprojf.lo obj/src/complex/cprojl.lo obj/src/complex/creal.lo obj/src/complex/crealf.lo obj/src/complex/creall.lo obj/src/complex/csin.lo obj/src/complex/csinf.lo obj/src/complex/csinh.lo obj/src/complex/csinhf.lo obj/src/complex/csinhl.lo obj/src/complex/csinl.lo obj/src/complex/csqrt.lo obj/src/complex/csqrtf.lo obj/src/complex/csqrtl.lo obj/src/complex/ctan.lo obj/src/complex/ctanf.lo obj/src/complex/ctanh.lo obj/src/complex/ctanhf.lo obj/src/complex/ctanhl.lo obj/src/complex/ctanl.lo obj/src/conf/confstr.lo obj/src/conf/fpathconf.lo obj/src/conf/legacy.lo obj/src/conf/pathconf.lo obj/src/conf/sysconf.lo obj/src/crypt/crypt.lo obj/src/crypt/crypt_blowfish.lo obj/src/crypt/crypt_des.lo obj/src/crypt/crypt_md5.lo obj/src/crypt/crypt_r.lo obj/src/crypt/crypt_sha256.lo obj/src/crypt/crypt_sha512.lo obj/src/crypt/encrypt.lo obj/src/ctype/__ctype_b_loc.lo obj/src/ctype/__ctype_get_mb_cur_max.lo obj/src/ctype/__ctype_tolower_loc.lo obj/src/ctype/__ctype_toupper_loc.lo obj/src/ctype/isalnum.lo obj/src/ctype/isalpha.lo obj/src/ctype/isascii.lo obj/src/ctype/isblank.lo obj/src/ctype/iscntrl.lo obj/src/ctype/isdigit.lo obj/src/ctype/isgraph.lo obj/src/ctype/islower.lo obj/src/ctype/isprint.lo obj/src/ctype/ispunct.lo obj/src/ctype/isspace.lo obj/src/ctype/isupper.lo obj/src/ctype/iswalnum.lo obj/src/ctype/iswalpha.lo obj/src/ctype/iswblank.lo obj/src/ctype/iswcntrl.lo obj/src/ctype/iswctype.lo obj/src/ctype/iswdigit.lo obj/src/ctype/iswgraph.lo obj/src/ctype/iswlower.lo obj/src/ctype/iswprint.lo obj/src/ctype/iswpunct.lo obj/src/ctype/iswspace.lo obj/src/ctype/iswupper.lo obj/src/ctype/iswxdigit.lo obj/src/ctype/isxdigit.lo obj/src/ctype/toascii.lo obj/src/ctype/tolower.lo obj/src/ctype/toupper.lo obj/src/ctype/towctrans.lo obj/src/ctype/wcswidth.lo obj/src/ctype/wctrans.lo obj/src/ctype/wcwidth.lo obj/src/dirent/alphasort.lo obj/src/dirent/closedir.lo obj/src/dirent/dirfd.lo obj/src/dirent/fdopendir.lo obj/src/dirent/opendir.lo obj/src/dirent/readdir.lo obj/src/dirent/readdir_r.lo obj/src/dirent/rewinddir.lo obj/src/dirent/scandir.lo obj/src/dirent/seekdir.lo obj/src/dirent/telldir.lo obj/src/dirent/versionsort.lo obj/src/env/__environ.lo obj/src/env/__init_tls.lo obj/src/env/__libc_start_main.lo obj/src/env/__reset_tls.lo obj/src/env/__stack_chk_fail.lo obj/src/env/clearenv.lo obj/src/env/getenv.lo obj/src/env/putenv.lo obj/src/env/secure_getenv.lo obj/src/env/setenv.lo obj/src/env/unsetenv.lo obj/src/errno/__errno_location.lo obj/src/errno/strerror.lo obj/src/exit/_Exit.lo obj/src/exit/abort.lo obj/src/exit/abort_lock.lo obj/src/exit/assert.lo obj/src/exit/at_quick_exit.lo obj/src/exit/atexit.lo obj/src/exit/exit.lo obj/src/exit/quick_exit.lo obj/src/fcntl/creat.lo obj/src/fcntl/fcntl.lo obj/src/fcntl/open.lo obj/src/fcntl/openat.lo obj/src/fcntl/posix_fadvise.lo obj/src/fcntl/posix_fallocate.lo obj/src/fenv/__flt_rounds.lo obj/src/fenv/fegetexceptflag.lo obj/src/fenv/feholdexcept.lo obj/src/fenv/fesetexceptflag.lo obj/src/fenv/fesetround.lo obj/src/fenv/feupdateenv.lo obj/src/fenv/x86_64/fenv.lo obj/src/internal/defsysinfo.lo obj/src/internal/floatscan.lo obj/src/internal/intscan.lo obj/src/internal/libc.lo obj/src/internal/procfdname.lo obj/src/internal/shgetc.lo obj/src/internal/syscall_ret.lo obj/src/internal/vdso.lo obj/src/internal/version.lo obj/src/ipc/ftok.lo obj/src/ipc/msgctl.lo obj/src/ipc/msgget.lo obj/src/ipc/msgrcv.lo obj/src/ipc/msgsnd.lo obj/src/ipc/semctl.lo obj/src/ipc/semget.lo obj/src/ipc/semop.lo obj/src/ipc/semtimedop.lo obj/src/ipc/shmat.lo obj/src/ipc/shmctl.lo obj/src/ipc/shmdt.lo obj/src/ipc/shmget.lo obj/src/ldso/__dlsym.lo obj/src/ldso/dl_iterate_phdr.lo obj/src/ldso/dladdr.lo obj/src/ldso/dlclose.lo obj/src/ldso/dlerror.lo obj/src/ldso/dlinfo.lo obj/src/ldso/dlopen.lo obj/src/ldso/x86_64/dlsym.lo obj/src/ldso/x86_64/tlsdesc.lo obj/src/legacy/cuserid.lo obj/src/legacy/daemon.lo obj/src/legacy/err.lo obj/src/legacy/euidaccess.lo obj/src/legacy/ftw.lo obj/src/legacy/futimes.lo obj/src/legacy/getdtablesize.lo obj/src/legacy/getloadavg.lo obj/src/legacy/getpagesize.lo obj/src/legacy/getpass.lo obj/src/legacy/getusershell.lo obj/src/legacy/isastream.lo obj/src/legacy/lutimes.lo obj/src/legacy/ulimit.lo obj/src/legacy/utmpx.lo obj/src/legacy/valloc.lo obj/src/linux/adjtime.lo obj/src/linux/adjtimex.lo obj/src/linux/arch_prctl.lo obj/src/linux/brk.lo obj/src/linux/cache.lo obj/src/linux/cap.lo obj/src/linux/chroot.lo obj/src/linux/clock_adjtime.lo obj/src/linux/clone.lo obj/src/linux/copy_file_range.lo obj/src/linux/epoll.lo obj/src/linux/eventfd.lo obj/src/linux/fallocate.lo obj/src/linux/fanotify.lo obj/src/linux/flock.lo obj/src/linux/getdents.lo obj/src/linux/getrandom.lo obj/src/linux/gettid.lo obj/src/linux/inotify.lo obj/src/linux/ioperm.lo obj/src/linux/iopl.lo obj/src/linux/klogctl.lo obj/src/linux/membarrier.lo obj/src/linux/memfd_create.lo obj/src/linux/mlock2.lo obj/src/linux/module.lo obj/src/linux/mount.lo obj/src/linux/name_to_handle_at.lo obj/src/linux/open_by_handle_at.lo obj/src/linux/personality.lo obj/src/linux/pivot_root.lo obj/src/linux/ppoll.lo obj/src/linux/prctl.lo obj/src/linux/prlimit.lo obj/src/linux/process_vm.lo obj/src/linux/ptrace.lo obj/src/linux/quotactl.lo obj/src/linux/readahead.lo obj/src/linux/reboot.lo obj/src/linux/remap_file_pages.lo obj/src/linux/sbrk.lo obj/src/linux/sendfile.lo obj/src/linux/setfsgid.lo obj/src/linux/setfsuid.lo obj/src/linux/setgroups.lo obj/src/linux/sethostname.lo obj/src/linux/setns.lo obj/src/linux/settimeofday.lo obj/src/linux/signalfd.lo obj/src/linux/splice.lo obj/src/linux/stime.lo obj/src/linux/swap.lo obj/src/linux/sync_file_range.lo obj/src/linux/syncfs.lo obj/src/linux/sysinfo.lo obj/src/linux/tee.lo obj/src/linux/timerfd.lo obj/src/linux/unshare.lo obj/src/linux/utimes.lo obj/src/linux/vhangup.lo obj/src/linux/vmsplice.lo obj/src/linux/wait3.lo obj/src/linux/wait4.lo obj/src/linux/xattr.lo obj/src/locale/__lctrans.lo obj/src/locale/__mo_lookup.lo obj/src/locale/bind_textdomain_codeset.lo obj/src/locale/c_locale.lo obj/src/locale/catclose.lo obj/src/locale/catgets.lo obj/src/locale/catopen.lo obj/src/locale/dcngettext.lo obj/src/locale/duplocale.lo obj/src/locale/freelocale.lo obj/src/locale/iconv.lo obj/src/locale/iconv_close.lo obj/src/locale/langinfo.lo obj/src/locale/locale_map.lo obj/src/locale/localeconv.lo obj/src/locale/newlocale.lo obj/src/locale/pleval.lo obj/src/locale/setlocale.lo obj/src/locale/strcoll.lo obj/src/locale/strfmon.lo obj/src/locale/strxfrm.lo obj/src/locale/textdomain.lo obj/src/locale/uselocale.lo obj/src/locale/wcscoll.lo obj/src/locale/wcsxfrm.lo obj/src/malloc/calloc.lo obj/src/malloc/free.lo obj/src/malloc/libc_calloc.lo obj/src/malloc/lite_malloc.lo obj/src/malloc/mallocng/aligned_alloc.lo obj/src/malloc/mallocng/donate.lo obj/src/malloc/mallocng/free.lo obj/src/malloc/mallocng/malloc.lo obj/src/malloc/mallocng/malloc_usable_size.lo obj/src/malloc/mallocng/realloc.lo obj/src/malloc/memalign.lo obj/src/malloc/posix_memalign.lo obj/src/malloc/realloc.lo obj/src/malloc/reallocarray.lo obj/src/malloc/replaced.lo obj/src/math/__cos.lo obj/src/math/__cosdf.lo obj/src/math/__cosl.lo obj/src/math/__expo2.lo obj/src/math/__expo2f.lo obj/src/math/__fpclassify.lo obj/src/math/__fpclassifyf.lo obj/src/math/__fpclassifyl.lo obj/src/math/__math_divzero.lo obj/src/math/__math_divzerof.lo obj/src/math/__math_invalid.lo obj/src/math/__math_invalidf.lo obj/src/math/__math_invalidl.lo obj/src/math/__math_oflow.lo obj/src/math/__math_oflowf.lo obj/src/math/__math_uflow.lo obj/src/math/__math_uflowf.lo obj/src/math/__math_xflow.lo obj/src/math/__math_xflowf.lo obj/src/math/__polevll.lo obj/src/math/__rem_pio2.lo obj/src/math/__rem_pio2_large.lo obj/src/math/__rem_pio2f.lo obj/src/math/__rem_pio2l.lo obj/src/math/__signbit.lo obj/src/math/__signbitf.lo obj/src/math/__signbitl.lo obj/src/math/__sin.lo obj/src/math/__sindf.lo obj/src/math/__sinl.lo obj/src/math/__tan.lo obj/src/math/__tandf.lo obj/src/math/__tanl.lo obj/src/math/acos.lo obj/src/math/acosf.lo obj/src/math/acosh.lo obj/src/math/acoshf.lo obj/src/math/acoshl.lo obj/src/math/asin.lo obj/src/math/asinf.lo obj/src/math/asinh.lo obj/src/math/asinhf.lo obj/src/math/asinhl.lo obj/src/math/atan.lo obj/src/math/atan2.lo obj/src/math/atan2f.lo obj/src/math/atanf.lo obj/src/math/atanh.lo obj/src/math/atanhf.lo obj/src/math/atanhl.lo obj/src/math/cbrt.lo obj/src/math/cbrtf.lo obj/src/math/cbrtl.lo obj/src/math/ceil.lo obj/src/math/ceilf.lo obj/src/math/copysign.lo obj/src/math/copysignf.lo obj/src/math/copysignl.lo obj/src/math/cos.lo obj/src/math/cosf.lo obj/src/math/cosh.lo obj/src/math/coshf.lo obj/src/math/coshl.lo obj/src/math/cosl.lo obj/src/math/erf.lo obj/src/math/erff.lo obj/src/math/erfl.lo obj/src/math/exp.lo obj/src/math/exp10.lo obj/src/math/exp10f.lo obj/src/math/exp10l.lo obj/src/math/exp2.lo obj/src/math/exp2f.lo obj/src/math/exp2f_data.lo obj/src/math/exp_data.lo obj/src/math/expf.lo obj/src/math/expm1.lo obj/src/math/expm1f.lo obj/src/math/fdim.lo obj/src/math/fdimf.lo obj/src/math/fdiml.lo obj/src/math/finite.lo obj/src/math/finitef.lo obj/src/math/floor.lo obj/src/math/floorf.lo obj/src/math/fmal.lo obj/src/math/fmax.lo obj/src/math/fmaxf.lo obj/src/math/fmaxl.lo obj/src/math/fmin.lo obj/src/math/fminf.lo obj/src/math/fminl.lo obj/src/math/fmod.lo obj/src/math/fmodf.lo obj/src/math/frexp.lo obj/src/math/frexpf.lo obj/src/math/frexpl.lo obj/src/math/hypot.lo obj/src/math/hypotf.lo obj/src/math/hypotl.lo obj/src/math/ilogb.lo obj/src/math/ilogbf.lo obj/src/math/ilogbl.lo obj/src/math/j0.lo obj/src/math/j0f.lo obj/src/math/j1.lo obj/src/math/j1f.lo obj/src/math/jn.lo obj/src/math/jnf.lo obj/src/math/ldexp.lo obj/src/math/ldexpf.lo obj/src/math/ldexpl.lo obj/src/math/lgamma.lo obj/src/math/lgamma_r.lo obj/src/math/lgammaf.lo obj/src/math/lgammaf_r.lo obj/src/math/lgammal.lo obj/src/math/llround.lo obj/src/math/llroundf.lo obj/src/math/llroundl.lo obj/src/math/log.lo obj/src/math/log10.lo obj/src/math/log10f.lo obj/src/math/log1p.lo obj/src/math/log1pf.lo obj/src/math/log2.lo obj/src/math/log2_data.lo obj/src/math/log2f.lo obj/src/math/log2f_data.lo obj/src/math/log_data.lo obj/src/math/logb.lo obj/src/math/logbf.lo obj/src/math/logbl.lo obj/src/math/logf.lo obj/src/math/logf_data.lo obj/src/math/lround.lo obj/src/math/lroundf.lo obj/src/math/lroundl.lo obj/src/math/modf.lo obj/src/math/modff.lo obj/src/math/modfl.lo obj/src/math/nan.lo obj/src/math/nanf.lo obj/src/math/nanl.lo obj/src/math/nearbyint.lo obj/src/math/nearbyintf.lo obj/src/math/nearbyintl.lo obj/src/math/nextafter.lo obj/src/math/nextafterf.lo obj/src/math/nextafterl.lo obj/src/math/nexttoward.lo obj/src/math/nexttowardf.lo obj/src/math/nexttowardl.lo obj/src/math/pow.lo obj/src/math/pow_data.lo obj/src/math/powf.lo obj/src/math/powf_data.lo obj/src/math/powl.lo obj/src/math/remainder.lo obj/src/math/remainderf.lo obj/src/math/remquo.lo obj/src/math/remquof.lo obj/src/math/rint.lo obj/src/math/rintf.lo obj/src/math/round.lo obj/src/math/roundf.lo obj/src/math/roundl.lo obj/src/math/scalb.lo obj/src/math/scalbf.lo obj/src/math/scalbln.lo obj/src/math/scalblnf.lo obj/src/math/scalblnl.lo obj/src/math/scalbn.lo obj/src/math/scalbnf.lo obj/src/math/scalbnl.lo obj/src/math/signgam.lo obj/src/math/significand.lo obj/src