diff options
author | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-03-07 22:28:18 +0000 |
---|---|---|
committer | florian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-03-07 22:28:18 +0000 |
commit | 4651201c4ac47d0c9f757aa9c5032c38e74ac89d (patch) | |
tree | 0f5e6745e3afc784ab18935c26d3008c543107e2 | |
parent | a7fc993faeff98ddfc46a8561619e3e7215791c0 (diff) | |
download | fpc-4651201c4ac47d0c9f757aa9c5032c38e74ac89d.tar.gz |
o RiscV64 glibc startup code fixed:
* there is no _init/_fini, call libc_csu_* instead
* fix loading of global_pointer
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@48904 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | rtl/linux/riscv64/si_c.inc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/rtl/linux/riscv64/si_c.inc b/rtl/linux/riscv64/si_c.inc index 1dd3de3139..942372e934 100644 --- a/rtl/linux/riscv64/si_c.inc +++ b/rtl/linux/riscv64/si_c.inc @@ -22,8 +22,10 @@ var BSS_START: record end; external name '__bss_start'; STACK_PTR: record end; external name '__stkptr'; - libc_init_proc: TProcedure; weakexternal name '_init'; - libc_fini_proc: TProcedure; weakexternal name '_fini'; + { as we do not call these procedures directly, calling conventions do not matter and + even if we did, we use c calling conventions anyways } + procedure __libc_csu_init; external name '__libc_csu_init'; + procedure __libc_csu_fini; external name '__libc_csu_fini'; procedure libc_start_main(main: TProcedure; argc: ptruint; argv: ppchar; init, fini, rtld_fini: TProcedure; stack_end: pointer); cdecl; external name '__libc_start_main'; procedure libc_exit(code: ptruint); cdecl; external name 'exit'; @@ -41,7 +43,7 @@ procedure _FPC_rv_enter(at_exit: TProcedure; sp: pptruint); operatingsystem_parameter_argv:=argv; operatingsystem_parameter_envp:=@sp[argc+2]; - libc_start_main(@PascalMain, argc, argv, libc_init_proc, libc_fini_proc, at_exit, sp); + libc_start_main(@PascalMain, argc, argv, @__libc_csu_init, @__libc_csu_fini, at_exit, sp); end; @@ -51,7 +53,7 @@ procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; .option push .option norelax .L1: - auipc gp, %pcrel_hi(BSS_START+0x800) + auipc gp, %pcrel_hi(BSS_START+0x7f8) addi gp, gp, %pcrel_lo(.L1) .option pop @@ -79,3 +81,20 @@ procedure _FPC_proc_haltproc(e:longint); cdecl; public name '_haltproc'; _FPC_rv_exit(e); end; end; + + + procedure initgp; assembler; nostackframe; + asm + .Linitgp: + .option push + .option norelax + .L1: + auipc gp, %pcrel_hi(BSS_START+0x7f8) + addi gp, gp, %pcrel_lo(.L1) + .option pop + jalr x0, x1 + + .section ".preinit_array","aw" + .dc.a .Linitgp + .text + end; |