65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2021, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author            Notes
 | |
|  * 2021/04/23     chunyexixiaoyu    first version
 | |
| 
 | |
|  */
 | |
| 
 | |
| #include "../dlmodule.h"
 | |
| #include "../dlelf.h"
 | |
| 
 | |
| #if (__riscv_xlen == 64)
 | |
| #define R_RISCV_NONE           0
 | |
| #define R_RISCV_32             1
 | |
| #define R_RISCV_64             2
 | |
| #define R_RISCV_RELATIVE       3
 | |
| #define R_RISCV_COPY           4
 | |
| #define R_RISCV_JUMP_SLOT      5
 | |
| #define R_RISCV_TLS_DTPMOD32   6
 | |
| #define R_RISCV_TLS_DTPMOD64   7
 | |
| #define R_RISCV_TLS_DTPREL32   8
 | |
| #define R_RISCV_TLS_DTPREL64   9
 | |
| #define R_RISCV_TLS_TPREL32   10
 | |
| #define R_RISCV_TLS_TPREL64   11
 | |
| 
 | |
| #define DBG_TAG           "posix.libdl.arch"
 | |
| #define DBG_LVL           DBG_INFO
 | |
| #include <rtdbg.h>
 | |
| 
 | |
| int dlmodule_relocate(struct rt_dlmodule *module, Elf_Rel *rel, Elf_Addr sym_val)
 | |
| {
 | |
|     Elf64_Addr *where, tmp;
 | |
|     Elf64_Sword addend, offset;
 | |
|     rt_uint64_t upper, lower, sign, j1, j2;
 | |
| 
 | |
|     where = (Elf64_Addr *)((rt_uint8_t *)module->mem_space
 | |
|                            + rel->r_offset
 | |
|                            - module->vstart_addr);
 | |
|     switch (ELF64_R_TYPE(rel->r_info))
 | |
|     {
 | |
|         case R_RISCV_NONE:
 | |
|             break;
 | |
|         case R_RISCV_64:
 | |
|             *where = (Elf64_Addr)(sym_val + rel->r_addend);
 | |
|             LOG_D("R_RISCV_64: %x -> %x",where, *where);
 | |
|             break;
 | |
|         case R_RISCV_RELATIVE:
 | |
|             *where = (Elf64_Addr)((rt_uint8_t *)module->mem_space - module->vstart_addr + rel->r_addend);
 | |
|             LOG_D("R_RISCV_RELATIVE: %x -> %x",where, *where);
 | |
|             break;
 | |
|         case R_RISCV_JUMP_SLOT:
 | |
|             *where = (Elf64_Addr)sym_val;
 | |
|             LOG_D("R_RISCV_JUMP_SLOT: %x -> %x",where, *where);
 | |
|             break;
 | |
|         default:
 | |
|             LOG_D("__riscv__ELF: invalid relocate TYPE %d", ELF64_R_TYPE(rel->r_info));
 | |
|             return -1;
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| #endif
 |