Visibility attribute fixes, options/elf: phdr stubs, options/internal, options/rtdl and meson.build: clang compatibility fixes
This commit is contained in:
parent
9fdfaeaedd
commit
f309ccedec
36
meson.build
36
meson.build
|
@ -40,7 +40,6 @@ if not headers_only
|
|||
libc_deps += frigg_dep
|
||||
rtdl_deps += frigg_dep
|
||||
|
||||
|
||||
add_languages('c', 'cpp')
|
||||
c_compiler = meson.get_compiler('c')
|
||||
|
||||
|
@ -49,18 +48,29 @@ if not headers_only
|
|||
add_project_arguments('-fno-rtti', '-fno-exceptions', language: 'cpp')
|
||||
add_project_link_arguments('-nostdlib', language: ['c', 'cpp'])
|
||||
|
||||
gccdir = run_command('/bin/sh', '-c',
|
||||
' '.join(c_compiler.cmd_array())
|
||||
+ ' -print-search-dirs | sed -n -e "s/install: \(.*\)/\\1/p"',
|
||||
env: ['LANG=C'],
|
||||
check: true).stdout().strip()
|
||||
if c_compiler.get_id() == 'gcc'
|
||||
gccdir = run_command('/bin/sh', '-c',
|
||||
' '.join(c_compiler.cmd_array())
|
||||
+ ' -print-search-dirs | sed -n -e "s/install: \(.*\)/\\1/p"',
|
||||
env: ['LANG=C'],
|
||||
check: true).stdout().strip()
|
||||
|
||||
rtdl_include_dirs += include_directories(gccdir / 'include')
|
||||
libc_include_dirs += include_directories(gccdir / 'include')
|
||||
# Ubuntu seems to patch out include-fixed/ (the files are in include/ instead).
|
||||
if fs.exists(gccdir / 'include-fixed')
|
||||
rtdl_include_dirs += include_directories(gccdir / 'include-fixed')
|
||||
libc_include_dirs += include_directories(gccdir / 'include-fixed')
|
||||
rtdl_include_dirs += include_directories(gccdir / 'include')
|
||||
libc_include_dirs += include_directories(gccdir / 'include')
|
||||
# Ubuntu seems to patch out include-fixed/ (the files are in include/ instead).
|
||||
if fs.exists(gccdir / 'include-fixed')
|
||||
rtdl_include_dirs += include_directories(gccdir / 'include-fixed')
|
||||
libc_include_dirs += include_directories(gccdir / 'include-fixed')
|
||||
endif
|
||||
elif c_compiler.get_id() == 'clang'
|
||||
clangdir = run_command('/bin/sh', '-c',
|
||||
' '.join(c_compiler.cmd_array())
|
||||
+ ' -print-search-dirs | sed -ne "s/libraries: =\(.*\):.*/\\1/p"',
|
||||
env: ['LANG=C'],
|
||||
check: true).stdout().strip()
|
||||
|
||||
rtdl_include_dirs += include_directories(clangdir / 'include')
|
||||
libc_include_dirs += include_directories(clangdir / 'include')
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -267,7 +277,7 @@ if not headers_only
|
|||
libc_sources,
|
||||
internal_sources,
|
||||
ansi_sources,
|
||||
lsb_sources,
|
||||
lsb_sources,
|
||||
],
|
||||
cpp_args: ['-DFRIGG_HAVE_LIBC'],
|
||||
include_directories: libc_include_dirs,
|
||||
|
|
9
options/elf/generic/phdr.cpp
Normal file
9
options/elf/generic/phdr.cpp
Normal file
|
@ -0,0 +1,9 @@
|
|||
#include <link.h>
|
||||
|
||||
#include <bits/ensure.h>
|
||||
#include <mlibc/debug.hpp>
|
||||
|
||||
int dl_iterate_phdr(int (*callback)(struct dl_phdr_info*, size_t, void*), void* data){
|
||||
mlibc::infoLogger() << "mlibc: dl_iterate_phdr is a stub" << frg::endlog;
|
||||
return 0;
|
||||
}
|
45
options/elf/include/link.h
Normal file
45
options/elf/include/link.h
Normal file
|
@ -0,0 +1,45 @@
|
|||
#ifndef _LINK_H
|
||||
#define _LINK_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <elf.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define ElfW(type) Elf64_ ## type
|
||||
|
||||
struct dl_phdr_info {
|
||||
Elf64_Addr dlpi_addr;
|
||||
const char *dlpi_name;
|
||||
const Elf64_Phdr *dlpi_phdr;
|
||||
Elf64_Half dlpi_phnum;
|
||||
unsigned long long int dlpi_adds;
|
||||
unsigned long long int dlpi_subs;
|
||||
size_t dlpi_tls_modid;
|
||||
void *dlpi_tls_data;
|
||||
};
|
||||
|
||||
struct link_map {
|
||||
Elf64_Addr l_addr;
|
||||
char *l_name;
|
||||
ElfW(Dyn) *l_ld;
|
||||
struct link_map *l_next, *l_prev;
|
||||
};
|
||||
|
||||
struct r_debug {
|
||||
int r_version;
|
||||
struct link_map *r_map;
|
||||
Elf64_Addr r_brk;
|
||||
enum { RT_CONSISTENT, RT_ADD, RT_DELETE } r_state;
|
||||
Elf64_Addr r_ldbase;
|
||||
};
|
||||
|
||||
int dl_iterate_phdr(int (*callback)(struct dl_phdr_info*, size_t, void*), void* data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // _LINK_H
|
|
@ -1,9 +1,11 @@
|
|||
libc_sources += files(
|
||||
'generic/startup.cpp',
|
||||
'generic/phdr.cpp',
|
||||
)
|
||||
|
||||
if not no_headers
|
||||
install_headers(
|
||||
'include/elf.h',
|
||||
'include/link.h',
|
||||
)
|
||||
endif
|
||||
|
|
6
options/glibc/include/features.h
Normal file
6
options/glibc/include/features.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef FEATURES_H
|
||||
#define FEATURES_H
|
||||
|
||||
// This header is a stub
|
||||
|
||||
#endif
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef MLIBC_GLIBC_SYSDEPS
|
||||
#define MLIBC_GLIBC_SYSDEPS
|
||||
|
||||
namespace mlibc [[gnu::visibility("hidden")]] {
|
||||
namespace [[gnu::visibility("hidden")]] mlibc {
|
||||
|
||||
[[gnu::weak]] int sys_ioctl(int fd, unsigned long request, void *arg, int *result);
|
||||
|
||||
|
|
|
@ -5,7 +5,12 @@
|
|||
// are called by delete expressions. We never use such expressions in mlibc.
|
||||
// Note that G++ complains if we make the operator hidden,
|
||||
// thus we use it's mangled name as a workaround.
|
||||
extern "C" [[gnu::visibility("hidden")]] void _ZdlPvm() { // operator delete (void *, size_t)
|
||||
__ensure(!"operator delete called! delete expressions cannot be used in mlibc.");
|
||||
}
|
||||
|
||||
#if defined(__clang__)
|
||||
extern "C" [[gnu::visibility("hidden")]] void _ZdlPv() { // operator delete (void *, size_t)
|
||||
__ensure(!"operator delete called! delete expressions cannot be used in mlibc.");
|
||||
}
|
||||
#else
|
||||
extern "C" [[gnu::visibility("hidden")]] void _ZdlPvm() { // operator delete (void *, size_t)
|
||||
__ensure(!"operator delete called! delete expressions cannot be used in mlibc.");
|
||||
}
|
||||
#endif
|
|
@ -57,6 +57,7 @@ extern "C" [[ gnu::visibility("hidden") ]] int __cxa_guard_acquire(int64_t *ptr)
|
|||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" [[ gnu::visibility("hidden") ]] void __cxa_guard_release(int64_t *ptr) {
|
||||
auto guard = reinterpret_cast<Guard *>(ptr);
|
||||
// do a store-release so that compiler generated code can skip calling
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include <abi-bits/stat.h>
|
||||
#include <mlibc/fsfd_target.hpp>
|
||||
|
||||
namespace mlibc [[gnu::visibility("hidden")]] {
|
||||
namespace [[gnu::visibility("hidden")]] mlibc {
|
||||
|
||||
void sys_libc_log(const char *message);
|
||||
[[noreturn]] void sys_libc_panic();
|
||||
|
|
|
@ -21,7 +21,7 @@ struct FutexLock {
|
|||
while(true) {
|
||||
if(!expected) {
|
||||
// Try to take the mutex here.
|
||||
if(__atomic_compare_exchange_n(&_futex, &expected, 1,
|
||||
if(__atomic_compare_exchange_n(&_futex, reinterpret_cast<int*>(&expected), 1,
|
||||
false, __ATOMIC_ACQUIRE, __ATOMIC_ACQUIRE)) {
|
||||
return;
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ struct FutexLock {
|
|||
expected = 0;
|
||||
}else{
|
||||
unsigned int desired = expected | waitersBit;
|
||||
if(__atomic_compare_exchange_n(&_futex, &expected, desired,
|
||||
if(__atomic_compare_exchange_n(&_futex, reinterpret_cast<int*>(&expected), desired,
|
||||
false, __ATOMIC_RELAXED, __ATOMIC_RELAXED))
|
||||
expected = desired;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include <bits/ssize_t.h>
|
||||
#include <bits/size_t.h>
|
||||
|
||||
namespace mlibc [[gnu::visibility("default")]] {
|
||||
namespace [[gnu::visibility("hidden")]] mlibc {
|
||||
|
||||
int sys_open(const char *pathname, int flags, int *fd);
|
||||
int sys_close(int fd);
|
||||
|
|
|
@ -104,7 +104,7 @@ extern "C" [[ gnu::visibility("default") ]] void *__rtdl_allocateTcb() {
|
|||
}
|
||||
|
||||
extern "C" {
|
||||
static void dl_debug_state() {
|
||||
[[ gnu::visibility("hidden") ]] void dl_debug_state() {
|
||||
// This function is used to signal changes in the debugging link map,
|
||||
// GDB just sets a breakpoint on this function and we can call it
|
||||
// everytime we update the link map. We don't need to implement
|
||||
|
@ -115,7 +115,7 @@ extern "C" {
|
|||
extern "C" [[gnu::alias("dl_debug_state"), gnu::visibility("default")]] void _dl_debug_state();
|
||||
|
||||
// This symbol can be used by GDB to find the global interface structure
|
||||
[[gnu::visibility("default")]] DebugInterface *_dl_debug_addr = &globalDebugInterface;
|
||||
[[ gnu::visibility("default") ]] DebugInterface *_dl_debug_addr = &globalDebugInterface;
|
||||
|
||||
extern "C" void *interpreterMain(uintptr_t *entry_stack) {
|
||||
if(logEntryExit)
|
||||
|
@ -287,19 +287,19 @@ extern "C" [[ gnu::visibility("default") ]] uintptr_t *__dlapi_entrystack() {
|
|||
return entryStack;
|
||||
}
|
||||
|
||||
extern "C" [[gnu::visibility("default")]]
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
const char *__dlapi_error() {
|
||||
auto error = lastError;
|
||||
lastError = nullptr;
|
||||
return error;
|
||||
}
|
||||
|
||||
extern "C" __attribute__ (( visibility("default") ))
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
void *__dlapi_get_tls(struct __abi_tls_entry *entry) {
|
||||
return reinterpret_cast<char *>(accessDtv(entry->object)) + entry->offset;
|
||||
}
|
||||
|
||||
extern "C" [[gnu::visibility("default")]]
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
void *__dlapi_open(const char *file, int local) {
|
||||
// TODO: Thread-safety!
|
||||
auto rts = rtsCounter++;
|
||||
|
@ -358,7 +358,7 @@ void *__dlapi_open(const char *file, int local) {
|
|||
return object;
|
||||
}
|
||||
|
||||
extern "C" [[gnu::visibility("default")]]
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
void *__dlapi_resolve(void *handle, const char *string) {
|
||||
mlibc::infoLogger() << "rtdl: __dlapi_resolve(" << string << ")" << frg::endlog;
|
||||
|
||||
|
@ -387,7 +387,7 @@ struct __dlapi_symbol {
|
|||
void *address;
|
||||
};
|
||||
|
||||
extern "C" [[gnu::visibility("default")]]
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
int __dlapi_reverse(const void *ptr, __dlapi_symbol *info) {
|
||||
mlibc::infoLogger() << "rtdl: __dlapi_reverse(" << ptr << ")" << frg::endlog;
|
||||
|
||||
|
@ -426,7 +426,7 @@ int __dlapi_reverse(const void *ptr, __dlapi_symbol *info) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
extern "C" [[gnu::visibility("default")]]
|
||||
extern "C" [[ gnu::visibility("default") ]]
|
||||
void __dlapi_enter(uintptr_t *entry_stack) {
|
||||
#ifdef MLIBC_STATIC_BUILD
|
||||
interpreterMain(entry_stack);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef MLIBC_RTDL_SYSDEPS
|
||||
#define MLIBC_RTDL_SYSDEPS
|
||||
|
||||
namespace mlibc [[gnu::visibility("hidden")]] {
|
||||
namespace [[gnu::visibility("hidden")]] mlibc {
|
||||
|
||||
int sys_tcb_set(void *pointer);
|
||||
|
||||
|
|
Loading…
Reference in a new issue