gprt0.as 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. Start-up code for Free Pascal Compiler when linking with C library
  3. with profiling support.
  4. Written by Edmund Grimley Evans in 2015 and released into the public domain.
  5. */
  6. .text
  7. .align 2
  8. .globl _start
  9. .type _start,#function
  10. _start:
  11. /* Initialise FP to zero */
  12. mov x29,#0
  13. /* This is rtld_fini */
  14. mov x5,x0
  15. /* Get argc, argv, envp */
  16. ldr x1,[sp]
  17. add x2,sp,#8
  18. add x11,x1,#1
  19. add x11,x2,x11,lsl #3
  20. /* Save argc, argv, envp, and initial stack pointer */
  21. adrp x10,:got:operatingsystem_parameter_argc
  22. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argc]
  23. str x1,[x10]
  24. adrp x10,:got:operatingsystem_parameter_argv
  25. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_argv]
  26. str x2,[x10]
  27. adrp x10,:got:operatingsystem_parameter_envp
  28. ldr x10,[x10,#:got_lo12:operatingsystem_parameter_envp]
  29. str x11,[x10]
  30. adrp x10,:got:__stkptr
  31. ldr x10,[x10,#:got_lo12:__stkptr]
  32. mov x6,sp
  33. str x6,[x10]
  34. /* __libc_start_main(main, argc, argv,
  35. init, fini, rtld_fini, stack_end) */
  36. adrp x0,:got:main_stub
  37. ldr x0,[x0,#:got_lo12:main_stub]
  38. adrp x3,:got:_init_dummy
  39. ldr x3,[x3,#:got_lo12:_init_dummy]
  40. adrp x4,:got:_fini_dummy
  41. ldr x4,[x4,#:got_lo12:_fini_dummy]
  42. bl __libc_start_main
  43. /* This should never happen */
  44. b abort
  45. .globl _init_dummy
  46. .type _init_dummy,#function
  47. _init_dummy:
  48. ret
  49. .globl _fini_dummy
  50. .type _fini_dummy,#function
  51. _fini_dummy:
  52. ret
  53. .globl main_stub
  54. .type main_stub,#function
  55. main_stub:
  56. stp x29,x30,[sp,#-16]!
  57. /* Save initial stackpointer */
  58. mov x0,sp
  59. adrp x1,:got:__stkptr
  60. ldr x1,[x1,#:got_lo12:__stkptr]
  61. str x0,[x1]
  62. /* Initialize gmon */
  63. adrp x0,:got:_start
  64. ldr x0,[x0,#:got_lo12:_start]
  65. adrp x1,:got:_etext
  66. ldr x1,[x1,#:got_lo12:_etext]
  67. bl __monstartup
  68. adrp x0,:got:_mcleanup
  69. ldr x0,[x0,#:got_lo12:_mcleanup]
  70. bl atexit
  71. /* Start the program */
  72. bl PASCALMAIN
  73. b abort
  74. .globl _haltproc
  75. .type _haltproc,#function
  76. _haltproc:
  77. /* Return to libc */
  78. adrp x1,:got:__stkptr
  79. ldr x1,[x1,#:got_lo12:__stkptr]
  80. ldr x1,[x1]
  81. mov sp,x1
  82. ldp x29,x30,[sp],#16
  83. ret
  84. /* Define a symbol for the first piece of initialized data. */
  85. .data
  86. .align 3
  87. .globl __data_start
  88. __data_start:
  89. .long 0
  90. .weak data_start
  91. data_start = __data_start
  92. .bss
  93. .align 3
  94. .comm __stkptr,8
  95. .comm operatingsystem_parameter_envp,8
  96. .comm operatingsystem_parameter_argc,8
  97. .comm operatingsystem_parameter_argv,8
  98. .section .note.GNU-stack,"",%progbits