diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index 3fd90b89f17..4cb46fbb8e7 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -1,4 +1,6 @@ -set(LIBC_SOURCES +set(SOURCES + arch/${SERENITY_ARCH}/fenv.cpp + arch/${SERENITY_ARCH}/setjmp.S arpa/inet.cpp assert.cpp ctype.cpp @@ -76,15 +78,152 @@ set(LIBC_SOURCES wchar.cpp wctype.cpp wstdio.cpp + + ${AK_SOURCES} ) -file(GLOB_RECURSE LIBC_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" CONFIGURE_DEPENDS "*.h") -list(APPEND LIBC_HEADERS "../LibELF/ELFABI.h" "../LibRegex/RegexDefs.h") +if (SERENITY_ARCH STREQUAL "x86_64") + list(APPEND SOURCES + arch/x86_64/memset.cpp + arch/x86_64/memset.S + ) +endif() +# FIXME: This, ideally, should be an exhaustive list of headers (transitively) used by libc's own +# headers. (Like, for example, we shouldn't include AK/Platform.h in them for no reason at +# all.) +set(HEADERS + arch/${SERENITY_ARCH}/fenv.h + arch/fenv.h + arpa/inet.h + bits/dlfcn_integration.h + bits/FILE.h + bits/getopt.h + bits/mutex_locker.h + bits/posix1_lim.h + bits/pthread_cancel.h + bits/pthread_integration.h + bits/search.h + bits/sighow.h + bits/stdint.h + bits/stdio_file_implementation.h + bits/utimens.h + bits/wchar.h + bits/wchar_size.h + net/if.h + net/if_arp.h + net/route.h + netinet/if_ether.h + netinet/in.h + netinet/in_systm.h + netinet/ip.h + netinet/ip_icmp.h + netinet/tcp.h + sys/arch/${SERENITY_ARCH}/regs.h + sys/arch/regs.h + sys/archctl.h + sys/auxv.h + sys/cdefs.h + sys/device.h + sys/devices/gpu.h + sys/file.h + sys/internals.h + sys/ioctl.h + sys/mman.h + sys/param.h + sys/poll.h + sys/prctl.h + sys/ptrace.h + sys/resource.h + sys/select.h + sys/socket.h + sys/stat.h + sys/statvfs.h + sys/sysmacros.h + sys/time.h + sys/times.h + sys/ttydefaults.h + sys/types.h + sys/uio.h + sys/un.h + sys/utsname.h + sys/wait.h + alloca.h + assert.h + byteswap.h + complex.h + ctype.h + dirent.h + dlfcn.h + elf.h + endian.h + errno_codes.h + errno.h + fcntl.h + fd_set.h + fenv.h + float.h + fnmatch.h + getopt.h + glob.h + grp.h + ifaddrs.h + inttypes.h + langinfo.h + libgen.h + limits.h + link.h + locale.h + mallocdefs.h + math.h + memory.h + mntent.h + netdb.h + nl_types.h + paths.h + poll.h + pthread.h + pty.h + pwd.h + regex.h + resolv.h + sched.h + search.h + semaphore.h + serenity.h + setjmp.h + shadow.h + signal.h + spawn.h + stdarg.h + stdint.h + stdio_ext.h + stdio.h + stdlib.h + string.h + strings.h + sysexits.h + syslog.h + termcap.h + termios.h + time.h + ucontext.h + ulimit.h + unistd.h + utime.h + utmp.h + wchar.h + wctype.h + + ../LibELF/ELFABI.h + ../LibRegex/RegexDefs.h +) + +# ===== LibC headers ===== add_custom_target(install_libc_headers) # Copy LibC's headers into the sysroot to satisfy libc++'s include priority requirements. -foreach(RELATIVE_HEADER_PATH IN LISTS LIBC_HEADERS) +foreach(RELATIVE_HEADER_PATH IN LISTS HEADERS) get_filename_component(directory ${RELATIVE_HEADER_PATH} DIRECTORY) string(REPLACE "../" "" subdirectory "${directory}") file(MAKE_DIRECTORY "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${subdirectory}") @@ -97,28 +236,9 @@ foreach(RELATIVE_HEADER_PATH IN LISTS LIBC_HEADERS) ) endforeach() -if ("${SERENITY_ARCH}" STREQUAL "aarch64") - set(LIBC_SOURCES ${LIBC_SOURCES} "arch/aarch64/fenv.cpp") - set(ASM_SOURCES "arch/aarch64/setjmp.S") - set(CRTI_SOURCE "arch/aarch64/crti.S") - set(CRTN_SOURCE "arch/aarch64/crtn.S") -elseif ("${SERENITY_ARCH}" STREQUAL "x86_64") - set(LIBC_SOURCES ${LIBC_SOURCES} "arch/x86_64/memset.cpp" "arch/x86_64/fenv.cpp") - set(ASM_SOURCES "arch/x86_64/setjmp.S" "arch/x86_64/memset.S") - set(CRTI_SOURCE "arch/x86_64/crti.S") - set(CRTN_SOURCE "arch/x86_64/crtn.S") -elseif ("${SERENITY_ARCH}" STREQUAL "riscv64") - set(LIBC_SOURCES ${LIBC_SOURCES} "arch/riscv64/fenv.cpp") - set(ASM_SOURCES "arch/riscv64/setjmp.S") - set(CRTI_SOURCE "arch/riscv64/crti.S") - set(CRTN_SOURCE "arch/riscv64/crtn.S") -endif() - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-warning-option") - -# Note: We link all these against NoCoverage so that we don't break ports by requiring coverage symbols -# in runtime/startup objects. - +# ===== Start files ===== +# NOTE: We link all these against NoCoverage so that we don't break ports by requiring coverage +# symbols in runtime/startup objects. add_library(crt0 STATIC crt0.cpp) add_dependencies(crt0 install_libc_headers) target_link_libraries(crt0 PRIVATE NoCoverage) @@ -126,6 +246,7 @@ add_custom_command( TARGET crt0 COMMAND "${CMAKE_COMMAND}" -E copy $ ${CMAKE_INSTALL_PREFIX}/usr/lib/crt0.o ) + add_library(crt0_shared STATIC crt0_shared.cpp) add_dependencies(crt0_shared install_libc_headers) target_link_libraries(crt0_shared PRIVATE NoCoverage) @@ -134,36 +255,35 @@ add_custom_command( COMMAND "${CMAKE_COMMAND}" -E copy $ ${CMAKE_INSTALL_PREFIX}/usr/lib/crt0_shared.o ) -add_library(crti STATIC ${CRTI_SOURCE}) +add_library(crti STATIC arch/${SERENITY_ARCH}/crti.S) target_link_libraries(crti PRIVATE NoCoverage) add_custom_command( TARGET crti COMMAND "${CMAKE_COMMAND}" -E copy $ ${CMAKE_INSTALL_PREFIX}/usr/lib/crti.o ) -add_library(crtn STATIC ${CRTN_SOURCE}) +add_library(crtn STATIC arch/${SERENITY_ARCH}/crtn.S) target_link_libraries(crtn PRIVATE NoCoverage) add_custom_command( TARGET crtn COMMAND "${CMAKE_COMMAND}" -E copy $ ${CMAKE_INSTALL_PREFIX}/usr/lib/crtn.o ) -set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ASM_SOURCES}) - +# ===== LibC ===== # Prevent GCC from removing null checks by marking the `FILE*` argument non-null set_source_files_properties(stdio.cpp PROPERTIES COMPILE_FLAGS "-fno-builtin-fputc -fno-builtin-fputs -fno-builtin-fwrite") # Prevent naively implemented string functions (like strlen) from being "optimized" into a call to themselves. if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set_source_files_properties(string.cpp wchar.cpp PROPERTIES COMPILE_FLAGS "-fno-tree-loop-distribution -fno-tree-loop-distribute-patterns") +else() + set_source_files_properties(string.cpp wchar.cpp PROPERTIES COMPILE_FLAGS "-fno-builtin") endif() -set_source_files_properties(ssp.cpp PROPERTIES COMPILE_FLAGS "-fno-stack-protector") - -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nolibc") serenity_libc(LibC c) add_dependencies(LibC crti crt0 crt0_shared crtn install_libc_headers) target_link_libraries(LibC PRIVATE LibSystem LibTimeZone) +target_link_options(LibC PRIVATE -nolibc) # Provide a linker script instead of various other libraries that tells everything to link against LibC. file(WRITE "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libpthread.so" "INPUT(libc.so)") diff --git a/Userland/Libraries/LibC/ssp.cpp b/Userland/Libraries/LibC/ssp.cpp index 43810cddd13..2c98c524b46 100644 --- a/Userland/Libraries/LibC/ssp.cpp +++ b/Userland/Libraries/LibC/ssp.cpp @@ -11,18 +11,10 @@ #include #include -#if defined __SSP__ || defined __SSP_ALL__ -# error "file must not be compiled with stack protection enabled on it. Use -fno-stack-protector" -#endif - -extern "C" { - -__attribute__((noreturn)) void __stack_chk_fail() +extern "C" [[gnu::noreturn, gnu::no_stack_protector]] void __stack_chk_fail() { dbgln("Error: USERSPACE({}) Stack protector failure, stack smashing detected!", getpid()); if (__stdio_is_initialized) warnln("Error: Stack protector failure, stack smashing detected!"); abort(); } - -} // extern "C"