|
@@ -1,45 +1,58 @@
|
|
|
|
|
|
-A quick-and-simple guide to installing musl:
|
|
|
+==== 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.
|
|
|
|
|
|
-STEP 1: Configuration
|
|
|
+First, some prerequisites:
|
|
|
|
|
|
-Edit config.mak to override installation prefix, compiler options,
|
|
|
-target architecture, etc. as needed. Currently supported archs are
|
|
|
-i386 and x86_64. Otherwise, the defaults should be okay for trying out
|
|
|
-musl with static linking only.
|
|
|
+- 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.
|
|
|
|
|
|
-DO NOT set the prefix to /, /usr, or even /usr/local unless you really
|
|
|
-know what you're doing! You'll probably break your system such that
|
|
|
-you'll no longer be able to compile and link programs against glibc!
|
|
|
-This kind of setup should only be used if you're building a system
|
|
|
-where musl is the default/primary/only libc.
|
|
|
+- GNU make
|
|
|
|
|
|
-The default prefix is /usr/local/musl for a reason, but some people
|
|
|
-may prefer /opt/musl or $HOME/musl.
|
|
|
+- 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.
|
|
|
|
|
|
-For shared library support, the dynamic linker pathname needs to be
|
|
|
-hard-coded into every program you link to musl. Ideally, you should
|
|
|
-leave the path ($syslibdir) set to /lib unless you are unable to
|
|
|
-install files to /lib, in which case you can change it.
|
|
|
+- 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.
|
|
|
|
|
|
-STEP 2: Compiling
|
|
|
|
|
|
-Run "make". (GNU make is required.)
|
|
|
|
|
|
+== Option 1: Installing musl as an alternate C library ==
|
|
|
|
|
|
-STEP 3: Installation
|
|
|
+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.
|
|
|
|
|
|
-With appropriate privileges, run "make install".
|
|
|
+To install musl as an alternate libc, follow these steps:
|
|
|
|
|
|
+1. Edit config.mak to select your system's CPU architecture (i386,
|
|
|
+ x86_64, or arm), installation prefix, location for the dynamic
|
|
|
+ linker, and other build preferences.
|
|
|
|
|
|
-STEP 4: Using the gcc wrapper.
|
|
|
+2. Run "make". Parallel build is fully supported, so you can instead
|
|
|
+ use "make -j3" or so on SMP systems if you like.
|
|
|
|
|
|
-musl comes with a script "musl-gcc" (installed in /usr/local/bin by
|
|
|
-default) that can be used to compile and link C programs against musl.
|
|
|
-It requires a version of gcc with the -wrapper option (gcc 4.x should
|
|
|
-work). For example:
|
|
|
+3. Run "make install" as a user sufficient privileges to write to the
|
|
|
+ destination.
|
|
|
+
|
|
|
+4. Ensure that /etc/ld-musl-$ARCH.path (where $ARCH is replaced by
|
|
|
+ i386, x86_64, etc. as appropriate) contains the correct search path
|
|
|
+ for where you intend to install musl-linked shared library files.
|
|
|
+ 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>
|
|
@@ -52,17 +65,74 @@ EOF
|
|
|
musl-gcc hello.c
|
|
|
./a.out
|
|
|
|
|
|
-For compiling programs that use autoconf, you'll need to configure
|
|
|
-them with a command like this:
|
|
|
+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 musl-gcc wrapper's libc_prefix variable 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. Edit musl's config.mak and set the installation prefix to the
|
|
|
+ prefix your compiler toolchain is configured to search, probably
|
|
|
+ /usr. Set ARCH to match your CPU architecture, and change any other
|
|
|
+ options as you see fit.
|
|
|
+
|
|
|
+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.
|
|
|
|
|
|
-CC=musl-gcc ./configure
|
|
|
+When building programs against musl, you may still want to ensure the
|
|
|
+appropriate feature test macros get defined, as in:
|
|
|
|
|
|
-Be aware that (at present) libraries linked against glibc are unlikely
|
|
|
-to be usable, and the musl-gcc wrapper inhibits search of the system
|
|
|
-library paths in any case. You'll need to compile any prerequisite
|
|
|
-libraries (like ncurses, glib, etc.) yourself.
|
|
|
+CC="gcc -D_GNU_SOURCE" ./configure ...
|
|
|
|
|
|
-Note: If you want the system headers to behave something like glibc's
|
|
|
-and expose the kitchen sink by default, you might want to try
|
|
|
-CC="musl-gcc -D_GNU_SOURCE" instead of just CC=musl-gcc. This is
|
|
|
-needed for compiling many programs with portability issues.
|