From 3df5e3bd1363a767c29637c97e686bb5485b9659 Mon Sep 17 00:00:00 2001 From: Wolfgang Thaller Date: Thu, 28 Sep 2017 00:33:38 +0200 Subject: [PATCH] libelf: portable endianness detection --- libelf/src/portable_endian.h | 119 +++++++++++++++++++++++++++++++++++ libelf/src/system.h | 20 ++---- 2 files changed, 124 insertions(+), 15 deletions(-) create mode 100644 libelf/src/portable_endian.h diff --git a/libelf/src/portable_endian.h b/libelf/src/portable_endian.h new file mode 100644 index 0000000000..55f8cc2525 --- /dev/null +++ b/libelf/src/portable_endian.h @@ -0,0 +1,119 @@ +// "License": Public Domain +// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like. +// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to +// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it +// an example on how to get the endian conversion functions on different platforms. + +#ifndef PORTABLE_ENDIAN_H__ +#define PORTABLE_ENDIAN_H__ + +#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) + +# define __WINDOWS__ + +#endif + +#if defined(__linux__) || defined(__CYGWIN__) + +# include + +#elif defined(__APPLE__) + +# include + +# define htobe16(x) OSSwapHostToBigInt16(x) +# define htole16(x) OSSwapHostToLittleInt16(x) +# define be16toh(x) OSSwapBigToHostInt16(x) +# define le16toh(x) OSSwapLittleToHostInt16(x) + +# define htobe32(x) OSSwapHostToBigInt32(x) +# define htole32(x) OSSwapHostToLittleInt32(x) +# define be32toh(x) OSSwapBigToHostInt32(x) +# define le32toh(x) OSSwapLittleToHostInt32(x) + +# define htobe64(x) OSSwapHostToBigInt64(x) +# define htole64(x) OSSwapHostToLittleInt64(x) +# define be64toh(x) OSSwapBigToHostInt64(x) +# define le64toh(x) OSSwapLittleToHostInt64(x) + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#elif defined(__OpenBSD__) + +# include + +#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) + +# include + +# define be16toh(x) betoh16(x) +# define le16toh(x) letoh16(x) + +# define be32toh(x) betoh32(x) +# define le32toh(x) letoh32(x) + +# define be64toh(x) betoh64(x) +# define le64toh(x) letoh64(x) + +#elif defined(__WINDOWS__) + +# include +# include + +# if BYTE_ORDER == LITTLE_ENDIAN + +# define htobe16(x) htons(x) +# define htole16(x) (x) +# define be16toh(x) ntohs(x) +# define le16toh(x) (x) + +# define htobe32(x) htonl(x) +# define htole32(x) (x) +# define be32toh(x) ntohl(x) +# define le32toh(x) (x) + +# define htobe64(x) htonll(x) +# define htole64(x) (x) +# define be64toh(x) ntohll(x) +# define le64toh(x) (x) + +# elif BYTE_ORDER == BIG_ENDIAN + + /* that would be xbox 360 */ +# define htobe16(x) (x) +# define htole16(x) __builtin_bswap16(x) +# define be16toh(x) (x) +# define le16toh(x) __builtin_bswap16(x) + +# define htobe32(x) (x) +# define htole32(x) __builtin_bswap32(x) +# define be32toh(x) (x) +# define le32toh(x) __builtin_bswap32(x) + +# define htobe64(x) (x) +# define htole64(x) __builtin_bswap64(x) +# define be64toh(x) (x) +# define le64toh(x) __builtin_bswap64(x) + +# else + +# error byte order not supported + +# endif + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#else + +# error platform not supported + +#endif + +#endif + diff --git a/libelf/src/system.h b/libelf/src/system.h index 5b6b8dfdfc..c23ad05db4 100644 --- a/libelf/src/system.h +++ b/libelf/src/system.h @@ -33,23 +33,13 @@ #include #include #include -#include -#include +#include "portable_endian.h" #include -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define LE32(n) (n) -# define LE64(n) (n) -# define BE32(n) bswap_32 (n) -# define BE64(n) bswap_64 (n) -#elif __BYTE_ORDER == __BIG_ENDIAN -# define BE32(n) (n) -# define BE64(n) (n) -# define LE32(n) bswap_32 (n) -# define LE64(n) bswap_64 (n) -#else -# error "Unknown byte order" -#endif +# define LE32(n) le32toh (n) +# define LE64(n) le64toh (n) +# define BE32(n) be32toh (n) +# define BE64(n) be64toh (n) #ifndef MAX #define MAX(m, n) ((m) < (n) ? (n) : (m))