summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-07 22:28:18 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-07 22:28:18 +0000
commit4651201c4ac47d0c9f757aa9c5032c38e74ac89d (patch)
tree0f5e6745e3afc784ab18935c26d3008c543107e2
parenta7fc993faeff98ddfc46a8561619e3e7215791c0 (diff)
downloadfpc-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.inc27
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;