Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 1 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 2 | ==== Installing musl ==== |
| 3 | |
| 4 | musl may be installed either as an alternate C library alongside the |
| 5 | existing libraries on a system, or as the primary C library for a new |
| 6 | or existing musl-based system. |
| 7 | |
Rich Felker | 3ffb556 | 2012-10-26 20:14:19 -0400 | [diff] [blame] | 8 | This document covers the prerequisites and procedures for compiling |
| 9 | and installation. |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 10 | |
| 11 | |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 12 | |
Rich Felker | 3ffb556 | 2012-10-26 20:14:19 -0400 | [diff] [blame] | 13 | ==== Build Prerequisites ==== |
| 14 | |
| 15 | The only build-time prerequisites for musl are GNU Make and a |
| 16 | freestanding C99 compiler toolchain targeting the desired instruction |
| 17 | set architecture and ABI, with support for gcc-style inline assembly, |
| 18 | weak aliases, and stand-alone assembly source files. |
| 19 | |
| 20 | The system used to build musl does not need to be Linux-based, nor do |
| 21 | the Linux kernel headers need to be available. |
| 22 | |
| 23 | If support for dynamic linking is desired, some further requriements |
| 24 | are placed on the compiler and linker. In particular, the linker must |
| 25 | support the -Bsymbolic-functions option. |
| 26 | |
| 27 | At present, GCC 4.6 or later is the recommended compiler for building |
| 28 | musl. Any earlier version of GCC with full C99 support should also |
| 29 | work, but may be subject to minor floating point conformance issues on |
| 30 | i386 targets. Sufficiently recent versions of PCC and LLVM/clang are |
| 31 | also believed to work, but have not been tested as heavily; prior to |
| 32 | Fall 2012, both had known bugs that affected musl. |
| 33 | |
| 34 | |
| 35 | |
| 36 | === Supported Targets ==== |
| 37 | |
| 38 | musl can be built for the following CPU instruction set architecture |
| 39 | and ABI combinations: |
| 40 | |
| 41 | - i386 (requires 387 math and 486 cmpxchg instructions) |
| 42 | - x86_64 |
| 43 | - arm (EABI) |
| 44 | - mips (o32 ABI, requires fpu or float emulation in kernel) |
| 45 | - microblaze (requires a cpu with lwx/swx instructions) |
Rich Felker | e6dcebd | 2012-11-26 21:01:30 -0500 | [diff] [blame] | 46 | - powerpc (32-bit, must use "secure plt" mode for dynamic linking) |
Rich Felker | 3ffb556 | 2012-10-26 20:14:19 -0400 | [diff] [blame] | 47 | |
| 48 | For architectures with both little- and big-endian options, both are |
| 49 | supported unless otherwise noted. |
| 50 | |
| 51 | In general, musl assumes the availability of all Linux syscall |
| 52 | interfaces available in Linux 2.6.0. Some programs that do not use |
| 53 | threads or other modern functionality may be able to run on 2.4.x |
| 54 | kernels. Other kernels (such as BSD) that provide a Linux-compatible |
| 55 | syscall ABI should also work but have not been extensively tested. |
| 56 | |
| 57 | |
| 58 | |
| 59 | ==== Option 1: Installing musl as an alternate C library ==== |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 60 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 61 | In this setup, musl and any third-party libraries linked to musl will |
| 62 | reside under an alternate prefix such as /usr/local/musl or /opt/musl. |
| 63 | A wrapper script for gcc, called musl-gcc, can be used in place of gcc |
| 64 | to compile and link programs and libraries against musl. |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 65 | |
Rich Felker | 3ffb556 | 2012-10-26 20:14:19 -0400 | [diff] [blame] | 66 | (Note: There are not yet corresponding wrapper scripts for other |
| 67 | compilers, so if you wish to compile and link against musl using |
| 68 | another compiler, you are responsible for providing the correct |
| 69 | options to override the default include and library search paths.) |
| 70 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 71 | To install musl as an alternate libc, follow these steps: |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 72 | |
Rich Felker | a235630 | 2012-05-04 23:53:50 -0400 | [diff] [blame] | 73 | 1. Configure musl's build with a command similar to: |
| 74 | ./configure --prefix=/usr/local/musl --exec-prefix=/usr/local |
| 75 | Refer to ./configure --help for details on other options. You may |
| 76 | change the install prefix if you like, but DO NOT set it to a |
| 77 | location that contains your existing libraries based on another |
| 78 | libc such as glibc or uClibc. If you do not intend to use dynamic |
| 79 | linking, you may disable it at this point via --disable-shared and |
| 80 | cut the build time in half. If you wish to use dynamic linking but |
| 81 | do not have permissions to write to /lib, you will need to set an |
| 82 | alternate dynamic linker location via --syslibdir. |
Rich Felker | f9c9d8c | 2011-06-27 22:34:47 -0400 | [diff] [blame] | 83 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 84 | 2. Run "make". Parallel build is fully supported, so you can instead |
| 85 | use "make -j3" or so on SMP systems if you like. |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 86 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 87 | 3. Run "make install" as a user sufficient privileges to write to the |
| 88 | destination. |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 89 | |
Rich Felker | a235630 | 2012-05-04 23:53:50 -0400 | [diff] [blame] | 90 | 4. Create a file named /etc/ld-musl-$ARCH.path (where $ARCH is |
| 91 | replaced by i386, x86_64, etc. as appropriate) containing the |
| 92 | correct colon-delimited search path for where you intend to install |
| 93 | musl-linked shared library files. If this file is missing, musl |
| 94 | will search the standard path, and you will encounter problems when |
| 95 | it attempts to load libraries linked against your host libc. Note |
| 96 | that this step can be skipped if you disabled dynamic linking. |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 97 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 98 | After installing, you can use musl via the musl-gcc wrapper. For |
| 99 | example: |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 100 | |
| 101 | cat > hello.c <<EOF |
| 102 | #include <stdio.h> |
| 103 | int main() |
| 104 | { |
| 105 | printf("hello, world!\n"); |
| 106 | return 0; |
| 107 | } |
| 108 | EOF |
| 109 | musl-gcc hello.c |
| 110 | ./a.out |
| 111 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 112 | To configure autoconf-based program to compile and link against musl, |
Rich Felker | c1a9658 | 2012-09-07 23:13:55 -0400 | [diff] [blame] | 113 | set the CC variable to musl-gcc when running configure, as in: |
Rich Felker | 0b44a03 | 2011-02-12 00:22:29 -0500 | [diff] [blame] | 114 | |
Rich Felker | c1a9658 | 2012-09-07 23:13:55 -0400 | [diff] [blame] | 115 | CC=musl-gcc ./configure ... |
Rich Felker | f9c9d8c | 2011-06-27 22:34:47 -0400 | [diff] [blame] | 116 | |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 117 | You will probably also want to use --prefix when building libraries to |
| 118 | ensure that they are installed under the musl prefix and not in the |
| 119 | main host system library directories. |
| 120 | |
| 121 | Finally, it's worth noting that musl's include and lib directories in |
| 122 | the build tree are setup to be usable without installation, if |
Rich Felker | a235630 | 2012-05-04 23:53:50 -0400 | [diff] [blame] | 123 | necessary. Just modify the the paths in the spec file used by musl-gcc |
| 124 | (it's located at $prefix/lib/musl-gcc.specs) to point to the |
| 125 | source/build tree. |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 126 | |
| 127 | |
| 128 | |
Rich Felker | 3ffb556 | 2012-10-26 20:14:19 -0400 | [diff] [blame] | 129 | ==== Option 2: Installing musl as the primary C library ==== |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 130 | |
| 131 | In this setup, you will need an existing compiler/toolchain. It |
| 132 | shouldnt matter whether it was configured for glibc, uClibc, musl, or |
| 133 | something else entirely, but sometimes gcc can be uncooperative, |
| 134 | especially if the system distributor has built gcc with strange |
| 135 | options. It probably makes the most sense to perform the following |
| 136 | steps inside a chroot setup or on a virtualized machine with the |
| 137 | filesystem containing just a minimal toolchain. |
| 138 | |
| 139 | WARNING: DO NOT DO THIS ON AN EXISTING SYSTEM UNLESS YOU REALLY WANT |
| 140 | TO CONVERT IT TO BE A MUSL-BASED SYSTEM!! |
| 141 | |
| 142 | 1. If you are just upgrading an existing version of musl, you can skip |
| 143 | step 1 entirely. Otherwise, move the existing include and lib |
| 144 | directories on your system out of the way. Unless all the binaries |
| 145 | you will need are static-linked, you should edit /etc/ld.so.conf |
| 146 | (or equivalent) and put the new locations of your old libraries in |
| 147 | the search path before you move them, or your system will break |
| 148 | badly and you will not be able to continue. |
| 149 | |
Rich Felker | a235630 | 2012-05-04 23:53:50 -0400 | [diff] [blame] | 150 | 2. Configure musl's build with a command similar to: |
| 151 | ./configure --prefix=/usr --disable-gcc-wrapper |
| 152 | Refer to ./configure --help for details on other options. |
Rich Felker | 7dd86ec | 2011-09-21 19:39:40 -0400 | [diff] [blame] | 153 | |
| 154 | 3. Run "make" to compile musl. |
| 155 | |
| 156 | 4. Run "make install" with appropriate privileges. |
| 157 | |
| 158 | 5. If you are using gcc and wish to use dynamic linking, find the gcc |
| 159 | directory containing libgcc.a (it should be something like |
| 160 | /usr/lib/gcc/i486-linux-gnu/4.3.5, with the arch and version |
| 161 | possibly different) and look for a specs file there. If none |
| 162 | exists, use "gcc -dumpspecs > specs" to generate a specs file. Find |
| 163 | the dynamic linker (/lib/ld-linux.so.2 or similar) and change it to |
| 164 | "/lib/ld-musl-$ARCH.so.1" (with $ARCH replaced by your CPU arch). |
| 165 | |
| 166 | At this point, musl should be the default libc. Compile a small test |
| 167 | program with gcc and verify (using readelf -a or objdump -x) that the |
| 168 | dynamic linker (program interpreter) is /lib/ld-musl-$ARCH.so.1. If |
| 169 | you're using static linking only, you might instead check the symbols |
| 170 | and look for anything suspicious that would indicate your old glibc or |
| 171 | uClibc was used. |