dl-startup.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * Copyright (C) 2013 Imagination Technologies Ltd.
  3. *
  4. * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
  5. */
  6. /*
  7. * This code fixes the stack pointer so that the dynamic linker
  8. * can find argc, argv and auxvt (Auxillary Vector Table).
  9. */
  10. __asm__ (
  11. " .text\n"
  12. " .global __start\n"
  13. " .type __start,@function\n"
  14. " .hidden __start\n"
  15. "_start:\n"
  16. "__start:\n"
  17. " MSETL [A0StP++],D0Ar4,D0Ar2\n"
  18. " MOV D1Ar1,D0Ar2\n"
  19. " CALLR D1RtP,__dl_start\n"
  20. " GETL D0Ar2,D1Ar1,[A0StP+#-(1*8)]\n"
  21. " GETL D0Ar4,D1Ar3,[A0StP+#-(2*8)]\n"
  22. " ADDT A1LbP,CPC1,#HI(__GLOBAL_OFFSET_TABLE__)\n"
  23. " ADD A1LbP,A1LbP,#LO(__GLOBAL_OFFSET_TABLE__+4)\n"
  24. " ADDT A1LbP,A1LbP,#HI(__dl_fini@GOTOFF)\n"
  25. " ADD A1LbP,A1LbP,#LO(__dl_fini@GOTOFF)\n"
  26. " MOV D0Ar4, A1LbP\n"
  27. " SUB A0StP,A0StP,#(2*8)\n"
  28. " MOV PC,D0Re0\n"
  29. " .size __start,.-__start\n"
  30. " .previous\n"
  31. );
  32. /*
  33. * Get a pointer to the argv array. On many platforms this can be just
  34. * the address if the first argument, on other platforms we need to
  35. * do something a little more subtle here.
  36. */
  37. #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS))
  38. /* Handle relocation of the symbols in the dynamic loader. */
  39. static inline
  40. void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
  41. unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
  42. {
  43. switch (ELF32_R_TYPE(rpnt->r_info)) {
  44. case R_METAG_GLOB_DAT:
  45. case R_METAG_JMP_SLOT:
  46. case R_METAG_ADDR32:
  47. *reloc_addr = symbol_addr;
  48. break;
  49. case R_METAG_RELATIVE:
  50. *reloc_addr = load_addr + rpnt->r_addend;
  51. break;
  52. case R_METAG_RELBRANCH:
  53. *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 4;
  54. break;
  55. case R_METAG_NONE:
  56. break;
  57. default:
  58. _dl_exit(1);
  59. break;
  60. }
  61. }