1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2018/09/15 parai first version
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #include "../dlmodule.h"
12*10465441SEvalZero #include "../dlelf.h"
13*10465441SEvalZero
14*10465441SEvalZero #ifdef __i386__
15*10465441SEvalZero
16*10465441SEvalZero #define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
17*10465441SEvalZero #define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
18*10465441SEvalZero #define R_X86_64_RELATIVE 8 /* Adjust by program base */
dlmodule_relocate(struct rt_dlmodule * module,Elf32_Rel * rel,Elf32_Addr sym_val)19*10465441SEvalZero int dlmodule_relocate(struct rt_dlmodule *module, Elf32_Rel *rel, Elf32_Addr sym_val)
20*10465441SEvalZero {
21*10465441SEvalZero Elf32_Addr *where, tmp;
22*10465441SEvalZero Elf32_Sword addend, offset;
23*10465441SEvalZero rt_uint32_t upper, lower, sign, j1, j2;
24*10465441SEvalZero
25*10465441SEvalZero where = (Elf32_Addr *)((rt_uint8_t *)module->mem_space
26*10465441SEvalZero + rel->r_offset
27*10465441SEvalZero - module->vstart_addr);
28*10465441SEvalZero
29*10465441SEvalZero switch (ELF32_R_TYPE(rel->r_info))
30*10465441SEvalZero {
31*10465441SEvalZero case R_X86_64_GLOB_DAT:
32*10465441SEvalZero case R_X86_64_JUMP_SLOT:
33*10465441SEvalZero *where = (Elf32_Addr)sym_val;
34*10465441SEvalZero
35*10465441SEvalZero RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_X86_64_JUMP_SLOT: 0x%x -> 0x%x 0x%x\n",
36*10465441SEvalZero (uint32_t)where, *where, sym_val));
37*10465441SEvalZero break;
38*10465441SEvalZero case R_X86_64_RELATIVE:
39*10465441SEvalZero *where = (Elf32_Addr)sym_val + *where;
40*10465441SEvalZero RT_DEBUG_LOG(RT_DEBUG_MODULE, ("R_X86_64_RELATIVE: 0x%x -> 0x%x 0x%x\n",
41*10465441SEvalZero (uint32_t)where, *where, sym_val));
42*10465441SEvalZero break;
43*10465441SEvalZero default:
44*10465441SEvalZero RT_DEBUG_LOG(RT_DEBUG_MODULE, ("X86ELF: invalid relocate TYPE %d\n", ELF32_R_TYPE(rel->r_info)));
45*10465441SEvalZero return -1;
46*10465441SEvalZero }
47*10465441SEvalZero
48*10465441SEvalZero return 0;
49*10465441SEvalZero }
50*10465441SEvalZero #endif
51