diff options
-rw-r--r-- | cmake/Modules/DefineCompilerFlags.cmake | 2 | ||||
-rw-r--r-- | lib/enable_execute_stack.c | 3 | ||||
-rw-r--r-- | lib/endianness.h | 79 | ||||
-rw-r--r-- | test/Unit/endianness.h | 79 |
4 files changed, 111 insertions, 52 deletions
diff --git a/cmake/Modules/DefineCompilerFlags.cmake b/cmake/Modules/DefineCompilerFlags.cmake index ddfc2e36..ff3fbd0e 100644 --- a/cmake/Modules/DefineCompilerFlags.cmake +++ b/cmake/Modules/DefineCompilerFlags.cmake @@ -1,4 +1,4 @@ # Define compiler flags #ADD_DEFINITIONS( -Wall -W -Werror -pedantic ) -ADD_DEFINITIONS( -Wall -W -pedantic ) +ADD_DEFINITIONS( -std=gnu99 -Wall -Wextra -W -pedantic -Wno-unused-parameter ) diff --git a/lib/enable_execute_stack.c b/lib/enable_execute_stack.c index c2ebc30f..aed1b88c 100644 --- a/lib/enable_execute_stack.c +++ b/lib/enable_execute_stack.c @@ -36,7 +36,8 @@ void __enable_execute_stack(void* addr) uintptr_t p = (uintptr_t)addr; unsigned char* startPage = (unsigned char*)(p & pageAlignMask); unsigned char* endPage = (unsigned char*)((p+48+pageSize) & pageAlignMask); - mprotect(startPage, endPage-startPage, PROT_READ | PROT_WRITE | PROT_EXEC); + size_t length = endPage - startPage; + (void) mprotect((void *)startPage, length, PROT_READ | PROT_WRITE | PROT_EXEC); } diff --git a/lib/endianness.h b/lib/endianness.h index 9e192c10..8069bacb 100644 --- a/lib/endianness.h +++ b/lib/endianness.h @@ -16,50 +16,79 @@ #ifndef ENDIANNESS_H #define ENDIANNESS_H -/* TODO: Improve this to minimal pre-processor hackish'ness. */ -/* config.h build via CMake. */ -/* #include <config.h> */ -/* Solaris header for endian and byte swap */ -/* #if defined HAVE_SYS_BYTEORDER_H */ +/* + * Known limitations: + * Middle endian systems are not handled currently. + */ -#if defined (__SVR4) && defined (__sun) +#if defined(__SVR4) && defined(__sun) #include <sys/byteorder.h> + #if _BYTE_ORDER == _BIG_ENDIAN -#define __BIG_ENDIAN__ 1 -#define __LITTLE_ENDIAN__ 0 -#else /* _BYTE_ORDER == _LITTLE_ENDIAN */ -#define __BIG_ENDIAN__ 0 -#define __LITTLE_ENDIAN__ 1 +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#elif _BYTE_ORDER == _LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 #endif /* _BYTE_ORDER */ + #endif /* Solaris and AuroraUX. */ -#if defined (__FreeBSD__) +/* .. */ + +#if defined(__FreeBSD__) && defined(__NetBSD__) && defined(__OpenBSD__) && defined(__DragonflyBSD__) #include <sys/endian.h> + #if _BYTE_ORDER == _BIG_ENDIAN -#define __BIG_ENDIAN__ 1 -#define __LITTLE_ENDIAN__ 0 -#else /* _BYTE_ORDER == _LITTLE_ENDIAN */ -#define __BIG_ENDIAN__ 0 -#define __LITTLE_ENDIAN__ 1 +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#elif _BYTE_ORDER == _LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 #endif /* _BYTE_ORDER */ -#endif /* FreeBSD */ + +#endif /* *BSD */ + +/* .. */ + +/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the compiler (at least with GCC) */ +#if defined(__APPLE__) && defined(__MACH__) + +#ifdef __BIG_ENDIAN__ +#if __BIG_ENDIAN__ +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#endif +#endif /* __BIG_ENDIAN__ */ #ifdef __LITTLE_ENDIAN__ #if __LITTLE_ENDIAN__ #define _YUGA_LITTLE_ENDIAN 1 #define _YUGA_BIG_ENDIAN 0 #endif -#endif +#endif /* __LITTLE_ENDIAN__ */ -#ifdef __BIG_ENDIAN__ -#if __BIG_ENDIAN__ +#endif /* Mac OSX */ + +/* .. */ + +#if defined(__Linux__) +#include <endian.h> + +#if __BYTE_ORDER == __BIG_ENDIAN #define _YUGA_LITTLE_ENDIAN 0 #define _YUGA_BIG_ENDIAN 1 -#endif -#endif +#elif __BYTE_ORDER == __LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 +#endif /* __BYTE_ORDER */ + +#endif /* GNU/Linux */ + +/* . */ #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) -#error unable to determine endian -#endif +#error Unable to determine endian +#endif /* Check we found an endianness correctly. */ #endif /* ENDIANNESS_H */ diff --git a/test/Unit/endianness.h b/test/Unit/endianness.h index 9e192c10..8069bacb 100644 --- a/test/Unit/endianness.h +++ b/test/Unit/endianness.h @@ -16,50 +16,79 @@ #ifndef ENDIANNESS_H #define ENDIANNESS_H -/* TODO: Improve this to minimal pre-processor hackish'ness. */ -/* config.h build via CMake. */ -/* #include <config.h> */ -/* Solaris header for endian and byte swap */ -/* #if defined HAVE_SYS_BYTEORDER_H */ +/* + * Known limitations: + * Middle endian systems are not handled currently. + */ -#if defined (__SVR4) && defined (__sun) +#if defined(__SVR4) && defined(__sun) #include <sys/byteorder.h> + #if _BYTE_ORDER == _BIG_ENDIAN -#define __BIG_ENDIAN__ 1 -#define __LITTLE_ENDIAN__ 0 -#else /* _BYTE_ORDER == _LITTLE_ENDIAN */ -#define __BIG_ENDIAN__ 0 -#define __LITTLE_ENDIAN__ 1 +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#elif _BYTE_ORDER == _LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 #endif /* _BYTE_ORDER */ + #endif /* Solaris and AuroraUX. */ -#if defined (__FreeBSD__) +/* .. */ + +#if defined(__FreeBSD__) && defined(__NetBSD__) && defined(__OpenBSD__) && defined(__DragonflyBSD__) #include <sys/endian.h> + #if _BYTE_ORDER == _BIG_ENDIAN -#define __BIG_ENDIAN__ 1 -#define __LITTLE_ENDIAN__ 0 -#else /* _BYTE_ORDER == _LITTLE_ENDIAN */ -#define __BIG_ENDIAN__ 0 -#define __LITTLE_ENDIAN__ 1 +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#elif _BYTE_ORDER == _LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 #endif /* _BYTE_ORDER */ -#endif /* FreeBSD */ + +#endif /* *BSD */ + +/* .. */ + +/* Mac OSX has __BIG_ENDIAN__ or __LITTLE_ENDIAN__ automatically set by the compiler (at least with GCC) */ +#if defined(__APPLE__) && defined(__MACH__) + +#ifdef __BIG_ENDIAN__ +#if __BIG_ENDIAN__ +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#endif +#endif /* __BIG_ENDIAN__ */ #ifdef __LITTLE_ENDIAN__ #if __LITTLE_ENDIAN__ #define _YUGA_LITTLE_ENDIAN 1 #define _YUGA_BIG_ENDIAN 0 #endif -#endif +#endif /* __LITTLE_ENDIAN__ */ -#ifdef __BIG_ENDIAN__ -#if __BIG_ENDIAN__ +#endif /* Mac OSX */ + +/* .. */ + +#if defined(__Linux__) +#include <endian.h> + +#if __BYTE_ORDER == __BIG_ENDIAN #define _YUGA_LITTLE_ENDIAN 0 #define _YUGA_BIG_ENDIAN 1 -#endif -#endif +#elif __BYTE_ORDER == __LITTLE_ENDIAN +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 +#endif /* __BYTE_ORDER */ + +#endif /* GNU/Linux */ + +/* . */ #if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) -#error unable to determine endian -#endif +#error Unable to determine endian +#endif /* Check we found an endianness correctly. */ #endif /* ENDIANNESS_H */ |