From bde41a37ecd3151b0a7a242776f30ca660c7e578 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 8 Sep 2012 14:37:16 +0200 Subject: [PATCH] Implement crt1.o, crti.o, and crtn.o. This helps running cross compiled programs as well as compiling programs under Sortix with gcc. There is also support for global constructors. Currently, cross-compiled executables uses these startup files. The current build system continues to use start.o, which does not offer global constructors and other useful features. Note that these using the crtX.o files requires the crtbegin.o and crtend.o files that ship with the cross compiler, but that should be no problem. --- libmaxsi/Makefile | 27 +++++++++++++++++----- libmaxsi/x64/crt1.s | 54 ++++++++++++++++++++++++++++++++++++++++++++ libmaxsi/x64/crti.s | 39 ++++++++++++++++++++++++++++++++ libmaxsi/x64/crtn.s | 33 +++++++++++++++++++++++++++ libmaxsi/x64/start.s | 6 +++++ libmaxsi/x86/crt1.s | 54 ++++++++++++++++++++++++++++++++++++++++++++ libmaxsi/x86/crti.s | 39 ++++++++++++++++++++++++++++++++ libmaxsi/x86/crtn.s | 33 +++++++++++++++++++++++++++ libmaxsi/x86/start.s | 7 +++++- 9 files changed, 285 insertions(+), 7 deletions(-) create mode 100644 libmaxsi/x64/crt1.s create mode 100644 libmaxsi/x64/crti.s create mode 100644 libmaxsi/x64/crtn.s create mode 100644 libmaxsi/x86/crt1.s create mode 100644 libmaxsi/x86/crti.s create mode 100644 libmaxsi/x86/crtn.s diff --git a/libmaxsi/Makefile b/libmaxsi/Makefile index 42dfe21f..1abc3d6c 100644 --- a/libmaxsi/Makefile +++ b/libmaxsi/Makefile @@ -2,8 +2,6 @@ ifndef CPU CPU=x86 endif -BINS=libc.a libg.a libmaxsi.a libmaxsi-sortix.a - ifeq ($(CPU),x86) CPUDEFINES=-DPLATFORM_X86 CPUFLAGS=-m32 @@ -52,7 +50,6 @@ init.o \ signal.o \ $(CPU)/signal.o \ $(CPU)/fork.o \ -start.o \ time.o \ random.o \ abs.o \ @@ -165,6 +162,15 @@ putc.o \ rewind.o \ ungetc.o \ +CRTOBJ=\ +start.o \ +crt1.o \ +crti.o \ +crtn.o \ + +MISCOBJ=\ +$(CRTOBJ) \ + UNPROCHEADERDIRS:=$(shell find include -type d) UNPROCHEADERS:=$(shell find include -type f) HEADERDIRS:=$(patsubst include%,preproc%,$(UNPROCHEADERDIRS)) @@ -182,6 +188,8 @@ crc32.o \ SORTIXOBJS:=$(addprefix sortix/,$(SORTIXOBJS)) SORTIXCPPFLAGS:=-DSORTIX_KERNEL +BINS=libc.a libg.a libmaxsi.a libmaxsi-sortix.a $(CRTOBJ) + all: $(BINS) libmaxsi.a: $(OBJS) @@ -206,7 +214,16 @@ libg.so: libc.so ln -sf $< $@ start.o: $(CPU)/start.o - ln -sf $< $@ + ln -f $< $@ + +crt1.o: $(CPU)/crt1.o + ln -f $< $@ + +crti.o: $(CPU)/crti.o + ln -f $< $@ + +crtn.o: $(CPU)/crtn.o + ln -f $< $@ # header preprocessing $(HEADERDIRS): @@ -246,10 +263,8 @@ install: for D in $(UNPROCHEADERDIRS); do mkdir -p $(SYSROOT)/usr/$$D || exit $?; done for SRC in $(HEADERS); do DEST=`echo $$SRC | sed 's/preproc/include/'`; cp $$SRC $(SYSROOT)/usr/$$DEST || exit $?; done mkdir -p $(SYSROOT)/usr/include - cp start.o $(SYSROOT)/usr/lib/crtbegin.o touch deleteme.cpp g++ $(CPUFLAGS) -c deleteme.cpp -o deleteme.o - for F in crt0.o crtn.o crt1.o crtend.o crtbeginT.o crti.o; do cp deleteme.o $(SYSROOT)/usr/lib/$$F; done for F in libgcc.so libm.so libstdc++.so; do ld $(CPULDFLAGS) -shared deleteme.o -o $(SYSROOT)/usr/lib/$$F; done rm -f deleteme.o deleteme.cpp diff --git a/libmaxsi/x64/crt1.s b/libmaxsi/x64/crt1.s new file mode 100644 index 00000000..dfc7d244 --- /dev/null +++ b/libmaxsi/x64/crt1.s @@ -0,0 +1,54 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crt1.s + Implement the _start symbol at which execution begins which performs the + task of initializing the standard library and executing the main function. + +*******************************************************************************/ + +/* NOTE: This is almost identical to what is in start.s. crt1.s is used when + compiling with the real cross compiler, while start.s is used when + using the older hacky way of building Sortix. Please try to keep these + files alike by doing changes both places until we only build Sortix + with real cross compilers. */ + +.section .text + +.global _start +.type _start, @function +_start: + movq %rcx, environ # envp + + # Prepare signals, memory allocation, stdio and such. + pushq %rsi + pushq %rdi + call initialize_standard_library + + # Run the global constructors. + call _init + + # Run main + popq %rdi + popq %rsi + call main + + # Terminate the process with main's exit code. + movl %eax, %edi + call exit diff --git a/libmaxsi/x64/crti.s b/libmaxsi/x64/crti.s new file mode 100644 index 00000000..aeba7b1c --- /dev/null +++ b/libmaxsi/x64/crti.s @@ -0,0 +1,39 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crti.s + Provides the header of the _init and _fini functions. + +*******************************************************************************/ + +.section .init +.global _init +.type _init, @function +_init: + push %rbp + movq %rsp, %rbp + /* gcc will nicely put the contents of crtbegin.o's .init section here. */ + +.section .fini +.global _fini +.type _fini, @function +_fini: + push %rbp + movq %rsp, %rbp + /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ diff --git a/libmaxsi/x64/crtn.s b/libmaxsi/x64/crtn.s new file mode 100644 index 00000000..345e495c --- /dev/null +++ b/libmaxsi/x64/crtn.s @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crtn.s + Provides the tail of the _init and _fini functions. + +*******************************************************************************/ + +.section .init + /* gcc will nicely put the contents of crtend.o's .init section here. */ + popq %rbp + ret + +.section .fini + /* gcc will nicely put the contents of crtend.o's .fini section here. */ + popq %rbp + ret diff --git a/libmaxsi/x64/start.s b/libmaxsi/x64/start.s index e6e6eedb..e2cd83ce 100644 --- a/libmaxsi/x64/start.s +++ b/libmaxsi/x64/start.s @@ -22,6 +22,12 @@ ******************************************************************************/ +/* NOTE: This is almost identical to what is in crt1.s. crt1.s is used when + compiling with the real cross compiler, while start.s is used when + using the older hacky way of building Sortix. Please try to keep these + files alike by doing changes both places until we only build Sortix + with real cross compilers. */ + .globl _start .section .text diff --git a/libmaxsi/x86/crt1.s b/libmaxsi/x86/crt1.s new file mode 100644 index 00000000..48b3af29 --- /dev/null +++ b/libmaxsi/x86/crt1.s @@ -0,0 +1,54 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2011, 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crt1.s + Implement the _start symbol at which execution begins which performs the + task of initializing the standard library and executing the main function. + +*******************************************************************************/ + +/* NOTE: This is almost identical to what is in start.s. crt1.s is used when + compiling with the real cross compiler, while start.s is used when + using the older hacky way of building Sortix. Please try to keep these + files alike by doing changes both places until we only build Sortix + with real cross compilers. */ + +.section .text + +.global _start +.type _start, @function +_start: + movl %ecx, environ # envp + + # Arguments for main + push %ebx # argv + push %eax # argc + + # Prepare signals, memory allocation, stdio and such. + call initialize_standard_library + + # Run the global constructors. + call _init + + # Run main + call main + + # Terminate the process with main's exit code. + push %eax + call exit diff --git a/libmaxsi/x86/crti.s b/libmaxsi/x86/crti.s new file mode 100644 index 00000000..213f092e --- /dev/null +++ b/libmaxsi/x86/crti.s @@ -0,0 +1,39 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crti.s + Provides the header of the _init and _fini functions. + +*******************************************************************************/ + +.section .init +.global _init +.type _init, @function +_init: + push %ebp + movl %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .init section here. */ + +.section .fini +.global _fini +.type _fini, @function +_fini: + push %ebp + movl %esp, %ebp + /* gcc will nicely put the contents of crtbegin.o's .fini section here. */ diff --git a/libmaxsi/x86/crtn.s b/libmaxsi/x86/crtn.s new file mode 100644 index 00000000..1a850924 --- /dev/null +++ b/libmaxsi/x86/crtn.s @@ -0,0 +1,33 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2012. + + This file is part of LibMaxsi. + + LibMaxsi is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + LibMaxsi is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + details. + + You should have received a copy of the GNU Lesser General Public License + along with LibMaxsi. If not, see . + + crtn.s + Provides the tail of the _init and _fini functions. + +*******************************************************************************/ + +.section .init + /* gcc will nicely put the contents of crtend.o's .init section here. */ + popl %ebp + ret + +.section .fini + /* gcc will nicely put the contents of crtend.o's .fini section here. */ + popl %ebp + ret diff --git a/libmaxsi/x86/start.s b/libmaxsi/x86/start.s index 3fcbed0e..a71c4400 100644 --- a/libmaxsi/x86/start.s +++ b/libmaxsi/x86/start.s @@ -22,11 +22,16 @@ ******************************************************************************/ +/* NOTE: This is almost identical to what is in crt1.s. crt1.s is used when + compiling with the real cross compiler, while start.s is used when + using the older hacky way of building Sortix. Please try to keep these + files alike by doing changes both places until we only build Sortix + with real cross compilers. */ + .globl _start .section .text -.text 0x100000 .type _start, @function _start: