diff options
-rw-r--r-- | .gitignore | 7 | ||||
-rw-r--r-- | Makefile | 107 | ||||
-rw-r--r-- | crt/Scrt1.c | 1 | ||||
-rw-r--r-- | crt/rcrt1.c | 14 | ||||
-rw-r--r-- | src/internal/version.c | 1 | ||||
-rw-r--r-- | tools/mkalltypes.sed | 15 |
6 files changed, 123 insertions, 22 deletions
@@ -1,8 +1,3 @@ *.o -*.lo *.a -*.so -*.so.1 -config.mak -lib/musl-gcc.specs -/obj/ +generated diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..aeb1325 --- /dev/null +++ b/Makefile @@ -0,0 +1,107 @@ +AR = ar +CC = gcc +CFLAGS = -Wall -g -O3 -march=native + +arch = x86_64 + +cflags = -pipe -std=c99 -nostdinc -D_XOPEN_SOURCE=700 \ + -ffreestanding -fexcess-precision=standard -fno-strict-aliasing \ + -frounding-math -fno-pic -fno-stack-protector \ + -fno-unwind-tables -fno-asynchronous-unwind-tables \ + -ffunction-sections -fdata-sections \ + -Iarch/$(arch) -Iarch/generic -Isrc/include -Isrc/internal \ + -Igenerated/include -Iinclude $(CFLAGS) + +prefix = / +includedir = $(prefix)/include +libdir = $(prefix)/lib + +src_dirs = src/* src/mallocng crt +common_src = $(wildcard $(addsuffix /*.c, $(src_dirs))) +arch_src = $(wildcard $(addsuffix /$(arch)/*.[csS], $(src_dirs))) + +common_obj = $(common_src:.c=.o) +arch_obj = $(patsubst %, %.o, $(basename $(arch_src))) +replaced_obj = $(subst /$(arch)/,/, $(arch_obj)) +all_obj = $(filter-out $(replaced_obj), $(common_obj) $(arch_obj)) +memops_obj = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(all_obj)) +crt_obj = $(filter crt/%, $(all_obj)) + +generated_headers = $(addprefix generated/include/bits/, \ + alltypes.h syscall.h) +implementation_headers = $(addprefix src/internal/, \ + stdio_impl.h pthread_impl.h locale_impl.h libc.h) + +lib_obj = libc.a crt1.o crti.o crtn.o + +arch_inc = $(wildcard arch/$(arch)/bits/*.h) +generic_inc = $(wildcard arch/generic/bits/*.h) +inc = $(wildcard include/*.h include/*/*.h) +all_inc = $(sort $(inc) $(generated_headers:generated/%=%) \ + $(arch_inc:arch/$(arch)/%=include/%) \ + $(generic_inc:arch/generic/%=include/%)) + +default: $(lib_obj) + +generated_dirs: + mkdir -p $(dir $(generated_headers)) + +$(generated_headers): | generated_dirs + +generated/include/bits/alltypes.h: arch/$(arch)/bits/alltypes.h.in \ + include/alltypes.h.in + sed -f tools/mkalltypes.sed $^ >$@ + +generated/include/bits/syscall.h: arch/$(arch)/bits/syscall.h.in + cp $< $@ + sed -n -e 's/__NR_/SYS_/p' < $< >>$@ + +src/internal/version.o: cflags += -DVERSION=\"$(shell cat VERSION)\" +crt/crt1.o: arch/$(arch)/crt_arch.h +$(memops_obj): cflags += -fno-tree-loop-distribute-patterns +$(crt_obj): cflags += -DCRT + +cc_cmd = $(CC) $(cflags) -c -o $@ $< +as_cmd = $(cc_cmd) +install_cmd = install -D -m 644 $< $@ + +%.o: %.s + $(as_cmd) + +%.o: %.S + $(cc_cmd) + +%.o: %.c $(generated_headers) $(implementation_headers) + $(cc_cmd) + +%.o: crt/$(arch)/%.o + cp $< $@ +%.o: crt/%.o + cp $< $@ + +libc.a: $(all_obj) + rm -f $@ + $(AR) rcs $@ $^ + +$(DESTDIR)$(libdir)/%: % + $(install_cmd) + +$(DESTDIR)$(includedir)/bits/%: arch/$(arch)/bits/% + $(install_cmd) + +$(DESTDIR)$(includedir)/bits/%: arch/generic/bits/% + $(install_cmd) + +$(DESTDIR)$(includedir)/bits/%: generated/include/bits/% + $(install_cmd) + +$(DESTDIR)$(includedir)/%: include/% + $(install_cmd) + +install-libs: $(addprefix $(DESTDIR)$(libdir)/, $(lib_obj)) +install-headers: $(all_inc:include/%=$(DESTDIR)$(includedir)/%) +install: install-libs install-headers + +clean: + rm -rf generated + rm -f crt/*.o src/*/*.o libc.a crt1.o crti.o crtn.o diff --git a/crt/Scrt1.c b/crt/Scrt1.c deleted file mode 100644 index 822f10b..0000000 --- a/crt/Scrt1.c +++ /dev/null @@ -1 +0,0 @@ -#include "crt1.c" diff --git a/crt/rcrt1.c b/crt/rcrt1.c deleted file mode 100644 index 901dff6..0000000 --- a/crt/rcrt1.c +++ /dev/null @@ -1,14 +0,0 @@ -#define START "_start" -#define _dlstart_c _start_c -#include "../ldso/dlstart.c" - -int main(); -weak void _init(); -weak void _fini(); -int __libc_start_main(int (*)(), int, char **, - void (*)(), void(*)(), void(*)()); - -hidden void __dls2(unsigned char *base, size_t *sp) -{ - __libc_start_main(main, *sp, (void *)(sp+1), _init, _fini, 0); -} diff --git a/src/internal/version.c b/src/internal/version.c index 08bbf5b..5d56fb2 100644 --- a/src/internal/version.c +++ b/src/internal/version.c @@ -1,4 +1,3 @@ -#include "version.h" #include "libc.h" const char __libc_version[] = VERSION; diff --git a/tools/mkalltypes.sed b/tools/mkalltypes.sed new file mode 100644 index 0000000..fa15efc --- /dev/null +++ b/tools/mkalltypes.sed @@ -0,0 +1,15 @@ +/^TYPEDEF/s/TYPEDEF \(.*\) \([^ ]*\);$/#if defined(__NEED_\2) \&\& !defined(__DEFINED_\2)\ +typedef \1 \2;\ +#define __DEFINED_\2\ +#endif\ +/ +/^STRUCT/s/STRUCT * \([^ ]*\) \(.*\);$/#if defined(__NEED_struct_\1) \&\& !defined(__DEFINED_struct_\1)\ +struct \1 \2;\ +#define __DEFINED_struct_\1\ +#endif\ +/ +/^UNION/s/UNION * \([^ ]*\) \(.*\);$/#if defined(__NEED_union_\1) \&\& !defined(__DEFINED_union_\1)\ +union \1 \2;\ +#define __DEFINED_union_\1\ +#endif\ +/ |