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