Visibility attribute fixes, options/elf: phdr stubs, options/internal, options/rtdl and meson.build: clang compatibility fixes

This commit is contained in:
JJ Roberts-White 2020-12-04 20:39:26 +11:00 committed by fidojj@hotmail.com
parent 9fdfaeaedd
commit f309ccedec
13 changed files with 109 additions and 31 deletions

View file

@ -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,

View 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;
}

View 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

View file

@ -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

View file

@ -0,0 +1,6 @@
#ifndef FEATURES_H
#define FEATURES_H
// This header is a stub
#endif

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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();

View file

@ -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;
}

View file

@ -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);

View file

@ -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);

View file

@ -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);