aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2024-04-06 19:46:41 -0400
committerIan Moffett <ian@osmora.org>2024-04-06 19:48:10 -0400
commit8370d0a3eb373c37386de32ccd3a8a38ddeb8b02 (patch)
tree2f390a0f8206c8dca80362dd49b01ef3ecec1fc2
parenteccaaf54d8e5ab90ed0cf9dd3be8204e35115692 (diff)
build: Statically link libc
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r--Makefile.in13
-rw-r--r--lib/libc/Makefile19
-rw-r--r--lib/libc/src/arch/amd64/crt0.S (renamed from lib/libc/linker/entry.S)6
-rw-r--r--lib/libc/src/main.c (renamed from lib/libc/linker/entry.c)26
-rw-r--r--usr.sbin/Makefile5
-rw-r--r--usr.sbin/init/Makefile7
-rw-r--r--usr.sbin/init/main.c5
-rw-r--r--usr.sbin/sbin.mk4
8 files changed, 37 insertions, 48 deletions
diff --git a/Makefile.in b/Makefile.in
index f4336a7..7cc093a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -47,8 +47,9 @@ else
override LD = $(shell pwd)/cross/bin/$(ARCH)-hyra-ld
endif
override AS = $(CC)
-override LDSO = $(shell pwd)/base/usr/lib/ld.so
-override USER_MKFLGS = CC=$(CC) LD=$(LD) LDSO=$(LDSO)
+override USRDIR=$(shell pwd)/base/usr/
+override LIBC = libc.a
+override USER_MKFLGS = CC=$(CC) LD=$(LD) LIBC=$(LIBC) USRDIR=$(USRDIR)
##########################
# Architecture specifics
@@ -71,7 +72,7 @@ override KERNEL_ASMOBJECTS = $(KERNEL_ASMFILES:.S=.S.o)
override KERNEL_HEADER_DEPS = $(KERNEL_CFILES:.c=.d)
.PHONY: all
-all: base lib userland base/usr/lib/ld.so base/boot/hyra-kernel
+all: base lib userland base/boot/hyra-kernel
rm -f sys/include/machine
rm -rf iso_root
@@ -87,11 +88,12 @@ base:
mkdir -p base/usr/lib/
mkdir -p base/usr/sbin/
mkdir -p base/boot/
+ cd base/usr/; ln -sf ../../lib/libc/include/ .
.PHONY: lib
lib:
cd lib/; make $(USER_MKFLGS)
- cp lib/libc/build/ld.so base/usr/lib/
+ cp lib/libc/build/libc.a base/usr/lib/
.PHONY: run
run:
@@ -106,8 +108,7 @@ distclean:
make clean
rm -f $(KERNEL_ASMOBJECTS) $(KERNEL_OBJECTS) $(KERNEL_HEADER_DEPS)
rm -f sys/include/machine
- rm -f base/usr/lib/ld.so
- rm -f base/boot/init
+ rm -f base/usr/sbin/init
cd lib/; make clean
.PHONY: clean
diff --git a/lib/libc/Makefile b/lib/libc/Makefile
index fabb532..76a5359 100644
--- a/lib/libc/Makefile
+++ b/lib/libc/Makefile
@@ -5,14 +5,17 @@ LIBC_ASMFILES = $(shell find src/ -name "*.S")
LIBC_OBJ = $(LIBC_CFILES:.c=.o)
LIBC_ASMOBJ = $(LIBC_ASMFILES:.S=.S.o)
-all: $(LIBC_OBJ) build/ld.so
-
-build/ld.so: build/ linker/entry.c linker/entry.S
- mkdir -p $(@D)
- $(CC) $(CFLAGS) linker/entry.S -o build/entry.S.o
- $(CC) $(CFLAGS) linker/entry.c -o build/entry.o
- $(LD) -znoexecstack $(LIBC_OBJ) \
- build/entry.o build/entry.S.o -o $@
+all: $(LIBC_ASMOBJ) $(LIBC_OBJ) build/libc.a
+
+build/libc.a: build/
+ ar rcs build/libc.a $(LIBC_OBJ) $(LIBC_ASMOBJ)
+
+#build/ld.so: build/ linker/entry.c linker/entry.S
+# mkdir -p $(@D)
+# $(CC) $(CFLAGS) linker/entry.S -o build/entry.S.o
+# $(CC) $(CFLAGS) linker/entry.c -o build/entry.o
+# $(LD) -znoexecstack $(LIBC_OBJ) \
+# build/entry.o build/entry.S.o -o $@
%.o: %.c
$(CC) $(CFLAGS) $< -o $@
diff --git a/lib/libc/linker/entry.S b/lib/libc/src/arch/amd64/crt0.S
index 1f982f9..17dddc6 100644
--- a/lib/libc/linker/entry.S
+++ b/lib/libc/src/arch/amd64/crt0.S
@@ -33,15 +33,15 @@
#include <sys/syscall.h>
-.section .text, "ax", @progbits
+.text
.globl _start
_start:
// Mark end of callstack
xor %rbp, %rbp
- // Load process context as per the sysv AMD64 ABI
+ // Load process context and call entry
lea (%rsp), %rdi
- call entry
+ call __libc_entry
// We are done, now we exit
mov $SYS_exit, %rax
diff --git a/lib/libc/linker/entry.c b/lib/libc/src/main.c
index 55bf312..477842b 100644
--- a/lib/libc/linker/entry.c
+++ b/lib/libc/src/main.c
@@ -27,34 +27,16 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/syscall.h>
-#include <sys/auxv.h>
#include <stdint.h>
-#include <stddef.h>
-#include <elf.h>
-#if !defined(__hyra__)
-#error "Hyra supported only"
-#endif
+int main(int argc, const char **argv, const char **envp);
-void
-entry(const uint64_t *ctx)
+int
+__libc_entry(uint64_t *ctx)
{
uint64_t argc = *ctx;
- uint64_t auxv[AT_MAX_COUNT] = {0};
- int envc;
-
const char **argv = (const char **)(ctx + 1);
const char **envp = (const char **)(argv + argc + 1);
- struct auxv_entry *auxvp;
-
- /* Read-in auxiliary vector */
- auxvp = (struct auxv_entry *)(envp + envc + 1);
- for (; auxvp->tag != AT_NULL; ++auxvp) {
- if (auxvp->tag < AT_MAX_COUNT) {
- auxv[auxvp->tag] = auxvp->val;
- }
- }
- /* TODO */
+ return main(argc, argv, envp);
}
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index c75ebd0..30e7248 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -1,7 +1,8 @@
CC =
LD =
-LDSO =
+LIBC =
+USRDIR =
.PHONY: all
all:
- cd init/; make LDSO=$(LDSO) CC=$(CC) LD=$(LD)
+ cd init/; make CC=$(CC) USRDIR=$(USRDIR) LIBC=$(LIBC)
diff --git a/usr.sbin/init/Makefile b/usr.sbin/init/Makefile
index a7af644..13ac173 100644
--- a/usr.sbin/init/Makefile
+++ b/usr.sbin/init/Makefile
@@ -1,7 +1,6 @@
-CC =
-LD =
-LDSO =
+include ../sbin.mk
.PHONY: all
all:
- $(CC) -pie -nostdlib main.c -o init -e main
+ @ # $(CC) -pie -nostdlib main.c -o init -e main
+ $(CC) main.c -o init $(INTERNAL_CFLAGS)
diff --git a/usr.sbin/init/main.c b/usr.sbin/init/main.c
index af62d76..e840c8e 100644
--- a/usr.sbin/init/main.c
+++ b/usr.sbin/init/main.c
@@ -1,6 +1,5 @@
int
-main(void)
+main(int argc, char **argv)
{
- /* Do nothing */
- while (1);
+ return 0;
}
diff --git a/usr.sbin/sbin.mk b/usr.sbin/sbin.mk
new file mode 100644
index 0000000..763e6ec
--- /dev/null
+++ b/usr.sbin/sbin.mk
@@ -0,0 +1,4 @@
+CC =
+LIBDIR =
+USRDIR =
+INTERNAL_CFLAGS = -znoexecstack -nostdlib -I$(USRDIR)/include/ $(USRDIR)/lib/libc.a