xref: /nrf52832-nimble/rt-thread/components/libc/libdl/arch/x86.c (revision 104654410c56c573564690304ae786df310c91fc)
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