| /* Operating system specific code for generic dynamic loader functions. | 
 |    Copyright (C) 2009-2016 Free Software Foundation, Inc. | 
 |    This file is part of the GNU C Library. | 
 |  | 
 |    The GNU C Library is free software; you can redistribute it and/or | 
 |    modify it under the terms of the GNU Lesser General Public | 
 |    License as published by the Free Software Foundation; either | 
 |    version 2.1 of the License, or (at your option) any later version. | 
 |  | 
 |    The GNU C Library is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |    Lesser General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU Lesser General Public | 
 |    License along with the GNU C Library; if not, see | 
 |    <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | #include <endian.h> | 
 | #include <stdint.h> | 
 |  | 
 | static inline uintptr_t __attribute__ ((always_inline)) | 
 | _dl_setup_stack_chk_guard (void *dl_random) | 
 | { | 
 |   union | 
 |   { | 
 |     uintptr_t num; | 
 |     unsigned char bytes[sizeof (uintptr_t)]; | 
 |   } ret = { 0 }; | 
 |  | 
 |   if (dl_random == NULL) | 
 |     { | 
 |       ret.bytes[sizeof (ret) - 1] = 255; | 
 |       ret.bytes[sizeof (ret) - 2] = '\n'; | 
 |     } | 
 |   else | 
 |     { | 
 |       memcpy (ret.bytes, dl_random, sizeof (ret)); | 
 | #if BYTE_ORDER == LITTLE_ENDIAN | 
 |       ret.num &= ~(uintptr_t) 0xff; | 
 | #elif BYTE_ORDER == BIG_ENDIAN | 
 |       ret.num &= ~((uintptr_t) 0xff << (8 * (sizeof (ret) - 1))); | 
 | #else | 
 | # error "BYTE_ORDER unknown" | 
 | #endif | 
 |     } | 
 |   return ret.num; | 
 | } | 
 |  | 
 | static inline uintptr_t __attribute__ ((always_inline)) | 
 | _dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard) | 
 | { | 
 |   uintptr_t ret; | 
 |   if (dl_random == NULL) | 
 |     ret = stack_chk_guard; | 
 |   else | 
 |     memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret)); | 
 |   return ret; | 
 | } |