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