riscv.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2006-2021, 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. #include "../dlmodule.h"
  11. #include "../dlelf.h"
  12. #if (__riscv_xlen == 64)
  13. #define R_RISCV_NONE 0
  14. #define R_RISCV_32 1
  15. #define R_RISCV_64 2
  16. #define R_RISCV_RELATIVE 3
  17. #define R_RISCV_COPY 4
  18. #define R_RISCV_JUMP_SLOT 5
  19. #define R_RISCV_TLS_DTPMOD32 6
  20. #define R_RISCV_TLS_DTPMOD64 7
  21. #define R_RISCV_TLS_DTPREL32 8
  22. #define R_RISCV_TLS_DTPREL64 9
  23. #define R_RISCV_TLS_TPREL32 10
  24. #define R_RISCV_TLS_TPREL64 11
  25. #define DBG_TAG "posix.libdl.arch"
  26. #define DBG_LVL DBG_INFO
  27. #include <rtdbg.h>
  28. int dlmodule_relocate(struct rt_dlmodule *module, Elf_Rel *rel, Elf_Addr sym_val)
  29. {
  30. Elf64_Addr *where, tmp;
  31. Elf64_Sword addend, offset;
  32. rt_uint64_t upper, lower, sign, j1, j2;
  33. where = (Elf64_Addr *)((rt_uint8_t *)module->mem_space
  34. + rel->r_offset
  35. - module->vstart_addr);
  36. switch (ELF64_R_TYPE(rel->r_info))
  37. {
  38. case R_RISCV_NONE:
  39. break;
  40. case R_RISCV_64:
  41. *where = (Elf64_Addr)(sym_val + rel->r_addend);
  42. LOG_D("R_RISCV_64: %x -> %x",where, *where);
  43. break;
  44. case R_RISCV_RELATIVE:
  45. *where = (Elf64_Addr)((rt_uint8_t *)module->mem_space - module->vstart_addr + rel->r_addend);
  46. LOG_D("R_RISCV_RELATIVE: %x -> %x",where, *where);
  47. break;
  48. case R_RISCV_JUMP_SLOT:
  49. *where = (Elf64_Addr)sym_val;
  50. LOG_D("R_RISCV_JUMP_SLOT: %x -> %x",where, *where);
  51. break;
  52. default:
  53. LOG_D("__riscv__ELF: invalid relocate TYPE %d", ELF64_R_TYPE(rel->r_info));
  54. return -1;
  55. }
  56. return 0;
  57. }
  58. #endif