mirror of git://git.musl-libc.org/musl
138 lines
5.6 KiB
Plaintext
138 lines
5.6 KiB
Plaintext
|
|
==== 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, arm, or mips).
|
|
|
|
- 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,
|
|
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.
|