diff options
author | Gunnar Beutner <gbeutner@serenityos.org> | 2021-05-07 11:08:41 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-07 15:35:50 +0200 |
commit | dd39bb77845d880b5e7ed074a4fce63157aeaf3c (patch) | |
tree | e6ec7ca9bff545bc55b8a621c5533670016ec758 /Userland | |
parent | 224755e6efd7021e07d88a2093ef81a195b9f665 (diff) | |
download | serenity-dd39bb77845d880b5e7ed074a4fce63157aeaf3c.zip |
DynamicLoader: Remove math functionality in favor of -lgcc
This links the dynamic linker against libgcc.a instead of having
our own copy of the math functions.
For now we need to specify -fbuilding-libgcc as a hack to work
around a bug with the -nodefaultlibs flag. Once everyone is on
the latest toolchain version this can be removed.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/DynamicLoader/CMakeLists.txt | 5 | ||||
-rw-r--r-- | Userland/DynamicLoader/main.cpp | 6 | ||||
-rw-r--r-- | Userland/DynamicLoader/math.cpp | 170 | ||||
-rw-r--r-- | Userland/DynamicLoader/math.h | 26 |
4 files changed, 9 insertions, 198 deletions
diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index 3ce9836039..dd9cb3dc03 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -1,6 +1,5 @@ set(LOADER_SOURCES main.cpp - math.cpp misc.cpp ) @@ -23,11 +22,13 @@ add_definitions(-D_DYNAMIC_LOADER) set(SOURCES ${LOADER_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${LIBC_SOURCES1} ${LIBC_SOURCES2} ${LIBC_SOURCES3} ${LIBSYSTEM_SOURCES}) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -nostdlib -pie -fpic -DNO_TLS") +# FIXME: Remove -fbuilding-libgcc after the next toolchain update +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fbuilding-libgcc -fno-rtti -nostdlib -pie -fpic -DNO_TLS") set_source_files_properties (../Libraries/LibC/ssp.cpp PROPERTIES COMPILE_FLAGS "-fno-stack-protector") add_executable(Loader.so ${SOURCES}) +target_link_libraries(Loader.so gcc) target_link_options(Loader.so PRIVATE LINKER:--no-dynamic-linker) install(TARGETS Loader.so RUNTIME DESTINATION usr/lib/) diff --git a/Userland/DynamicLoader/main.cpp b/Userland/DynamicLoader/main.cpp index c38b11c87a..ddefa0176d 100644 --- a/Userland/DynamicLoader/main.cpp +++ b/Userland/DynamicLoader/main.cpp @@ -116,4 +116,10 @@ void _start(int argc, char** argv, char** envp) ELF::DynamicLinker::linker_main(move(main_program_name), main_program_fd, is_secure, argc, argv, envp); VERIFY_NOT_REACHED(); } + +void _fini(); + +void _fini() +{ +} } diff --git a/Userland/DynamicLoader/math.cpp b/Userland/DynamicLoader/math.cpp deleted file mode 100644 index 49e60df34f..0000000000 --- a/Userland/DynamicLoader/math.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -// TODO: Is there a compiler flag we can use to still get these math functions? (and compile with -nostdlib) -// FIXME: What do we do with this regarding copyright stuff? -// code for math functions taken from here: -// https://gitlab.incom.co/CM-Shield/u-boot/commit/aa7839b39c2ee77f9ab8c393c56b8d812507dbb7 -// https://github.com/zayac/qemu-arm/blob/master/qemu/roms/ipxe/src/libgcc/__udivmoddi4.c -// https://code.woboq.org/llvm/compiler-rt/lib/builtins/divdi3.c.html - -#include "math.h" - -extern "C" { - -union overlay64 { - u64 longw; - struct { - u32 lower; - u32 higher; - } words; -}; - -u64 __ashldi3(u64 num, unsigned int shift) -{ - union overlay64 output; - - output.longw = num; - if (shift >= 32) { - output.words.higher = output.words.lower << (shift - 32); - output.words.lower = 0; - } else { - if (!shift) - return num; - output.words.higher = (output.words.higher << shift) | (output.words.lower >> (32 - shift)); - output.words.lower = output.words.lower << shift; - } - return output.longw; -} - -u64 __lshrdi3(u64 num, unsigned int shift) -{ - union overlay64 output; - - output.longw = num; - if (shift >= 32) { - output.words.lower = output.words.higher >> (shift - 32); - output.words.higher = 0; - } else { - if (!shift) - return num; - output.words.lower = output.words.lower >> shift | (output.words.higher << (32 - shift)); - output.words.higher = output.words.higher >> shift; - } - return output.longw; -} - -#define MAX_32BIT_UINT ((((u64)1) << 32) - 1) - -static u64 _64bit_divide(u64 dividend, u64 divider, u64* rem_p) -{ - u64 result = 0; - - /* - * If divider is zero - let the rest of the system care about the - * exception. - */ - if (!divider) - return 1 / (u32)divider; - - /* As an optimization, let's not use 64 bit division unless we must. */ - if (dividend <= MAX_32BIT_UINT) { - if (divider > MAX_32BIT_UINT) { - result = 0; - if (rem_p) - *rem_p = divider; - } else { - result = (u32)dividend / (u32)divider; - if (rem_p) - *rem_p = (u32)dividend % (u32)divider; - } - return result; - } - - while (divider <= dividend) { - u64 locald = divider; - u64 limit = __lshrdi3(dividend, 1); - int shifts = 0; - - while (locald <= limit) { - shifts++; - locald = locald + locald; - } - result |= __ashldi3(1, shifts); - dividend -= locald; - } - - if (rem_p) - *rem_p = dividend; - - return result; -} - -u64 __udivdi3(u64 num, u64 den) -{ - return _64bit_divide(num, den, nullptr); -} - -u64 __umoddi3(u64 num, u64 den) -{ - u64 v = 0; - - _64bit_divide(num, den, &v); - return v; -} - -uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t* rem_p) -{ - uint64_t quot = 0, qbit = 1; - - if (den == 0) { - return 1 / ((unsigned)den); /* Intentional divide by zero, without - triggering a compiler warning which - would abort the build */ - } - - /* Left-justify denominator and count shift */ - while ((int64_t)den >= 0) { - den <<= 1; - qbit <<= 1; - } - - while (qbit) { - if (den <= num) { - num -= den; - quot += qbit; - } - den >>= 1; - qbit >>= 1; - } - - if (rem_p) - *rem_p = num; - - return quot; -} -int64_t __divdi3(int64_t a, int64_t b) -{ - const int bits_in_dword_m1 = (int)(sizeof(int64_t) * 8) - 1; - int64_t s_a = a >> bits_in_dword_m1; // s_a = a < 0 ? -1 : 0 - int64_t s_b = b >> bits_in_dword_m1; // s_b = b < 0 ? -1 : 0 - a = (a ^ s_a) - s_a; // negate if s_a == -1 - b = (b ^ s_b) - s_b; // negate if s_b == -1 - s_a ^= s_b; // sign of quotient - return (__udivmoddi4(a, b, (uint64_t*)0) ^ s_a) - s_a; // negate if s_a == -1 -} -int64_t __moddi3(int64_t a, int64_t b) -{ - const int bits_in_dword_m1 = (int)(sizeof(int64_t) * 8) - 1; - int64_t s = b >> bits_in_dword_m1; // s = b < 0 ? -1 : 0 - b = (b ^ s) - s; // negate if s == -1 - s = a >> bits_in_dword_m1; // s = a < 0 ? -1 : 0 - a = (a ^ s) - s; // negate if s == -1 - uint64_t r = 0; - __udivmoddi4(a, b, &r); - return ((int64_t)r ^ s) - s; // negate if s == -1 -} -} diff --git a/Userland/DynamicLoader/math.h b/Userland/DynamicLoader/math.h deleted file mode 100644 index b59a057c64..0000000000 --- a/Userland/DynamicLoader/math.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include <AK/Types.h> - -extern "C" { - -u64 __ashldi3(u64 num, unsigned int shift); - -u64 __lshrdi3(u64 num, unsigned int shift); - -u64 __udivdi3(u64 num, u64 den); - -u64 __umoddi3(u64 num, u64 den); - -uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t* rem_p); - -int64_t __divdi3(int64_t a, int64_t b); - -int64_t __moddi3(int64_t a, int64_t b); -} |