| |
| ==== Installing musl ==== |
| |
| musl may be installed either as an alternate C library alongside the |
| existing libraries on a system, or as the primary C library for a new |
| or existing musl-based system. |
| |
| This document covers the prerequisites and procedures for compiling |
| and installation. |
| |
| |
| |
| ==== Build Prerequisites ==== |
| |
| The only build-time prerequisites for musl are GNU Make and a |
| freestanding C99 compiler toolchain targeting the desired instruction |
| set architecture and ABI, with support for gcc-style inline assembly, |
| weak aliases, and stand-alone assembly source files. |
| |
| The system used to build musl does not need to be Linux-based, nor do |
| the Linux kernel headers need to be available. |
| |
| If support for dynamic linking is desired, some further requriements |
| are placed on the compiler and linker. In particular, the linker must |
| support the -Bsymbolic-functions option. |
| |
| At present, GCC 4.6 or later is the recommended compiler for building |
| musl. Any earlier version of GCC with full C99 support should also |
| work, but may be subject to minor floating point conformance issues on |
| i386 targets. Sufficiently recent versions of PCC and LLVM/clang are |
| also believed to work, but have not been tested as heavily; prior to |
| Fall 2012, both had known bugs that affected musl. |
| |
| |
| |
| === Supported Targets ==== |
| |
| musl can be built for the following CPU instruction set architecture |
| and ABI combinations: |
| |
| - i386 (requires 387 math and 486 cmpxchg instructions) |
| - x86_64 |
| - arm (EABI) |
| - mips (o32 ABI, requires fpu or float emulation in kernel) |
| - microblaze (requires a cpu with lwx/swx instructions) |
| - powerpc (32-bit, must use "secure plt" mode for dynamic linking) |
| |
| For architectures with both little- and big-endian options, both are |
| supported unless otherwise noted. |
| |
| In general, musl assumes the availability of all Linux syscall |
| interfaces available in Linux 2.6.0. Some programs that do not use |
| threads or other modern functionality may be able to run on 2.4.x |
| kernels. Other kernels (such as BSD) that provide a Linux-compatible |
| syscall ABI should also work but have not been extensively tested. |
| |
| |
| |
| ==== Option 1: Installing musl as an alternate C library ==== |
| |
| In this setup, musl and any third-party libraries linked to musl will |
| reside under an alternate prefix such as /usr/local/musl or /opt/musl. |
| A wrapper script for gcc, called musl-gcc, can be used in place of gcc |
| to compile and link programs and libraries against musl. |
| |
| (Note: There are not yet corresponding wrapper scripts for other |
| compilers, so if you wish to compile and link against musl using |
| another compiler, you are responsible for providing the correct |
| options to override the default include and library search paths.) |
| |
| To install musl as an alternate libc, follow these steps: |
| |
| 1. Configure musl's build with a command similar to: |
| ./configure --prefix=/usr/local/musl --exec-prefix=/usr/local |
| Refer to ./configure --help for details on other options. You may |
| change the install prefix if you like, but DO NOT set it to a |
| location that contains your existing libraries based on another |
| libc such as glibc or uClibc. If you do not intend to use dynamic |
| linking, you may disable it at this point via --disable-shared and |
| cut the build time in half. If you wish to use dynamic linking but |
| do not have permissions to write to /lib, you will need to set an |
| alternate dynamic linker location via --syslibdir. |
| |
| 2. Run "make". Parallel build is fully supported, so you can instead |
| use "make -j3" or so on SMP systems if you like. |
| |
| 3. Run "make install" as a user sufficient privileges to write to the |
| destination. |
| |
| 4. Create a file named /etc/ld-musl-$ARCH.path (where $ARCH is |
| replaced by i386, x86_64, etc. as appropriate) containing the |
| correct colon-delimited search path for where you intend to install |
| musl-linked shared library files. If this file is missing, musl |
| will search the standard path, and you will encounter problems when |
| it attempts to load libraries linked against your host libc. Note |
| that this step can be skipped if you disabled dynamic linking. |
| |
| After installing, you can use musl via the musl-gcc wrapper. For |
| example: |
| |
| cat > hello.c <<EOF |
| #include <stdio.h> |
| int main() |
| { |
| printf("hello, world!\n"); |
| return 0; |
| } |
| EOF |
| musl-gcc hello.c |
| ./a.out |
| |
| To configure autoconf-based program to compile and link against musl, |
| set the CC variable to musl-gcc when running configure, as in: |
| |
| CC=musl-gcc ./configure ... |
| |
| You will probably also want to use --prefix when building libraries to |
| ensure that they are installed under the musl prefix and not in the |
| main host system library directories. |
| |
| Finally, it's worth noting that musl's include and lib directories in |
| the build tree are setup to be usable without installation, if |
| necessary. Just modify the the paths in the spec file used by musl-gcc |
| (it's located at $prefix/lib/musl-gcc.specs) to point to the |
| source/build tree. |
| |
| |
| |
| ==== Option 2: Installing musl as the primary C library ==== |
| |
| In this setup, you will need an existing compiler/toolchain. It |
| shouldnt matter whether it was configured for glibc, uClibc, musl, or |
| something else entirely, but sometimes gcc can be uncooperative, |
| especially if the system distributor has built gcc with strange |
| options. It probably makes the most sense to perform the following |
| steps inside a chroot setup or on a virtualized machine with the |
| filesystem containing just a minimal toolchain. |
| |
| WARNING: DO NOT DO THIS ON AN EXISTING SYSTEM UNLESS YOU REALLY WANT |
| TO CONVERT IT TO BE A MUSL-BASED SYSTEM!! |
| |
| 1. If you are just upgrading an existing version of musl, you can skip |
| step 1 entirely. Otherwise, move the existing include and lib |
| directories on your system out of the way. Unless all the binaries |
| you will need are static-linked, you should edit /etc/ld.so.conf |
| (or equivalent) and put the new locations of your old libraries in |
| the search path before you move them, or your system will break |
| badly and you will not be able to continue. |
| |
| 2. Configure musl's build with a command similar to: |
| ./configure --prefix=/usr --disable-gcc-wrapper |
| Refer to ./configure --help for details on other options. |
| |
| 3. Run "make" to compile musl. |
| |
| 4. Run "make install" with appropriate privileges. |
| |
| 5. If you are using gcc and wish to use dynamic linking, find the gcc |
| directory containing libgcc.a (it should be something like |
| /usr/lib/gcc/i486-linux-gnu/4.3.5, with the arch and version |
| possibly different) and look for a specs file there. If none |
| exists, use "gcc -dumpspecs > specs" to generate a specs file. Find |
| the dynamic linker (/lib/ld-linux.so.2 or similar) and change it to |
| "/lib/ld-musl-$ARCH.so.1" (with $ARCH replaced by your CPU arch). |
| |
| At this point, musl should be the default libc. Compile a small test |
| program with gcc and verify (using readelf -a or objdump -x) that the |
| dynamic linker (program interpreter) is /lib/ld-musl-$ARCH.so.1. If |
| you're using static linking only, you might instead check the symbols |
| and look for anything suspicious that would indicate your old glibc or |
| uClibc was used. |