reloc.c (559a218c9b257775fb249b67945fe4a05b7a6b9f) | reloc.c (9684658e35ab033c79e0519e3681d9a194976b71) |
---|---|
1/*- 2 * Copyright (c) 2019 Leandro Lupori 3 * Copyright (c) 2021 The FreeBSD Foundation 4 * 5 * Portions of this software were developed by Andrew Turner 6 * under sponsorship from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 10 unchanged lines hidden (view full) --- 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 | 1/*- 2 * Copyright (c) 2019 Leandro Lupori 3 * Copyright (c) 2021 The FreeBSD Foundation 4 * 5 * Portions of this software were developed by Andrew Turner 6 * under sponsorship from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 10 unchanged lines hidden (view full) --- 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 |
27#include <sys/cdefs.h> 28 |
|
27static void | 29static void |
30ifunc_init(const Elf_Auxinfo *aux __unused) 31{ 32} 33 34static void |
|
28crt1_handle_rela(const Elf_Rela *r) 29{ 30 typedef Elf_Addr (*ifunc_resolver_t)( 31 uint64_t, uint64_t, uint64_t, uint64_t, 32 uint64_t, uint64_t, uint64_t, uint64_t); 33 Elf_Addr *ptr, *where, target; 34 35 switch (ELF_R_TYPE(r->r_info)) { 36 case R_AARCH64_IRELATIVE: 37 ptr = (Elf_Addr *)r->r_addend; 38 where = (Elf_Addr *)r->r_offset; 39 target = ((ifunc_resolver_t)ptr)(0, 0, 0, 0, 0, 0, 0, 0); 40 *where = target; 41 break; 42 } 43} | 35crt1_handle_rela(const Elf_Rela *r) 36{ 37 typedef Elf_Addr (*ifunc_resolver_t)( 38 uint64_t, uint64_t, uint64_t, uint64_t, 39 uint64_t, uint64_t, uint64_t, uint64_t); 40 Elf_Addr *ptr, *where, target; 41 42 switch (ELF_R_TYPE(r->r_info)) { 43 case R_AARCH64_IRELATIVE: 44 ptr = (Elf_Addr *)r->r_addend; 45 where = (Elf_Addr *)r->r_offset; 46 target = ((ifunc_resolver_t)ptr)(0, 0, 0, 0, 0, 0, 0, 0); 47 *where = target; 48 break; 49 } 50} |