| // Copyright 2023 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <sys/mman.h> |
| #include <sys/uio.h> |
| #include <unistd.h> |
| |
| // The miscellaneous code that is statically linked into the dynamically linker |
| // uses the standard system headers and public C symbols for system calls. |
| // Since it won't be linked with any libc, we provide here the ones that are |
| // actually used. |
| |
| namespace { |
| |
| // Get the sys_* functions defined as local inlines. |
| |
| int gStartupErrno; |
| #define SYS_ERRNO gStartupErrno |
| |
| #define SYS_INLINE inline |
| |
| #pragma GCC diagnostic push |
| #pragma GCC diagnostic ignored "-Wshorten-64-to-32" |
| |
| #include "linux_syscall_support.h" |
| |
| #pragma GCC diagnostic pop |
| |
| } // namespace |
| |
| // Library code will use the system <errno.h>, which defines errno using this |
| // function. So define the function here to use the local errno storage. The |
| // LSS code stores into gStartupErrno directly. |
| int* __errno_location() { return &gStartupErrno; } |
| |
| _Noreturn void _exit(int status) { |
| sys_exit_group(status); |
| __builtin_trap(); |
| } |
| |
| int open(const char* filename, int oflag, ...) { |
| // No O_CREAT cases are used, so no need to decode the optional argument. |
| return sys_open(filename, oflag, 0); |
| } |
| |
| int close(int fd) { return sys_close(fd); } |
| |
| ssize_t read(int fd, void* buf, size_t n) { return sys_read(fd, buf, n); } |
| |
| ssize_t write(int fd, const void* buf, size_t n) { return sys_write(fd, buf, n); } |
| |
| ssize_t writev(int fd, const iovec* iov, int n) { |
| static_assert(sizeof(iovec) == sizeof(kernel_iovec)); |
| return sys_writev(fd, reinterpret_cast<const kernel_iovec*>(iov), n); |
| } |
| |
| ssize_t pread(int fd, void* buf, size_t n, off_t pos) { return sys_pread64(fd, buf, n, pos); } |
| |
| void* mmap(void* addr, size_t len, int prot, int flags, int fd, off_t pos) { |
| return sys_mmap(addr, len, prot, flags, fd, pos); |
| } |
| |
| int mprotect(void* addr, size_t len, int prot) { return sys_mprotect(addr, len, prot); } |
| |
| int munmap(void* addr, size_t len) { return sys_munmap(addr, len); } |