| |
| ==== 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. |
| |
| First, some prerequisites: |
| |
| - A C99 compiler with gcc-style inline assembly support, support for |
| weak aliases, and support for building stand-alone assembly files. |
| gcc 3.x and 4.x are known to work. pcc and LLVM/clang may work but |
| are untested, and pcc is known to have some bugs. |
| |
| - GNU make |
| |
| - Linux, preferably 2.6.22 or later. Older versions are known to have |
| serious bugs that will make some interfaces non-conformant, but if |
| you don't need threads or POSIX 2008 features, even 2.4 is probably |
| okay. |
| |
| - A supported CPU architecture (currently i386, x86_64, or arm). |
| |
| - If you want to use dynamic linking, it's recommended that you have |
| permissions to write to /lib and /etc. Otherwise your binaries will |
| have to use a nonstandard dynamic linker path. |
| |
| |
| |
| == 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. |
| |
| 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, |
| you may wish to use: |
| |
| CC="musl-gcc -D_GNU_SOURCE" ./configure ... |
| |
| Correctly-written build systems should not need -D_GNU_SOURCE as part |
| of $CC, but many programs do not use feature-test macros correctly and |
| simply assume the compiler will automatically give them the kitchen |
| sink, so the above command is an easy workaround. |
| |
| 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. |
| |
| When building programs against musl, you may still want to ensure the |
| appropriate feature test macros get defined, as in: |
| |
| CC="gcc -D_GNU_SOURCE" ./configure ... |
| |