dl-startup.h 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Architecture specific code used by dl-startup.c
  3. */
  4. /* This code fixes the stack pointer so that the dynamic linker
  5. * can find argc, argv and auxvt (Auxillary Vector Table). */
  6. #ifdef __arch_v32
  7. __asm__("" \
  8. " .text\n" \
  9. " .globl _start\n" \
  10. " .type _start,@function\n" \
  11. "_start:\n" \
  12. " move.d $sp,$r10\n" \
  13. " lapc _dl_start,$r9\n" \
  14. " jsr $r9\n" \
  15. " nop\n" \
  16. " moveq 0,$r8\n" \
  17. " jump $r10\n" \
  18. " move $r8,$srp\n" \
  19. " .size _start,.-_start\n" \
  20. " .previous\n" \
  21. );
  22. #else
  23. __asm__("" \
  24. " .text\n" \
  25. " .globl _start\n" \
  26. " .type _start,@function\n" \
  27. "_start:\n" \
  28. " move.d $sp,$r10\n" \
  29. " move.d $pc,$r9\n" \
  30. " add.d _dl_start - ., $r9\n" \
  31. " jsr $r9\n" \
  32. " moveq 0,$r8\n" \
  33. " move $r8,$srp\n" \
  34. " jump $r10\n" \
  35. " .size _start,.-_start\n" \
  36. " .previous\n" \
  37. );
  38. #endif /* __arch_v32 */
  39. /* Get a pointer to the argv array. On many platforms this can be just
  40. * the address of the first argument, on other platforms we need to
  41. * do something a little more subtle here. */
  42. #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS)+1)
  43. /* We can't call functions earlier in the dl startup process */
  44. #define NO_FUNCS_BEFORE_BOOTSTRAP
  45. /* Handle relocation of the symbols in the dynamic loader. */
  46. static __always_inline
  47. void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
  48. unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
  49. {
  50. switch (ELF32_R_TYPE(rpnt->r_info)) {
  51. case R_CRIS_GLOB_DAT:
  52. case R_CRIS_JUMP_SLOT:
  53. case R_CRIS_32:
  54. *reloc_addr = symbol_addr;
  55. break;
  56. case R_CRIS_16_PCREL:
  57. *(short *) *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 2;
  58. break;
  59. case R_CRIS_32_PCREL:
  60. *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 4;
  61. break;
  62. case R_CRIS_NONE:
  63. break;
  64. case R_CRIS_RELATIVE:
  65. *reloc_addr = load_addr + rpnt->r_addend;
  66. break;
  67. default:
  68. _dl_exit(1);
  69. break;
  70. }
  71. }