47 lines
1.8 KiB
C++
47 lines
1.8 KiB
C++
// various workarounds/fixes for different compilers
|
|
|
|
#ifndef _IDA_WORKAROUNDS_H
|
|
#define _IDA_WORKAROUNDS_H
|
|
|
|
// MS Visual C++:
|
|
// this file should be included once in module (exe or dll) where std::stable_sort() is used
|
|
#ifdef _MSC_VER
|
|
#if (_MSC_VER < 1700) // before VS2012
|
|
// the following fixes unneeded exports caused by use
|
|
// of std::stable_sort, which uses new(std::nothrow)
|
|
// reference: http://social.msdn.microsoft.com/Forums/vstudio/en-US/4692205a-0296-4f41-adbb-fa8339597f5c/unwanted-exports
|
|
|
|
namespace std { extern const __declspec(selectany) nothrow_t nothrow = nothrow_t(); }
|
|
|
|
// explanation by Javier Blazquez:
|
|
|
|
/*
|
|
The reason why this eliminates the _Init_locks export is because the linker
|
|
no longer has to go find and use the nothrow.obj file (part of msvcprt.lib)
|
|
during linking for the definition of std::nothrow, it can just use the
|
|
definition you provided. That nothrow.obj file not only contains the
|
|
definition of std::nothrow, it also contains a dllexport definition of
|
|
std::_Init_locks::operator= (in fact, the only such definition of this
|
|
function anywhere in the standard libraries), so preventing the linker from
|
|
using the standard nothrow.obj at all has the effect of removing this ugly
|
|
export altogether.
|
|
*/
|
|
#endif // (_MSC_VER < 1700)
|
|
#endif // _MSC_VER
|
|
|
|
#ifdef __LINUX__
|
|
// suppress dependency on __longjmp_chk
|
|
// idea stolen from http://code.google.com/p/webm/issues/detail?id=166
|
|
// this file should be included in modules where longjmp is used
|
|
#if !defined(__ARM__) && defined(__GNUC_PREREQ) && __GNUC_PREREQ(2,11)
|
|
#ifndef __X86__
|
|
__asm__(".symver __longjmp_chk,longjmp@GLIBC_2.2.5");
|
|
#else
|
|
__asm__(".symver __longjmp_chk,longjmp@GLIBC_2.0");
|
|
#endif // !__X86__
|
|
#endif // __GNUC_PREREQ
|
|
#endif // __LINUX__
|
|
|
|
#endif // _IDA_WORKAROUNDS_H
|
|
|