dl-startup.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * Architecture specific code used by dl-startup.c
  4. * Copyright (C) 2005 by Erik Andersen <andersen@codepoet.org>
  5. */
  6. asm(
  7. " .text\n"
  8. " .globl _start\n"
  9. " .type _start,@function\n"
  10. "_start:\n"
  11. " .set _start,_dl_start\n"
  12. " .size _start,.-_start\n"
  13. " .previous\n"
  14. );
  15. /* Get a pointer to the argv array. On many platforms this can be just
  16. * the address if the first argument, on other platforms we need to
  17. * do something a little more subtle here. */
  18. #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned int *) & ARGS)
  19. /* Handle relocation of the symbols in the dynamic loader. */
  20. static inline
  21. void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
  22. unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
  23. {
  24. switch (ELF32_R_TYPE(rpnt->r_info))
  25. {
  26. case R_68K_8:
  27. *(char *) reloc_addr = symbol_addr + rpnt->r_addend;
  28. break;
  29. case R_68K_16:
  30. *(short *) reloc_addr = symbol_addr + rpnt->r_addend;
  31. break;
  32. case R_68K_32:
  33. *reloc_addr = symbol_addr + rpnt->r_addend;
  34. break;
  35. case R_68K_PC8:
  36. *(char *) reloc_addr = (symbol_addr + rpnt->r_addend
  37. - (unsigned int) reloc_addr);
  38. break;
  39. case R_68K_PC16:
  40. *(short *) reloc_addr = (symbol_addr + rpnt->r_addend
  41. - (unsigned int) reloc_addr);
  42. break;
  43. case R_68K_PC32:
  44. *reloc_addr = (symbol_addr + rpnt->r_addend
  45. - (unsigned int) reloc_addr);
  46. break;
  47. case R_68K_GLOB_DAT:
  48. case R_68K_JMP_SLOT:
  49. *reloc_addr = symbol_addr;
  50. break;
  51. case R_68K_RELATIVE:
  52. *reloc_addr = ((unsigned int) load_addr +
  53. (rpnt->r_addend ? : *reloc_addr));
  54. break;
  55. default:
  56. _dl_exit (1);
  57. }
  58. }
  59. /* Transfer control to the user's application, once the dynamic loader is
  60. * done. This routine has to exit the current function, then call the
  61. * _dl_elf_main function. */
  62. #define START() \
  63. __asm__ volatile ( \
  64. "unlk %%a6\n\t" \
  65. "jmp %0@" \
  66. : : "a" (_dl_elf_main));