mirror of
https://github.com/rehlds/metamod-r.git
synced 2025-01-28 22:47:54 +03:00
link libstdc++ dynamically (#10)
This commit is contained in:
parent
ff185130cf
commit
d36301292d
33
metamod/include/common/stdc++compat.cpp
Normal file
33
metamod/include/common/stdc++compat.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if !defined(_WIN32)
|
||||||
|
void NORETURN Sys_Error(const char *error, ...);
|
||||||
|
|
||||||
|
// This file adds the necessary compatibility tricks to avoid symbols with
|
||||||
|
// version GLIBCXX_3.4.16 and bigger, keeping binary compatibility with libstdc++ 4.6.1.
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
// We shouldn't be throwing exceptions at all, but it sadly turns out we call STL (inline) functions that do.
|
||||||
|
void __throw_out_of_range_fmt(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char buf[1024]; // That should be big enough.
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
Sys_Error(buf);
|
||||||
|
}
|
||||||
|
}; // namespace std
|
||||||
|
|
||||||
|
// Technically, this symbol is not in GLIBCXX_3.4.20, but in CXXABI_1.3.8,
|
||||||
|
// but that's equivalent, version-wise. Those calls are added by the compiler
|
||||||
|
// itself on `new Class[n]` calls.
|
||||||
|
extern "C"
|
||||||
|
void __cxa_throw_bad_array_new_length()
|
||||||
|
{
|
||||||
|
Sys_Error("Bad array new length.");
|
||||||
|
}
|
||||||
|
#endif // !defined(_WIN32)
|
@ -1,5 +1,6 @@
|
|||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
|
|
||||||
|
#include "stdc++compat.cpp"
|
||||||
#include "sys_shared.cpp"
|
#include "sys_shared.cpp"
|
||||||
#include "interface.cpp"
|
#include "interface.cpp"
|
||||||
#include "crc32c.cpp"
|
#include "crc32c.cpp"
|
||||||
|
@ -305,3 +305,19 @@ bool mem_compare(const char* addr, const char* pattern, size_t len)
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NORETURN Sys_Error(const char *error, ...)
|
||||||
|
{
|
||||||
|
va_list argptr;
|
||||||
|
static char text[1024];
|
||||||
|
|
||||||
|
va_start(argptr, error);
|
||||||
|
vsnprintf(text, sizeof(text), error, argptr);
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
META_CONS("FATAL ERROR (shutting down): %s\n", text);
|
||||||
|
|
||||||
|
int *null = 0;
|
||||||
|
*null = 0;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
@ -80,5 +80,6 @@ void __declspec(noreturn) do_exit(int exitval);
|
|||||||
bool is_file_exists_in_gamedir(const char *path);
|
bool is_file_exists_in_gamedir(const char *path);
|
||||||
char *full_gamedir_path(const char *path, char *fullpath);
|
char *full_gamedir_path(const char *path, char *fullpath);
|
||||||
bool mem_compare(const char* addr, const char* pattern, size_t len);
|
bool mem_compare(const char* addr, const char* pattern, size_t len);
|
||||||
|
void NORETURN Sys_Error(const char *error, ...);
|
||||||
|
|
||||||
extern const char* g_platform_postfixes[4];
|
extern const char* g_platform_postfixes[4];
|
||||||
|
@ -18,16 +18,17 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
|
|||||||
extraDefines: [
|
extraDefines: [
|
||||||
'linux': null,
|
'linux': null,
|
||||||
'__linux__': null,
|
'__linux__': null,
|
||||||
'NDEBUG': null
|
'NDEBUG': null,
|
||||||
|
'_GLIBCXX_USE_CXX11_ABI': 0
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
|
||||||
linkerOptions: new GccToolchainConfig.LinkerOptions(
|
linkerOptions: new GccToolchainConfig.LinkerOptions(
|
||||||
interProceduralOptimizations: true,
|
interProceduralOptimizations: true,
|
||||||
stripSymbolTable: true,
|
stripSymbolTable: true,
|
||||||
staticLibGcc: true,
|
staticLibGcc: false,
|
||||||
staticIntel: true,
|
staticIntel: true,
|
||||||
staticLibStdCpp: true,
|
staticLibStdCpp: false,
|
||||||
),
|
),
|
||||||
|
|
||||||
librarianOptions: new GccToolchainConfig.LibrarianOptions(
|
librarianOptions: new GccToolchainConfig.LibrarianOptions(
|
||||||
@ -47,16 +48,17 @@ rootProject.ext.createIccConfig = { boolean release, BinaryKind binKind ->
|
|||||||
extraDefines: [
|
extraDefines: [
|
||||||
'linux': null,
|
'linux': null,
|
||||||
'__linux__': null,
|
'__linux__': null,
|
||||||
'NDEBUG': null
|
'NDEBUG': null,
|
||||||
|
'_GLIBCXX_USE_CXX11_ABI': 0
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
|
|
||||||
linkerOptions: new GccToolchainConfig.LinkerOptions(
|
linkerOptions: new GccToolchainConfig.LinkerOptions(
|
||||||
interProceduralOptimizations: false,
|
interProceduralOptimizations: false,
|
||||||
stripSymbolTable: false,
|
stripSymbolTable: false,
|
||||||
staticLibGcc: true,
|
staticLibGcc: false,
|
||||||
staticIntel: true,
|
staticIntel: true,
|
||||||
staticLibStdCpp: true,
|
staticLibStdCpp: false,
|
||||||
),
|
),
|
||||||
|
|
||||||
librarianOptions: new GccToolchainConfig.LibrarianOptions(
|
librarianOptions: new GccToolchainConfig.LibrarianOptions(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user