mirror of
git://git.musl-libc.org/musl
synced 2024-12-15 11:15:07 +00:00
41d518360f
prefer using visibility=hidden for __libc internal data, rather than an accessor function, if the compiler has visibility. optimize with -O3 for PIC targets (shared library). without heavy inlining, reloading the GOT register in small functions kills performance. 20-30% size increase for a single libc.so is not a big deal, compared to comparaible size increase in every static binaries. use -Bsymbolic-functions, not -Bsymbolic. global variables are subject to COPY relocations, and thus binding their addresses in the library at link time will cause library functions to read the wrong (original) copies instead of the copies made in the main program's bss section. add entry point, _start, for dynamic linker.
106 lines
2.4 KiB
Makefile
106 lines
2.4 KiB
Makefile
#
|
|
# Makefile for musl (requires GNU make)
|
|
#
|
|
# This is how simple every makefile should be...
|
|
# No, I take that back - actually most should be less than half this size.
|
|
#
|
|
# Use config.mak to override any of the following variables.
|
|
# Do not make changes here.
|
|
#
|
|
|
|
exec_prefix = /usr/local
|
|
bindir = $(exec_prefix)/bin
|
|
|
|
prefix = /usr/local/musl
|
|
includedir = $(prefix)/include
|
|
libdir = $(prefix)/lib
|
|
|
|
SRCS = $(sort $(wildcard src/*/*.c))
|
|
OBJS = $(SRCS:.c=.o)
|
|
LOBJS = $(OBJS:.o=.lo)
|
|
GENH = include/bits/alltypes.h
|
|
|
|
CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe
|
|
LDFLAGS = -nostdlib -shared -fPIC -Wl,-e,_start -Wl,-Bsymbolic-functions
|
|
INC = -I./include -I./src/internal -I./arch/$(ARCH)
|
|
PIC = -fPIC -O3
|
|
AR = $(CROSS_COMPILE)ar
|
|
RANLIB = $(CROSS_COMPILE)ranlib
|
|
OBJCOPY = $(CROSS_COMPILE)objcopy
|
|
|
|
ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH))
|
|
|
|
EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl
|
|
EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
|
|
CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
|
|
LIBC_LIBS = lib/libc.a
|
|
ALL_LIBS = $(LIBC_LIBS) $(CRT_LIBS) $(EMPTY_LIBS)
|
|
|
|
ALL_TOOLS = tools/musl-gcc
|
|
|
|
-include config.mak
|
|
|
|
all: $(ALL_LIBS) $(ALL_TOOLS)
|
|
|
|
install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%) $(ALL_TOOLS:tools/%=$(DESTDIR)$(bindir)/%)
|
|
|
|
clean:
|
|
rm -f crt/*.o
|
|
rm -f $(OBJS)
|
|
rm -f $(LOBJS)
|
|
rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so
|
|
rm -f $(ALL_TOOLS)
|
|
rm -f $(GENH)
|
|
rm -f include/bits
|
|
|
|
include/bits:
|
|
@test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; }
|
|
ln -sf ../arch/$(ARCH)/bits $@
|
|
|
|
include/bits/alltypes.h.sh: include/bits
|
|
|
|
include/bits/alltypes.h: include/bits/alltypes.h.sh
|
|
sh $< > $@
|
|
|
|
%.o: $(ARCH)/%.s
|
|
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
|
|
|
|
%.o: %.c $(GENH)
|
|
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
|
|
|
|
%.lo: $(ARCH)/%.s
|
|
$(CC) $(CFLAGS) $(INC) $(PIC) -c -o $@ $<
|
|
|
|
%.lo: %.c $(GENH)
|
|
$(CC) $(CFLAGS) $(INC) $(PIC) -c -o $@ $<
|
|
|
|
lib/libc.so: $(LOBJS)
|
|
$(CC) $(LDFLAGS) -o $@ $(LOBJS) -lgcc
|
|
$(OBJCOPY) --weaken $@
|
|
|
|
lib/libc.a: $(OBJS)
|
|
rm -f $@
|
|
$(AR) rc $@ $(OBJS)
|
|
$(RANLIB) $@
|
|
|
|
$(EMPTY_LIBS):
|
|
rm -f $@
|
|
$(AR) rc $@
|
|
|
|
lib/%.o: crt/%.o
|
|
cp $< $@
|
|
|
|
tools/musl-gcc: tools/gen-musl-gcc.sh config.mak
|
|
sh $< "$(prefix)" > $@ || { rm -f $@ ; exit 1 ; }
|
|
chmod +x $@
|
|
|
|
$(DESTDIR)$(bindir)/%: tools/%
|
|
install -D $< $@
|
|
|
|
$(DESTDIR)$(prefix)/%: %
|
|
install -D -m 644 $< $@
|
|
|
|
.PRECIOUS: $(CRT_LIBS:lib/%=crt/%)
|
|
|
|
.PHONY: all clean install
|