From 9aed8dbe6bedf08b9777dc0cd02d4a6ef6ae2579 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 5 Sep 2024 12:54:22 +0300 Subject: [PATCH] Toolchain: Build crtbeginS.o crtendS.o and shared libgcc --- toolchain/build.sh | 16 ++++---- toolchain/gcc-12.2.0.patch | 53 ++++++++++++++++++------- userspace/libraries/LibC/CMakeLists.txt | 9 +++++ userspace/programs/init/CMakeLists.txt | 4 +- 4 files changed, 58 insertions(+), 24 deletions(-) diff --git a/toolchain/build.sh b/toolchain/build.sh index 75429625a9..ef8d1d4107 100755 --- a/toolchain/build.sh +++ b/toolchain/build.sh @@ -61,12 +61,6 @@ if [[ -z ${MAKE_JOBS:x} ]]; then MAKE_JOBS="-j$(nproc)" fi -if [ $BANAN_ARCH = "x86_64" ]; then - XCFLAGS="-g -O2 -mcmodel=large -mno-red-zone" -else - XCFLAGS="-g -O2" -fi - enter_clean_build () { rm -rf build-$BANAN_ARCH mkdir build-$BANAN_ARCH @@ -129,6 +123,11 @@ build_gcc () { --disable-nls \ --enable-languages=c,c++ + XCFLAGS="" + if [ $BANAN_ARCH = "x86_64" ]; then + XCFLAGS="-mcmodel=large -mno-red-zone" + fi + make $MAKE_JOBS all-gcc make $MAKE_JOBS all-target-libgcc CFLAGS_FOR_TARGET="$XCFLAGS" make install-gcc @@ -142,7 +141,7 @@ build_libstdcpp () { fi cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build-$BANAN_ARCH - make $MAKE_JOBS all-target-libstdc++-v3 CFLAGS_FOR_TARGET="$XCFLAGS" + make $MAKE_JOBS all-target-libstdc++-v3 make install-target-libstdc++-v3 } @@ -268,7 +267,8 @@ fi if (($BUILD_LIBSTDCPP)); then # delete sysroot and install libc rm -r $BANAN_SYSROOT - $BANAN_SCRIPT_DIR/build.sh libc + $BANAN_SCRIPT_DIR/build.sh libc-static + $BANAN_SCRIPT_DIR/build.sh libc-shared $BANAN_SCRIPT_DIR/build.sh install build_libstdcpp diff --git a/toolchain/gcc-12.2.0.patch b/toolchain/gcc-12.2.0.patch index 41d8af2f8c..c990f6e617 100644 --- a/toolchain/gcc-12.2.0.patch +++ b/toolchain/gcc-12.2.0.patch @@ -1,6 +1,6 @@ diff -ruN gcc-12.2.0/config.sub gcc-12.2.0-banan_os/config.sub --- gcc-12.2.0/config.sub 2022-08-19 11:09:52.128656687 +0300 -+++ gcc-12.2.0-banan_os/config.sub 2024-08-26 16:10:21.057075425 +0300 ++++ gcc-12.2.0-banan_os/config.sub 2024-09-03 23:09:34.347772496 +0300 @@ -1749,7 +1749,7 @@ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ @@ -12,7 +12,7 @@ diff -ruN gcc-12.2.0/config.sub gcc-12.2.0-banan_os/config.sub sco3.2v2 | sco3.2v[4-9]* | sco5v6*) diff -ruN gcc-12.2.0/fixincludes/mkfixinc.sh gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh --- gcc-12.2.0/fixincludes/mkfixinc.sh 2022-08-19 11:09:52.160657095 +0300 -+++ gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh 2024-08-26 16:26:29.728558199 +0300 ++++ gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh 2024-09-03 23:09:34.461106020 +0300 @@ -11,6 +11,7 @@ # Check for special fix rules for particular targets @@ -23,7 +23,7 @@ diff -ruN gcc-12.2.0/fixincludes/mkfixinc.sh gcc-12.2.0-banan_os/fixincludes/mkf x86_64-*-mingw32* | \ diff -ruN gcc-12.2.0/gcc/config/banan_os.h gcc-12.2.0-banan_os/gcc/config/banan_os.h --- gcc-12.2.0/gcc/config/banan_os.h 1970-01-01 02:00:00.000000000 +0200 -+++ gcc-12.2.0-banan_os/gcc/config/banan_os.h 2024-08-26 16:20:51.429017406 +0300 ++++ gcc-12.2.0-banan_os/gcc/config/banan_os.h 2024-09-03 23:09:34.461106020 +0300 @@ -0,0 +1,35 @@ +/* Useful if you wish to make target-specific GCC changes. */ +#undef TARGET_BANAN_OS @@ -37,11 +37,11 @@ diff -ruN gcc-12.2.0/gcc/config/banan_os.h gcc-12.2.0-banan_os/gcc/config/banan_ +/* Files that are linked before user code. + The %s tells GCC to look for these files in the library directory. */ +#undef STARTFILE_SPEC -+#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s crtbegin.o%s" ++#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s %{shared|static-pie|!no-pie:crtbeginS.o%s; :crtbegin.o%s}" + +/* Files that are linked after user code. */ +#undef ENDFILE_SPEC -+#define ENDFILE_SPEC "crtend.o%s crtn.o%s" ++#define ENDFILE_SPEC "%{shared|static-pie|!no-pie:crtendS.o%s; :crtend.o%s} crtn.o%s" + +#undef LINK_SPEC +#define LINK_SPEC "%{shared:-shared} %{static:-static} %{!shared: %{!static: %{rdynamic:-export-dynamic}}}" @@ -62,8 +62,8 @@ diff -ruN gcc-12.2.0/gcc/config/banan_os.h gcc-12.2.0-banan_os/gcc/config/banan_ + } while(0); diff -ruN gcc-12.2.0/gcc/config.gcc gcc-12.2.0-banan_os/gcc/config.gcc --- gcc-12.2.0/gcc/config.gcc 2022-08-19 11:09:52.552662114 +0300 -+++ gcc-12.2.0-banan_os/gcc/config.gcc 2024-08-26 16:12:58.904718171 +0300 -@@ -673,6 +673,12 @@ ++++ gcc-12.2.0-banan_os/gcc/config.gcc 2024-09-03 23:09:34.461106020 +0300 +@@ -673,6 +673,13 @@ # Common parts for widely ported systems. case ${target} in @@ -72,6 +72,7 @@ diff -ruN gcc-12.2.0/gcc/config.gcc gcc-12.2.0-banan_os/gcc/config.gcc + gnu_ld=yes + default_use_cxa_atexit=yes + use_gcc_stdint=provide ++ tmake_file="t-slibgcc" + ;; *-*-darwin*) tmake_file="t-darwin " @@ -91,25 +92,36 @@ diff -ruN gcc-12.2.0/gcc/config.gcc gcc-12.2.0-banan_os/gcc/config.gcc ;; diff -ruN gcc-12.2.0/libgcc/config.host gcc-12.2.0-banan_os/libgcc/config.host --- gcc-12.2.0/libgcc/config.host 2022-08-19 11:09:54.664689148 +0300 -+++ gcc-12.2.0-banan_os/libgcc/config.host 2024-08-26 16:25:09.397768608 +0300 ++++ gcc-12.2.0-banan_os/libgcc/config.host 2024-09-03 23:09:34.474439376 +0300 @@ -698,6 +698,14 @@ hppa*-*-netbsd*) tmake_file="$tmake_file pa/t-netbsd" ;; +i[34567]86-*-banan_os*) -+ extra_parts="$extra_parts crti.o crtbegin.o crtend.o crtn.o" -+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic" ++ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o" ++ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc" + ;; +x86_64-*-banan_os*) -+ extra_parts="$extra_parts crti.o crtbegin.o crtend.o crtn.o" -+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic" ++ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o" ++ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc" + ;; i[34567]86-*-darwin*) tmake_file="$tmake_file i386/t-crtpc t-crtfm i386/t-msabi" tm_file="$tm_file i386/darwin-lib.h" +diff -ruN gcc-12.2.0/libgcc/config/t-slibgcc gcc-12.2.0-banan_os/libgcc/config/t-slibgcc +--- gcc-12.2.0/libgcc/config/t-slibgcc 2022-08-19 11:09:54.724689916 +0300 ++++ gcc-12.2.0-banan_os/libgcc/config/t-slibgcc 2024-09-04 23:06:14.275389818 +0300 +@@ -26,7 +26,6 @@ + SHLIB_OBJS = @shlib_objs@ + SHLIB_DIR = @multilib_dir@ + SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@ +-SHLIB_LC = -lc + SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK) + SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \ + $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) diff -ruN gcc-12.2.0/libstdc++-v3/acinclude.m4 gcc-12.2.0-banan_os/libstdc++-v3/acinclude.m4 --- gcc-12.2.0/libstdc++-v3/acinclude.m4 2022-08-19 11:09:55.380698313 +0300 -+++ gcc-12.2.0-banan_os/libstdc++-v3/acinclude.m4 2024-08-26 19:03:18.261183636 +0300 ++++ gcc-12.2.0-banan_os/libstdc++-v3/acinclude.m4 2024-09-03 23:09:34.477772715 +0300 @@ -1380,7 +1380,7 @@ ac_has_nanosleep=yes ac_has_sched_yield=yes @@ -121,7 +133,7 @@ diff -ruN gcc-12.2.0/libstdc++-v3/acinclude.m4 gcc-12.2.0-banan_os/libstdc++-v3/ ac_has_nanosleep=yes diff -ruN gcc-12.2.0/libstdc++-v3/configure gcc-12.2.0-banan_os/libstdc++-v3/configure --- gcc-12.2.0/libstdc++-v3/configure 2022-08-19 11:09:55.416698774 +0300 -+++ gcc-12.2.0-banan_os/libstdc++-v3/configure 2024-08-26 19:09:19.671026813 +0300 ++++ gcc-12.2.0-banan_os/libstdc++-v3/configure 2024-09-03 23:09:34.487772732 +0300 @@ -11904,6 +11904,11 @@ lt_cv_dlopen_self=yes ;; @@ -134,6 +146,17 @@ diff -ruN gcc-12.2.0/libstdc++-v3/configure gcc-12.2.0-banan_os/libstdc++-v3/con mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= +@@ -15603,8 +15608,8 @@ + glibcxx_compiler_shared_flag="-D_GLIBCXX_SHARED" + + else +- glibcxx_lt_pic_flag= +- glibcxx_compiler_pic_flag= ++ glibcxx_lt_pic_flag="-prefer-pic" ++ glibcxx_compiler_pic_flag="$lt_prog_compiler_pic_CXX" + glibcxx_compiler_shared_flag= + fi + @@ -20575,7 +20580,7 @@ ac_has_nanosleep=yes ac_has_sched_yield=yes @@ -154,7 +177,7 @@ diff -ruN gcc-12.2.0/libstdc++-v3/configure gcc-12.2.0-banan_os/libstdc++-v3/con $as_echo "#define HAVE_ASINF 1" >>confdefs.h diff -ruN gcc-12.2.0/libstdc++-v3/crossconfig.m4 gcc-12.2.0-banan_os/libstdc++-v3/crossconfig.m4 --- gcc-12.2.0/libstdc++-v3/crossconfig.m4 2022-08-19 11:09:55.420698825 +0300 -+++ gcc-12.2.0-banan_os/libstdc++-v3/crossconfig.m4 2024-08-26 18:53:31.865865576 +0300 ++++ gcc-12.2.0-banan_os/libstdc++-v3/crossconfig.m4 2024-09-03 23:09:34.531106138 +0300 @@ -9,7 +9,7 @@ # This is a freestanding configuration; there is nothing to do here. ;; diff --git a/userspace/libraries/LibC/CMakeLists.txt b/userspace/libraries/LibC/CMakeLists.txt index 0742483f81..5f6fce7bf3 100644 --- a/userspace/libraries/LibC/CMakeLists.txt +++ b/userspace/libraries/LibC/CMakeLists.txt @@ -86,3 +86,12 @@ set_target_properties(libc-static PROPERTIES OUTPUT_NAME libc) set_target_properties(libc-shared PROPERTIES OUTPUT_NAME libc) add_library(libc ALIAS libc-static) + +execute_process(COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libgcc_s.so OUTPUT_VARIABLE LIBGCC_S_LINK OUTPUT_STRIP_TRAILING_WHITESPACE) +file(REAL_PATH ${LIBGCC_S_LINK} LIBGCC_S) +install(FILES ${LIBGCC_S} DESTINATION ${CMAKE_INSTALL_LIBDIR} RENAME libgcc_s.so + PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE + GROUP_READ GROUP_EXECUTE + WORLD_READ WORLD_EXECUTE +) diff --git a/userspace/programs/init/CMakeLists.txt b/userspace/programs/init/CMakeLists.txt index 499e07a197..25932066d6 100644 --- a/userspace/programs/init/CMakeLists.txt +++ b/userspace/programs/init/CMakeLists.txt @@ -4,6 +4,8 @@ set(SOURCES add_executable(init ${SOURCES}) banan_include_headers(init ban) -banan_link_library(init libc) +banan_link_library(init libc-static) + +target_link_options(init PRIVATE -static-libgcc) install(TARGETS init OPTIONAL)