h_helper_ifunc.c revision 1.10
1/*- 2 * Copyright (c) 2014 The NetBSD Foundation, Inc. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The NetBSD Foundation 6 * by Joerg Sonnenberger. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 * POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#include <stdlib.h> 31#include <string.h> 32 33/* 34 * Not supported on hppa 35 */ 36#if !defined(__hppa__) 37 38static long long 39ifunc1(void) 40{ 41 return 0xdeadbeefll; 42} 43 44static long long 45ifunc2(void) 46{ 47 return 0xbeefdeadll; 48} 49 50static __attribute__((used)) 51long long (*resolve_ifunc(void))(void) 52{ 53 const char *e = getenv("USE_IFUNC2"); 54 return e && strcmp(e, "1") == 0 ? ifunc2 : ifunc1; 55} 56 57static __attribute__((used)) 58long long (*resolve_ifunc2(void))(void) 59{ 60 const char *e = getenv("USE_IFUNC2"); 61 return e && strcmp(e, "1") == 0 ? ifunc1 : ifunc2; 62} 63 64__ifunc(ifunc, resolve_ifunc); 65__hidden_ifunc(ifunc_hidden, resolve_ifunc2); 66 67long long ifunc_hidden(void); 68long long ifunc_plt(void); 69 70long long ifunc_plt(void) 71{ 72 return ifunc_hidden(); 73} 74 75long long (*ifunc_indirect(void))(void); 76 77long long (*ifunc_indirect(void))(void) 78{ 79 return ifunc_hidden; 80} 81#endif 82