dl-startup.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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. asm("" \
  7. " .text\n" \
  8. " .globl _start\n" \
  9. " .type _start,@function\n" \
  10. "_start:\n" \
  11. " move.d $sp,$r10\n" \
  12. " move.d $pc,$r9\n" \
  13. " add.d _dl_start - ., $r9\n" \
  14. " jsr $r9\n" \
  15. " moveq 0,$r8\n" \
  16. " move $r8,$srp\n" \
  17. " jump $r10\n" \
  18. " .size _start,.-_start\n" \
  19. " .previous\n" \
  20. );
  21. /* Get a pointer to the argv array. On many platforms this can be just
  22. * the address if the first argument, on other platforms we need to
  23. * do something a little more subtle here. */
  24. #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS)+1)
  25. /* We can't call functions earlier in the dl startup process */
  26. #define NO_FUNCS_BEFORE_BOOTSTRAP
  27. /* Handle relocation of the symbols in the dynamic loader. */
  28. static inline
  29. void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
  30. unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
  31. {
  32. switch (ELF32_R_TYPE(rpnt->r_info)) {
  33. case R_CRIS_GLOB_DAT:
  34. case R_CRIS_JUMP_SLOT:
  35. case R_CRIS_32:
  36. *reloc_addr = symbol_addr;
  37. break;
  38. case R_CRIS_16_PCREL:
  39. *(short *) *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 2;
  40. break;
  41. case R_CRIS_32_PCREL:
  42. *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 4;
  43. break;
  44. case R_CRIS_NONE:
  45. break;
  46. case R_CRIS_RELATIVE:
  47. *reloc_addr = load_addr + rpnt->r_addend;
  48. break;
  49. default:
  50. _dl_exit(1);
  51. break;
  52. }
  53. }
  54. /* Transfer control to the user's application, once the dynamic loader is
  55. * done. This routine has to exit the current function, then call the
  56. * _dl_elf_main function. */
  57. #define START() return _dl_elf_main