From 8cbde13139eb1ebfad3ee208ebd4422b162bf691 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 26 Aug 2023 19:30:26 -0700 Subject: [PATCH] [build] Address symbol visibility and DSO builds Added an `API` macro in `j6/api.h` that expands to mark the given declaration as a default-visible symbol. Also change `format` and `vformat` to non-template functions, and make calls to `main`, `exit`, and the library init functions in `_start` GOT-relative. --- src/libraries/j6/include/j6/channel.hh | 3 ++- src/libraries/j6/include/j6/init.h | 3 ++- src/libraries/j6/include/j6/memutils.h | 7 +++--- .../include/j6/protocols/service_locator.hh | 3 ++- src/libraries/j6/include/j6/protocols/vfs.hh | 7 +++++- src/libraries/j6/include/j6/sysconf.h.cog | 3 ++- src/libraries/j6/include/j6/syslog.hh | 4 +++- src/libraries/j6/init.cpp | 4 ++-- src/libraries/j6/syslog.cpp | 1 + src/libraries/libc/arch/amd64/crt/crt0.s | 8 +++---- src/libraries/libc/libc.module | 3 ++- src/libraries/util/format.cpp | 23 ++++++++++++------- src/libraries/util/include/util/allocator.h | 3 +++ src/libraries/util/include/util/api.h | 7 ++++++ src/libraries/util/include/util/bip_buffer.h | 3 ++- src/libraries/util/include/util/format.h | 10 ++++---- src/libraries/util/include/util/spinlock.h | 3 ++- src/libraries/util/util.module | 1 + 18 files changed, 66 insertions(+), 30 deletions(-) create mode 100644 src/libraries/util/include/util/api.h diff --git a/src/libraries/j6/include/j6/channel.hh b/src/libraries/j6/include/j6/channel.hh index 2a4fd2f..9a434fe 100644 --- a/src/libraries/j6/include/j6/channel.hh +++ b/src/libraries/j6/include/j6/channel.hh @@ -8,10 +8,11 @@ #include #include +#include namespace j6 { -class channel +class API channel { public: /// Create a new channel of the given size. diff --git a/src/libraries/j6/include/j6/init.h b/src/libraries/j6/include/j6/init.h index ec4036d..a257263 100644 --- a/src/libraries/j6/include/j6/init.h +++ b/src/libraries/j6/include/j6/init.h @@ -4,6 +4,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -71,7 +72,7 @@ struct j6_init_args /// Find the first handle of the given type held by this process -j6_handle_t j6_find_first_handle(j6_object_type obj_type); +j6_handle_t API j6_find_first_handle(j6_object_type obj_type); /// Get the init args const j6_init_args * j6_get_init_args(); diff --git a/src/libraries/j6/include/j6/memutils.h b/src/libraries/j6/include/j6/memutils.h index 2100eff..0ea71aa 100644 --- a/src/libraries/j6/include/j6/memutils.h +++ b/src/libraries/j6/include/j6/memutils.h @@ -2,6 +2,7 @@ /// \file memutils.h /// Standard mem*() library functions +#include #include <__j6libc/restrict.h> #include <__j6libc/size_t.h> @@ -9,9 +10,9 @@ extern "C" { #endif -void *memcpy(void * restrict s1, const void * restrict s2, size_t n); -void *memmove(void * restrict s1, const void * restrict s2, size_t n); -void *memset(void *s, int c, size_t n); +void * API memcpy(void * restrict s1, const void * restrict s2, size_t n); +void * API memmove(void * restrict s1, const void * restrict s2, size_t n); +void * API memset(void *s, int c, size_t n); #ifdef __cplusplus } // extern "C" diff --git a/src/libraries/j6/include/j6/protocols/service_locator.hh b/src/libraries/j6/include/j6/protocols/service_locator.hh index ea59d80..57be069 100644 --- a/src/libraries/j6/include/j6/protocols/service_locator.hh +++ b/src/libraries/j6/include/j6/protocols/service_locator.hh @@ -1,9 +1,10 @@ #include #include +#include namespace j6::proto::sl { -class client +class API client { public: /// Constructor. diff --git a/src/libraries/j6/include/j6/protocols/vfs.hh b/src/libraries/j6/include/j6/protocols/vfs.hh index 8cf73bb..e02e799 100644 --- a/src/libraries/j6/include/j6/protocols/vfs.hh +++ b/src/libraries/j6/include/j6/protocols/vfs.hh @@ -1,9 +1,14 @@ +#pragma once +/// \file vfs.hh +/// C++ client interface for VFS protocol + #include #include +#include namespace j6::proto::vfs { -class client +class API client { public: /// Constructor. diff --git a/src/libraries/j6/include/j6/sysconf.h.cog b/src/libraries/j6/include/j6/sysconf.h.cog index 29d78e8..1c83a4b 100644 --- a/src/libraries/j6/include/j6/sysconf.h.cog +++ b/src/libraries/j6/include/j6/sysconf.h.cog @@ -10,6 +10,7 @@ #include #include +#include /*[[[cog code generation from os.path import join @@ -35,7 +36,7 @@ enum j6_sysconf_arg /// Get the kernel configuration value specified by /// the argument. -unsigned long j6_sysconf(j6_sysconf_arg arg); +unsigned long API j6_sysconf(j6_sysconf_arg arg); #ifdef __cplusplus } // extern C diff --git a/src/libraries/j6/include/j6/syslog.hh b/src/libraries/j6/include/j6/syslog.hh index a50f578..ef09d71 100644 --- a/src/libraries/j6/include/j6/syslog.hh +++ b/src/libraries/j6/include/j6/syslog.hh @@ -2,13 +2,15 @@ /// \file j6/syslog.hh /// Utility function for writing messages to the kernel log +#include + // The kernel depends on libj6 for some shared code, // but should not include the user-specific code. #ifndef __j6kernel namespace j6 { -void syslog(const char *fmt, ...); +void API syslog(const char *fmt, ...); } // namespace j6 diff --git a/src/libraries/j6/init.cpp b/src/libraries/j6/init.cpp index 9b43b27..c89f557 100644 --- a/src/libraries/j6/init.cpp +++ b/src/libraries/j6/init.cpp @@ -36,13 +36,13 @@ j6_find_first_handle(j6_object_type obj_type) return j6_handle_invalid; } -const j6_init_args * +const j6_init_args * API j6_get_init_args() { return &init_args; } -extern "C" void +extern "C" void API __init_libj6(uint64_t arg0, uint64_t arg1) { init_args.args[0] = arg0; diff --git a/src/libraries/j6/syslog.cpp b/src/libraries/j6/syslog.cpp index e74a533..b15815a 100644 --- a/src/libraries/j6/syslog.cpp +++ b/src/libraries/j6/syslog.cpp @@ -4,6 +4,7 @@ #include #include +#include namespace j6 { diff --git a/src/libraries/libc/arch/amd64/crt/crt0.s b/src/libraries/libc/arch/amd64/crt/crt0.s index 2577e99..079be06 100644 --- a/src/libraries/libc/arch/amd64/crt/crt0.s +++ b/src/libraries/libc/arch/amd64/crt/crt0.s @@ -12,17 +12,17 @@ _libc_crt0_start: push 0 mov rbp, rsp - call __init_libj6 + call __init_libj6 wrt ..got mov rbx, rax - call __init_libc + call __init_libc wrt ..got mov rdi, 0 mov rsi, rsp mov rdx, 0 ; TODO: actually parse stack for argc, argv, envp mov rcx, rbx - call main + call main wrt ..got mov rdi, rax - call exit + call exit wrt ..got .end: diff --git a/src/libraries/libc/libc.module b/src/libraries/libc/libc.module index bbb5168..d3829ba 100644 --- a/src/libraries/libc/libc.module +++ b/src/libraries/libc/libc.module @@ -27,7 +27,7 @@ for ext in ("h",): libc = module("libc", kind = "lib", deps = [ "j6" ], - output = "libc.a", + basename = "libc", include_phase = "late", sources = sources, public_headers = headers, @@ -35,6 +35,7 @@ libc = module("libc", libc.variables["ccflags"] = [ "${ccflags}", + "-fvisibility=default", "-DPRINTF_SUPPORT_DECIMAL_SPECIFIERS=0", "-DPRINTF_SUPPORT_EXPONENTIAL_SPECIFIERS=0", ] diff --git a/src/libraries/util/format.cpp b/src/libraries/util/format.cpp index 0a2f73c..5719393 100644 --- a/src/libraries/util/format.cpp +++ b/src/libraries/util/format.cpp @@ -88,7 +88,6 @@ append_string(char_t *&out, size_t &count, size_t max, unsigned width, char_t co } } -} // namespace template size_t vformat(counted output, char_t const *format, va_list va) @@ -169,20 +168,28 @@ vformat(counted output, char_t const *format, va_list va) return count; } -template size_t -format(counted output, const char_t *format, ...) +} // namespace + +size_t API format(counted output, const char *format, ...) { va_list va; va_start(va, format); - size_t result = vformat(output, format, va); + size_t result = vformat(output, format, va); va_end(va); return result; } -template size_t format(counted output, const char *format, ...); -template size_t vformat(counted output, const char *format, va_list va); +size_t API format(counted output, const wchar_t *format, ...) +{ + va_list va; + va_start(va, format); + size_t result = vformat(output, format, va); + va_end(va); + return result; +} + +size_t API vformat(counted output, const char *format, va_list va) { return vformat(output, format, va); } +size_t API vformat(counted output, const wchar_t *format, va_list va) { return vformat(output, format, va); } -template size_t format(counted output, const wchar_t *format, ...); -template size_t vformat(counted output, const wchar_t *format, va_list va); } //namespace util diff --git a/src/libraries/util/include/util/allocator.h b/src/libraries/util/include/util/allocator.h index 0f4ea35..a31f039 100644 --- a/src/libraries/util/include/util/allocator.h +++ b/src/libraries/util/include/util/allocator.h @@ -2,6 +2,9 @@ /// \file allocator.h /// Definition of the allocator interface. +#include +#include + namespace util { // Allocators are types with three static methods with these signatures diff --git a/src/libraries/util/include/util/api.h b/src/libraries/util/include/util/api.h new file mode 100644 index 0000000..3105d75 --- /dev/null +++ b/src/libraries/util/include/util/api.h @@ -0,0 +1,7 @@ +#pragma once +/// \file api.h +/// Library interface visibility macros + +#ifndef API +#define API __attribute__ ((visibility ("default"))) +#endif \ No newline at end of file diff --git a/src/libraries/util/include/util/bip_buffer.h b/src/libraries/util/include/util/bip_buffer.h index b5f3f26..dd23105 100644 --- a/src/libraries/util/include/util/bip_buffer.h +++ b/src/libraries/util/include/util/bip_buffer.h @@ -6,11 +6,12 @@ #include #include +#include #include namespace util { -class bip_buffer +class API bip_buffer { public: /// Default constructor. Creates a zero-size buffer. diff --git a/src/libraries/util/include/util/format.h b/src/libraries/util/include/util/format.h index 6051ee1..80c62ba 100644 --- a/src/libraries/util/include/util/format.h +++ b/src/libraries/util/include/util/format.h @@ -4,14 +4,16 @@ #pragma once #include +#include #include namespace util { -template -size_t format(counted output, const char_t *format, ...); +size_t API format(counted output, const char *format, ...); +size_t API vformat(counted output, const char *format, va_list va); -template -size_t vformat(counted output, const char_t *format, va_list va); + +size_t API format(counted output, const wchar_t *format, ...); +size_t API vformat(counted output, const wchar_t *format, va_list va); } diff --git a/src/libraries/util/include/util/spinlock.h b/src/libraries/util/include/util/spinlock.h index dedad83..040c532 100644 --- a/src/libraries/util/include/util/spinlock.h +++ b/src/libraries/util/include/util/spinlock.h @@ -3,6 +3,7 @@ #pragma once #include +#include #ifdef __j6kernel extern "C" uint32_t __current_thread_id(); @@ -11,7 +12,7 @@ extern "C" uint32_t __current_thread_id(); namespace util { /// An MCS based spinlock -class spinlock +class API spinlock { public: spinlock(); diff --git a/src/libraries/util/util.module b/src/libraries/util/util.module index 11d5e6f..a1049a9 100644 --- a/src/libraries/util/util.module +++ b/src/libraries/util/util.module @@ -10,6 +10,7 @@ module("util", ], public_headers = [ "util/allocator.h", + "util/api.h", "util/assert.h", "util/basic_types.h", "util/bip_buffer.h",