123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2019 by Free Pascal development team
- This file implements parts of the startup code for OpenBSD
- shared object (.so) libraries.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- {$asmmode gas}
- {$ifdef VER3_0}
- procedure _init; external name '_init';
- {$else VER3_0}
- procedure _init; weakexternal name '_init';
- {$endif VER3_0}
- procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord); forward;
- procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
- asm
- movq %rbx,%r9
- movq %rcx,%r8
- movq %rdx,%rcx
- movq (%rsp),%rdi
- leaq 16(%rsp,%rdi,8),%rdx
- leaq 8(%rsp),%rsi
- subq $8,%rsp
- andq $0xFFFFFFFFFFFFFFF0,%rsp
- addq $8,%rsp
- jmp _FPC_proc___start
- end;
- procedure _FPC_proc_haltproc; forward;
- function _strrchr(str: PChar; character: LongInt): PChar; forward;
- procedure _FPC_proc___start(argc: LongInt; argv: PPChar; envp: Pointer; para1, para2, para3: QWord);
- var
- I: SizeUInt;
- begin
- environ:=envp;
- operatingsystem_parameter_envp:=envp;
- operatingsystem_parameter_argc:=argc;
- operatingsystem_parameter_argv:=argv;
- if argv[0]<>nil then
- begin
- __progname:=_strrchr(argv[0], Ord('/'));
- if __progname<>nil then
- Inc(__progname)
- else
- __progname:=argv[0];
- I:=Low(__progname_storage);
- while (I<High(__progname_storage)) and (__progname[I]<>#0) do
- begin
- __progname_storage[I]:=__progname[I-Low(__progname_storage)];
- Inc(I);
- end;
- __progname_storage[I]:=#0;
- __progname:=@__progname_storage;
- end;
- if Assigned(@_init) then
- _init;
- PascalMain;
- asm
- jmp _FPC_proc_haltproc@PLT
- end;
- end;
- procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
- asm
- movq $1,%rax
- movl operatingsystem_result(%rip),%ebx
- pushq %rbx
- call .Lactualsyscall
- addq $8,%rsp
- jmp _FPC_proc_haltproc
- .Lactualsyscall:
- int $0x80
- jb .LErrorcode
- xor %rbx,%rbx
- ret
- .LErrorcode:
- movq %rax,%rbx
- movq $-1,%rax
- end;
- function _strrchr(str: PChar; character: LongInt): PChar; public name '_strrchr';
- begin
- _strrchr:=nil;
- repeat
- if str^=Chr(character) then
- _strrchr:=str;
- if str^<>#0 then
- Inc(str);
- until str^=#0;
- end;
|