1 /*
2 * Copyright (c) 2006-2024 RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021/04/23 chunyexixiaoyu first version
9
10 */
11
12 #include "../dlmodule.h"
13 #include "../dlelf.h"
14
15 #if (__riscv_xlen == 64)
16 #define R_RISCV_NONE 0
17 #define R_RISCV_32 1
18 #define R_RISCV_64 2
19 #define R_RISCV_RELATIVE 3
20 #define R_RISCV_COPY 4
21 #define R_RISCV_JUMP_SLOT 5
22 #define R_RISCV_TLS_DTPMOD32 6
23 #define R_RISCV_TLS_DTPMOD64 7
24 #define R_RISCV_TLS_DTPREL32 8
25 #define R_RISCV_TLS_DTPREL64 9
26 #define R_RISCV_TLS_TPREL32 10
27 #define R_RISCV_TLS_TPREL64 11
28
29 #define DBG_TAG "posix.libdl.arch"
30 #define DBG_LVL DBG_INFO
31 #include <rtdbg.h>
32
dlmodule_relocate(struct rt_dlmodule * module,Elf_Rel * rel,Elf_Addr sym_val)33 int dlmodule_relocate(struct rt_dlmodule *module, Elf_Rel *rel, Elf_Addr sym_val)
34 {
35 Elf64_Addr *where, tmp;
36 Elf64_Sword addend, offset;
37 rt_uint64_t upper, lower, sign, j1, j2;
38
39 where = (Elf64_Addr *)((rt_uint8_t *)module->mem_space
40 + rel->r_offset
41 - module->vstart_addr);
42 switch (ELF64_R_TYPE(rel->r_info))
43 {
44 case R_RISCV_NONE:
45 break;
46 case R_RISCV_64:
47 *where = (Elf64_Addr)(sym_val + rel->r_addend);
48 LOG_D("R_RISCV_64: %x -> %x",where, *where);
49 break;
50 case R_RISCV_RELATIVE:
51 *where = (Elf64_Addr)((rt_uint8_t *)module->mem_space - module->vstart_addr + rel->r_addend);
52 LOG_D("R_RISCV_RELATIVE: %x -> %x",where, *where);
53 break;
54 case R_RISCV_JUMP_SLOT:
55 *where = (Elf64_Addr)sym_val;
56 LOG_D("R_RISCV_JUMP_SLOT: %x -> %x",where, *where);
57 break;
58 default:
59 LOG_D("__riscv__ELF: invalid relocate TYPE %d", ELF64_R_TYPE(rel->r_info));
60 return -1;
61 }
62 return 0;
63 }
64 #endif
65