* invoke _csu_finish before __init in the OpenBSD i386 C library startup code

git-svn-id: trunk@42132 -
This commit is contained in:
nickysn 2019-05-28 15:39:43 +00:00
parent 62a572e484
commit 2fdef04a28
2 changed files with 10 additions and 4 deletions

View File

@ -18,6 +18,7 @@
procedure __init; cdecl; external name '__init';
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
function _csu_finish(_argv: PPChar; _envp: PPChar; _cleanup: TCdeclProcedure): PPPChar; cdecl; external name '_csu_finish';
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; forward;
@ -41,9 +42,11 @@ function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl;
var
I: SizeUInt;
environp: PPPChar;
begin
environ:=envp;
operatingsystem_parameter_envp:=envp;
environp:=_csu_finish(argv, envp, cleanup);
environ:=environp^;
operatingsystem_parameter_envp:=environ;
operatingsystem_parameter_argc:=argc;
operatingsystem_parameter_argv:=argv;
if argv[0]<>nil then

View File

@ -25,6 +25,7 @@ function atexit(proc: TCdeclProcedure): cint; cdecl; external name 'atexit';
procedure _monstartup(lowpc, highpc: u_long); cdecl; external name '_monstartup';
procedure __init; cdecl; external name '__init';
procedure c_exit(exit_code: cint); cdecl; noreturn; external name 'exit';
function _csu_finish(_argv: PPChar; _envp: PPChar; _cleanup: TCdeclProcedure): PPPChar; cdecl; external name '_csu_finish';
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl; forward;
@ -48,9 +49,11 @@ function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; cleanup: TCdeclProcedure); cdecl;
var
I: SizeUInt;
environp: PPPChar;
begin
environ:=envp;
operatingsystem_parameter_envp:=envp;
environp:=_csu_finish(argv, envp, cleanup);
environ:=environp^;
operatingsystem_parameter_envp:=environ;
operatingsystem_parameter_argc:=argc;
operatingsystem_parameter_argv:=argv;
if argv[0]<>nil then