Merged aarch64-android, x86_64-android targets and fixes for the Android target.

Revision(s) 39739, 39749, 39860, 39862, 39865, 39869, 39871, 39903, 39905, 39917, 39956, 39959-39960, 39969, 39971, 39980, 39987, 40198-40201, 40472, 40532, 40535-40536 from trunk:
* Android: The list of supported syscalls has been auto-generated directly from android sources for each CPU.
* Minor adjustments to make all compilable with the proper list of Android syscalls.
........
* Re-generated lists of android syscalls by a new script. The lists are more correct now. The script's location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
........
* Fixed UnhookSignal when RTL_SIGDEFAULT is passed. The bug have caused crash on aarch64-android due to out of bounds read of the rtlsig2ossig[] array.
........
+ Added support for the aarch64-android target.
........
* Set ICU data dir if it is not set by the system. It fixes issues on newer Android versions.
* Added more predefined ICU versions.
........
* android: Use the current dir as temp.
........
* Corrected TUContext record for aarch64-linux and aarch64-android. It fixes obtaining of an address of the instruction where a signal has thrown.
........
* Enabled safecall support for aarch64 to be on par with other cpus.
........
* Android: Reworked the startup code to use no assembly instructions. Generic assembler startup files contains only section data and are compiled for each CPU.
* Android: argc and argv are correct for shared libraries.
........
* Use syscall_nr_renameat for android.
........
+ added support for x86_64-android target.
........
+ Added the auto-generated list syscalls for mips64-android. It will be needed when mips64 is supported.
........
* x86_64-android requires sigreturn for proper signal handling.
........
* Register external gas assembler for aarch64-android and x86_64-android.
........
* Enabled compilation of the cpu unit for arm-android and x86_64-android.
........
* ucnv_open() must be called with some SSE exception masked on x86_64-android.
* Call u_init() during initialization.
........
* Create the ".note.gnu.build-id" section for android. It fixes debugging of shared libs in Android Studio.
........
* android: Removed cwstring from the uses clause of the unix unit. Use cwstring indirectly. It allows to avoid using cwstring if needed.
........
* ICU v3.8 on Android 1.5-2.1 is buggy and can't be unloaded properly.
........
* Fixed locale detection on new Android versions.
........
* Fixed obtaining a time zone information for 64-bit android.
........
* Since Android 8 the net.dnsX properties can't be read. Use Google Public DNS servers.

........
* android: Use libc for sockets since the "accept" syscall is blocked by SECCOMP, but the "accept4" alternative is not available on old Android versions (2.3 and older). 
........
* android: Regenerated syscalls.
........
* android: Disabled usage of the "pselect6" and "ppoll" syscalls for arm-android. These syscalls are not available on old Android versions (2.3 or older).
........

git-svn-id: branches/fixes_3_2@40540 -
This commit is contained in:
yury 2018-12-13 18:08:42 +00:00
parent 1f921d4ac0
commit 0654857ce1
50 changed files with 2427 additions and 1885 deletions

12
.gitattributes vendored
View File

@ -7354,7 +7354,6 @@ packages/rtl-extra/src/amiga/printer.pp svneol=native#text/plain
packages/rtl-extra/src/amiga/sockets.pp svneol=native#text/plain
packages/rtl-extra/src/android/clocale.pp svneol=native#text/plain
packages/rtl-extra/src/android/osdefs.inc svneol=native#text/plain
packages/rtl-extra/src/android/unixsock.inc svneol=native#text/plain
packages/rtl-extra/src/android/unxsockh.inc svneol=native#text/plain
packages/rtl-extra/src/aros/sockets.pp svneol=native#text/plain
packages/rtl-extra/src/beos/osdefs.inc svneol=native#text/plain
@ -8715,13 +8714,11 @@ rtl/amiga/system.pp svneol=native#text/plain
rtl/amiga/timerd.inc svneol=native#text/plain
rtl/android/Makefile svneol=native#text/plain
rtl/android/Makefile.fpc svneol=native#text/plain
rtl/android/arm/dllprt0.as svneol=native#text/plain
rtl/android/arm/prt0.as svneol=native#text/plain
rtl/android/aarch64/sysnr.inc svneol=native#text/plain
rtl/android/arm/sysnr.inc svneol=native#text/plain
rtl/android/cwstring.pp svneol=native#text/plain
rtl/android/dlandroid.inc svneol=native#text/plain
rtl/android/i386/dllprt0.as svneol=native#text/plain
rtl/android/i386/prt0.as svneol=native#text/plain
rtl/android/dllprt0.as svneol=native#text/plain
rtl/android/i386/sysnr.inc svneol=native#text/plain
rtl/android/jvm/Makefile svneol=native#text/plain
rtl/android/jvm/Makefile.fpc svneol=native#text/plain
@ -8730,12 +8727,13 @@ rtl/android/jvm/androidr14.pas svneol=native#text/plain
rtl/android/jvm/java_sys_android.inc svneol=native#text/plain
rtl/android/jvm/java_sysh_android.inc svneol=native#text/plain
rtl/android/jvm/rtl.cfg svneol=native#text/plain
rtl/android/mipsel/dllprt0.as svneol=native#text/plain
rtl/android/mipsel/prt0.as svneol=native#text/plain
rtl/android/mips64/sysnr.inc svneol=native#text/plain
rtl/android/mipsel/sysnr.inc svneol=native#text/plain
rtl/android/prt0.as svneol=native#text/plain
rtl/android/sysandroid.inc svneol=native#text/plain
rtl/android/sysandroidh.inc svneol=native#text/plain
rtl/android/unixandroid.inc svneol=native#text/plain
rtl/android/x86_64/sysnr.inc svneol=native#text/plain
rtl/arm/arm.inc svneol=native#text/plain
rtl/arm/armdefines.inc svneol=native#text/plain
rtl/arm/cpu.pp svneol=native#text/pascal

View File

@ -274,7 +274,7 @@ unit agcpugas;
idtxt : 'AS';
asmbin : 'as';
asmcmd : '-o $OBJ $EXTRAOPT $ASM';
supported_targets : [system_aarch64_linux];
supported_targets : [system_aarch64_linux,system_aarch64_android];
flags : [af_needar,af_smartlink_sections];
labelprefix : '.L';
comment : '// ';

View File

@ -41,6 +41,9 @@ implementation
{$ifndef NOTARGETBSD}
,t_bsd
{$endif}
{$ifndef NOTARGETANDROID}
,t_android
{$endif}
{**************************************
Assemblers

View File

@ -271,6 +271,7 @@
{$define cputargethasfixedstack}
{$define cpurefshaveindexreg}
{$define SUPPORT_GET_FRAME}
{$define SUPPORT_SAFECALL}
{$endif aarch64}
{$IFDEF MACOS}

View File

@ -3722,16 +3722,15 @@ begin
if not UpdateTargetSwitchStr('FARPROCSPUSHODDBP', init_settings.targetswitches, true) then
InternalError(2013092801);
{ Set up a default prefix for binutils when cross-compiling }
if source_info.system<>target_info.system then
{ Use standard Android NDK prefixes when cross-compiling }
if (source_info.system<>target_info.system) and (target_info.system in systems_android) then
case target_info.system of
{ Use standard Android NDK prefixes }
system_arm_android:
utilsprefix:='arm-linux-androideabi-';
system_i386_android:
utilsprefix:='i686-linux-android-';
system_mipsel_android:
utilsprefix:='mipsel-linux-android-';
else
utilsprefix:=target_cpu_string + '-linux-android-';
end;
{ Set up default value for the heap }

View File

@ -179,7 +179,13 @@
system_wasm_wasm32, { 92 }
system_sparc64_linux, { 93 }
system_sparc64_solaris, { 94 }
system_arm_netbsd { 95 }
system_arm_netbsd, { 95 }
system_riscv32_linux, { 96 }
system_riscv64_linux, { 97 }
system_riscv64_embedded, { 98 }
system_riscv32_embedded, { 99 }
system_aarch64_android, { 100 }
system_x86_64_android { 101 }
);
type

View File

@ -229,7 +229,7 @@ interface
system_any = system_none;
systems_wince = [system_arm_wince,system_i386_wince];
systems_android = [system_arm_android, system_i386_android, system_mipsel_android];
systems_android = [system_arm_android, system_aarch64_android, system_i386_android, system_x86_64_android, system_mipsel_android];
systems_linux = [system_i386_linux,system_x86_64_linux,system_powerpc_linux,system_powerpc64_linux,
system_arm_linux,system_sparc_linux,system_sparc64_linux,system_m68k_linux,
system_x86_6432_linux,system_mipseb_linux,system_mipsel_linux,system_aarch64_linux];
@ -906,6 +906,10 @@ begin
default_target(system_powerpc_aix);
{$define default_target_set}
{$endif}
{$ifdef android}
{$define default_target_set}
default_target(system_x86_64_android);
{$endif}
{$ifndef default_target_set}
default_target(system_powerpc_linux);
{$endif default_target_set}
@ -1026,6 +1030,10 @@ begin
{$define default_target_set}
default_target(system_aarch64_darwin);
{$endif darwin}
{$ifdef android}
{$define default_target_set}
default_target(system_aarch64_android);
{$endif android}
{$ifndef default_target_set}
default_target(system_aarch64_linux);
{$define default_target_set}

View File

@ -161,6 +161,138 @@ unit i_android;
llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128';
);
system_aarch64_android_info : tsysteminfo =
(
system : system_aarch64_android;
name : 'Android for AArch64';
shortname : 'Android';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,
tf_requires_proper_alignment, tf_safecall_exceptions,
tf_pic_uses_got, tf_pic_default,
tf_smartlink_sections,tf_has_winlike_resources];
cpu : cpu_aarch64;
unit_env : 'ANDROIDUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
importlibprefix : 'libimp';
importlibext : '.a';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_gas;
assemextern : as_gas;
link : ld_none;
linkextern : ld_android;
ar : ar_gnu_ar;
res : res_elf;
dbg : dbg_dwarf2;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 8;
loopalign : 4;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 16;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 16
);
first_parm_offset : 16;
stacksize : 8*1024*1024;
stackalign : 16;
abi : abi_default;
llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n32:64-S128'
);
system_x86_64_android_info : tsysteminfo =
(
system : system_x86_64_android;
name : 'Android for x86-64';
shortname : 'Android';
flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,
tf_needs_dwarf_cfi,tf_has_winlike_resources,
{tf_pic_uses_got,} tf_pic_default, tf_smartlink_sections,
tf_safecall_exceptions, tf_safecall_clearstack];
cpu : cpu_x86_64;
unit_env : 'ANDROIDUNITS';
extradefines : 'UNIX;HASUNIX';
exeext : '';
defext : '.def';
scriptext : '.sh';
smartext : '.sl';
unitext : '.ppu';
unitlibext : '.ppl';
asmext : '.s';
objext : '.o';
resext : '.res';
resobjext : '.or';
sharedlibext : '.so';
staticlibext : '.a';
staticlibprefix : 'libp';
sharedlibprefix : 'lib';
sharedClibext : '.so';
staticClibext : '.a';
staticClibprefix : 'lib';
sharedClibprefix : 'lib';
importlibprefix : 'libimp';
importlibext : '.a';
Cprefix : '';
newline : #10;
dirsep : '/';
assem : as_x86_64_elf64;
assemextern : as_gas;
link : ld_none;
linkextern : ld_android;
ar : ar_gnu_ar;
res : res_elf;
dbg : dbg_dwarf2;
script : script_unix;
endian : endian_little;
alignment :
(
procalign : 16;
loopalign : 8;
jumpalign : 0;
constalignmin : 0;
constalignmax : 8;
varalignmin : 0;
varalignmax : 16;
localalignmin : 4;
localalignmax : 16;
recordalignmin : 0;
recordalignmax : 16;
maxCrecordalign : 16
);
first_parm_offset : 16;
stacksize : 8*1024*1024;
stackalign : 16;
abi : abi_default;
llvmdatalayout : 'e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128';
);
system_mipsel_android_info : tsysteminfo =
(
system : system_mipsel_android;
@ -234,11 +366,21 @@ initialization
set_source_info(system_i386_android_info);
{$endif}
{$endif CPUI386}
{$ifdef CPUX86_64}
{$ifdef android}
set_source_info(system_x86_64_android_info);
{$endif}
{$endif CPUX86_64}
{$ifdef CPUARM}
{$ifdef android}
set_source_info(system_arm_android_info);
{$endif android}
{$endif CPUARM}
{$ifdef CPUAARCH64}
{$ifdef android}
set_source_info(system_aarch64_android_info);
{$endif android}
{$endif CPUAARCH64}
{$ifdef CPUMIPSEL}
{$ifdef android}
set_source_info(system_mipsel_android_info);

View File

@ -168,14 +168,18 @@ begin
with Info do
begin
{ Specify correct max-page-size and common-page-size to prevent big gaps between sections in resulting executable }
s:='ld -z max-page-size=0x1000 -z common-page-size=0x1000 -z noexecstack -z now $OPT -L. -T $RES -o $EXE';
ExeCmd[1]:=s + ' --entry=_fpc_start';
s:='ld -z max-page-size=0x1000 -z common-page-size=0x1000 -z noexecstack -z now --build-id $OPT -L. -T $RES -o $EXE';
ExeCmd[1]:=s + ' --entry=_start';
DllCmd[1]:=s + ' -shared -soname $SONAME';
DllCmd[2]:='strip --strip-unneeded $EXE';
ExtDbgCmd[1]:='objcopy --only-keep-debug $EXE $DBG';
ExtDbgCmd[2]:='objcopy --add-gnu-debuglink=$DBG $EXE';
ExtDbgCmd[3]:='strip --strip-unneeded $EXE';
{$ifdef cpu64bitalu}
DynamicLinker:='/system/bin/linker64';
{$else}
DynamicLinker:='/system/bin/linker';
{$endif cpu64bitalu}
end;
end;
@ -486,11 +490,21 @@ initialization
RegisterExport(system_arm_android,texportlibandroid);
RegisterTarget(system_arm_android_info);
{$endif ARM}
{$ifdef AARCH64}
RegisterImport(system_aarch64_android,timportlibandroid);
RegisterExport(system_aarch64_android,texportlibandroid);
RegisterTarget(system_aarch64_android_info);
{$endif AARCH64}
{$ifdef I386}
RegisterImport(system_i386_android,timportlibandroid);
RegisterExport(system_i386_android,texportlibandroid);
RegisterTarget(system_i386_android_info);
{$endif I386}
{$ifdef X86_64}
RegisterImport(system_x86_64_android,timportlibandroid);
RegisterExport(system_x86_64_android,texportlibandroid);
RegisterTarget(system_x86_64_android_info);
{$endif X86_64}
{$ifdef MIPSEL}
RegisterImport(system_mipsel_android,timportlibandroid);
RegisterExport(system_mipsel_android,texportlibandroid);

View File

@ -181,7 +181,13 @@ const
{ 92 } 'WebAssembly-wasm',
{ 93 } 'Linux-sparc64',
{ 94 } 'Solaris-sparc64',
{ 95 } 'NetBSD-arm'
{ 95 } 'NetBSD-arm',
{ 96 } 'Linux-RiscV32',
{ 97 } 'Linux-RiscV64',
{ 98 } 'Embedded-RiscV32',
{ 99 } 'Embedded-RiscV64',
{ 100 } 'Android-AArch64',
{ 101 } 'Android-x86-64'
);
const

View File

@ -382,7 +382,8 @@ interface
supported_targets : [system_x86_64_linux,system_x86_64_freebsd,
system_x86_64_win64,system_x86_64_embedded,
system_x86_64_openbsd,system_x86_64_netbsd,
system_x86_64_dragonfly,system_x86_64_aros];
system_x86_64_dragonfly,system_x86_64_aros,
system_x86_64_android];
flags : [af_needar,af_smartlink_sections,af_supports_dwarf];
labelprefix : '.L';
comment : '# ';

View File

@ -677,7 +677,7 @@ implementation
supported_targets : [system_x86_64_linux,system_x86_64_freebsd,
system_x86_64_openbsd,system_x86_64_netbsd,
system_x86_64_dragonfly,system_x86_64_solaris,
system_x86_64_aros];
system_x86_64_aros,system_x86_64_android];
flags : [af_outputbinary,af_smartlink_sections,af_supports_dwarf];
labelprefix : '.L';
comment : '';

View File

@ -57,6 +57,9 @@ implementation
{$ifndef NOTARGETEMBEDDED}
,t_embed
{$endif}
{$ifndef NOTARGETANDROID}
,t_android
{$endif}
{**************************************
Assemblers

View File

@ -478,6 +478,17 @@ var
s: string;
H : THostAddr;
begin
if SystemApiLevel >= 26 then
begin
// Since Android 8 the net.dnsX properties can't be read.
// Use Google Public DNS servers
Result:=2;
SetLength(DNSServers, Result);
DNSServers[0]:=StrToNetAddr('8.8.8.8');
DNSServers[1]:=StrToNetAddr('8.8.4.4');
exit;
end;
Result:=0;
SetLength(DNSServers, 9);
for i:=1 to 9 do
@ -504,6 +515,13 @@ var
begin
if not CheckResolveFileAge then
exit;
if (Length(DNSServers) = 0) and (SystemApiLevel >= 26) then
begin
GetDNSServers;
exit;
end;
n:=GetSystemProperty('net.change');
if n <> '' then
v:=GetSystemProperty(PAnsiChar(n))

View File

@ -218,7 +218,7 @@ Const
{ iphonesim}( false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false),
{ aix } ( false, false, false, true, false, false, false, true, false, false, false, false, false, false, false, false),
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false),
{ android } ( false, true, false, false, false, false, true, false, false, false, false, true, true , false, false, false),
{ android } ( false, true, false, false, false, true, true, false, false, false, false, true, true , false, true, false),
{ nativent }( false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false),
{ wii } ( false, false, false, true , false, false, false, false, false, false, false, false, false, false, false, false),

View File

@ -64,11 +64,12 @@ var
unum_close: procedure (fmt: UNumberFormat); cdecl;
unum_getSymbol: function (fmt: UNumberFormat; symbol: UNumberFormatSymbol; result: PUnicodeChar; resultLength: int32_t; var status: UErrorCode): int32_t; cdecl;
function GetIcuProc(const Name: AnsiString; out ProcPtr; libId: longint = 0): boolean; external name 'CWSTRING_GET_ICU_PROC';
GetIcuProc: function (const Name: AnsiString; var ProcPtr; libId: longint): boolean; external name 'ANDROID_GET_ICU_PROC';
procedure InitIcuFunctions;
begin
if FunctionsInited then exit;
if not Assigned(GetIcuProc) then exit;
if not GetIcuProc('udat_open', udat_open, 1) then exit;
if not GetIcuProc('udat_close', udat_close, 1) then exit;
if not GetIcuProc('udat_toPattern', udat_toPattern, 1) then exit;
@ -87,6 +88,9 @@ function GetCurrentLocaleStr: utf8string;
var
s: utf8string;
begin
Result:=GetSystemProperty('persist.sys.locale');
if Result <> '' then
exit;
Result:=GetSystemProperty('persist.sys.language');
if Result = '' then
exit;

View File

@ -1,239 +0,0 @@
{
This file is part of the Free Pascal run time library.
(c) 2004 by Marco van de Voort
member of the Free Pascal development team.
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
socket call implementations for Linux
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.
}
{$if defined(cpu386)}
{$define NEED_SOCKETCALL}
{$endif}
{******************************************************************************
Basic Socket Functions
******************************************************************************}
{$ifdef NEED_SOCKETCALL}
Const
{
Arguments to the Linux Kernel system call for sockets. All
Socket Connected calls go through the same system call,
with an extra argument to determine what action to take.
}
Socket_Sys_SOCKET = 1;
Socket_Sys_BIND = 2;
Socket_Sys_CONNECT = 3;
Socket_Sys_LISTEN = 4;
Socket_Sys_ACCEPT = 5;
Socket_Sys_GETSOCKNAME = 6;
Socket_Sys_GETPEERNAME = 7;
Socket_Sys_SOCKETPAIR = 8;
Socket_Sys_SEND = 9;
Socket_Sys_RECV = 10;
Socket_Sys_SENDTO = 11;
Socket_Sys_RECVFROM = 12;
Socket_Sys_SHUTDOWN = 13;
Socket_Sys_SETSOCKOPT = 14;
Socket_Sys_GETSOCKOPT = 15;
Socket_Sys_SENDMSG = 16;
Socket_Sys_RECVMSG = 17;
Function SocketCall(SockCallNr,a1,a2,a3,a4,a5,a6:TSysParam):cint; inline;
var
Args:array[1..6] of TSysParam;
begin
args[1]:=a1;
args[2]:=a2;
args[3]:=a3;
args[4]:=a4;
args[5]:=a5;
args[6]:=a6;
SocketCall:=do_Syscall(syscall_nr_socketcall,sockcallnr,TSysParam(@args));
internal_socketerror:=fpgeterrno;
end;
function SocketCall(SockCallNr,a1,a2,a3:TSysParam):cint;inline;
begin
SocketCall:=SocketCall(SockCallNr,a1,a2,a3,0,0,0);
end;
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
begin
fpSocket:=SocketCall(Socket_Sys_socket,Domain,xtype,Protocol);
end;
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
begin
fpSend:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,0,0);
end;
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
begin
fpSendto:=SocketCall(Socket_Sys_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
end;
function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
begin
fpRecv:=SocketCall(Socket_Sys_Recvfrom,S,tsysparam(buf),len,flags,0,0);
end;
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
begin
fpRecvFrom:=SocketCall(Socket_Sys_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
end;
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
begin
fpBind:=SocketCall(Socket_Sys_Bind,S,TSysParam(addrx),addrlen);
end;
function fplisten (s:cint; backlog : cint):cint;
begin
fpListen:=SocketCall(Socket_Sys_Listen,S,backlog,0);
end;
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
fpAccept:=SocketCall(Socket_Sys_accept,S,TSysParam(addrx),TSysParam(addrlen));
end;
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
begin
fpConnect:=SocketCall(Socket_Sys_connect,S,TSysParam(name),namelen);
end;
function fpshutdown (s:cint; how:cint):cint;
begin
fpShutDown:=SocketCall(Socket_Sys_shutdown,S,how,0);
end;
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetSockName:=SocketCall(Socket_Sys_GetSockName,S,TSysParam(name),TSysParam(namelen));
end;
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetPeerName:=SocketCall(Socket_Sys_GetPeerName,S,TSysParam(name),TSysParam(namelen));
end;
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
begin
fpSetSockOpt:=SocketCall(Socket_Sys_SetSockOpt,S,level,optname,TSysParam(optval),optlen,0);
end;
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
begin
fpGetSockOpt:=SocketCall(Socket_Sys_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen),0);
end;
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
begin
fpSocketPair:=SocketCall(Socket_Sys_SocketPair,d,xtype,protocol,TSysParam(sv),0,0);
end;
{$else NEED_SOCKETCALL}
function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
begin
fpSocket:=do_syscall(syscall_nr_socket,Domain,xtype,Protocol);
internal_socketerror:=fpgeterrno;
end;
function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
begin
fpSend:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,0,0);
internal_socketerror:=fpgeterrno;
end;
function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
begin
fpSendto:=do_syscall(syscall_nr_sendto,S,TSysParam(msg),Len,Flags,TSysParam(tox),tolen);
internal_socketerror:=fpgeterrno;
end;
function fprecv (s:cint; buf: pointer; len: size_t; flags:cint):ssize_t;
begin
fpRecv:=do_syscall(syscall_nr_Recvfrom,S,tsysparam(buf),len,flags,0,0);
internal_socketerror:=fpgeterrno;
end;
function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
begin
fpRecvFrom:=do_syscall(syscall_nr_Recvfrom,S,TSysParam(buf),len,flags,TSysParam(from),TSysParam(fromlen));
internal_socketerror:=fpgeterrno;
end;
function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
begin
fpBind:=do_syscall(syscall_nr_Bind,S,TSysParam(addrx),addrlen);
internal_socketerror:=fpgeterrno;
end;
function fplisten (s:cint; backlog : cint):cint;
begin
fpListen:=do_syscall(syscall_nr_Listen,S,backlog);
internal_socketerror:=fpgeterrno;
end;
function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
begin
fpAccept:=do_syscall(syscall_nr_accept,S,TSysParam(addrx),TSysParam(addrlen));
internal_socketerror:=fpgeterrno;
end;
function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
begin
fpConnect:=do_syscall(syscall_nr_connect,S,TSysParam(name),namelen);
internal_socketerror:=fpgeterrno;
end;
function fpshutdown (s:cint; how:cint):cint;
begin
fpShutDown:=do_syscall(syscall_nr_shutdown,S,how);
internal_socketerror:=fpgeterrno;
end;
function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetSockName:=do_syscall(syscall_nr_GetSockName,S,TSysParam(name),TSysParam(namelen));
internal_socketerror:=fpgeterrno;
end;
function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
begin
fpGetPeerName:=do_syscall(syscall_nr_GetPeerName,S,TSysParam(name),TSysParam(namelen));
internal_socketerror:=fpgeterrno;
end;
function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : tsocklen):cint;
begin
fpSetSockOpt:=do_syscall(syscall_nr_SetSockOpt,S,level,optname,TSysParam(optval),optlen);
internal_socketerror:=fpgeterrno;
end;
function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
begin
fpGetSockOpt:=do_syscall(syscall_nr_GetSockOpt,S,level,TSysParam(optname),TSysParam(optval),TSysParam(optlen));
internal_socketerror:=fpgeterrno;
end;
function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
begin
fpSocketPair:=do_syscall(syscall_nr_SocketPair,d,xtype,protocol,TSysParam(sv));
internal_socketerror:=fpgeterrno;
end;
{$endif NEED_do_syscall}

View File

@ -13,6 +13,10 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{ Use libc for sockets since the "accept" syscall is blocked by SECCOMP,
but the "accept4" alternative is not available on old Android versions (2.3 and older). }
{$define FPC_USE_LIBC}
Const
{* Supported address families. *}
AF_UNSPEC = 0;

View File

@ -39,7 +39,9 @@ dirs_wii=wii
dirs_aix=aix
dirs_java=java
dirs_i386_android=android
dirs_x86_64_android=android
dirs_arm_android=android
dirs_aarch64_android=android
dirs_mipsel_android=android
dirs_jvm_android=android/jvm
dirs_msdos=msdos

View File

@ -345,8 +345,11 @@ UNITPREFIX=rtl
CPU_UNITS=
SYSINIT_UNITS=
LOADERS=prt0 dllprt0
ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
CPU_UNITS=cpu
endif
ifeq ($(ARCH),i386)
CPU_UNITS=cpu mmx
CPU_UNITS+=mmx
endif
SYSTEMUNIT=system
ifdef RELEASE
@ -3634,10 +3637,15 @@ endif
ifeq ($(ARCH),mipsel)
ASTARGET=-mips32 -KPIC
endif
prt0$(OEXT) : $(ARCH)/prt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)prt0$(OEXT) $(ARCH)/prt0.as
dllprt0$(OEXT) : $(ARCH)/dllprt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(ARCH)/dllprt0.as
ifneq ($(findstring $(ARCH),aarch64 x86_64),)
CPUBITS=64
else
CPUBITS=32
endif
prt0$(OEXT) : prt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)prt0$(OEXT) --defsym CPU$(CPUBITS)=1 prt0.as
dllprt0$(OEXT) : dllprt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) --defsym CPU$(CPUBITS)=1 dllprt0.as
$(SYSTEMUNIT)$(PPUEXT) : $(LINUXINC)/$(SYSTEMUNIT).pp $(SYSDEPS)
$(COMPILER) $(FPC_SYSTEM_OPT) -Us -Sg $(LINUXINC)/$(SYSTEMUNIT).pp
uuchar$(PPUEXT): $(SYSTEMUNIT)$(PPUEXT) $(INC)/uuchar.pp

View File

@ -65,8 +65,11 @@ SYSINIT_UNITS=
LOADERS=prt0 dllprt0
ifeq ($(findstring $(ARCH),i386 x86_64 arm),$(ARCH))
CPU_UNITS=cpu
endif
ifeq ($(ARCH),i386)
CPU_UNITS=cpu mmx
CPU_UNITS+=mmx
endif
SYSTEMUNIT=system
@ -107,16 +110,21 @@ ifeq ($(ARCH),mipsel)
ASTARGET=-mips32 -KPIC
endif
ifneq ($(findstring $(ARCH),aarch64 x86_64),)
CPUBITS=64
else
CPUBITS=32
endif
#
# Loaders
#
prt0$(OEXT) : $(ARCH)/prt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)prt0$(OEXT) $(ARCH)/prt0.as
prt0$(OEXT) : prt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)prt0$(OEXT) --defsym CPU$(CPUBITS)=1 prt0.as
dllprt0$(OEXT) : $(ARCH)/dllprt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(ARCH)/dllprt0.as
dllprt0$(OEXT) : dllprt0.as
$(AS) $(ASTARGET) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) --defsym CPU$(CPUBITS)=1 dllprt0.as
#
# $(SYSTEMUNIT) Units ($(SYSTEMUNIT), Objpas, Strings)

View File

@ -0,0 +1,247 @@
// Available syscalls for arm64-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
syscall_nr_io_setup = 0;
syscall_nr_io_destroy = 1;
syscall_nr_io_submit = 2;
syscall_nr_io_cancel = 3;
syscall_nr_io_getevents = 4;
syscall_nr_setxattr = 5;
syscall_nr_lsetxattr = 6;
syscall_nr_fsetxattr = 7;
syscall_nr_getxattr = 8;
syscall_nr_lgetxattr = 9;
syscall_nr_fgetxattr = 10;
syscall_nr_listxattr = 11;
syscall_nr_llistxattr = 12;
syscall_nr_flistxattr = 13;
syscall_nr_removexattr = 14;
syscall_nr_lremovexattr = 15;
syscall_nr_fremovexattr = 16;
syscall_nr_getcwd = 17;
syscall_nr_eventfd2 = 19;
syscall_nr_eventfd = syscall_nr_eventfd2;
syscall_nr_epoll_create1 = 20;
syscall_nr_epoll_ctl = 21;
syscall_nr_epoll_pwait = 22;
syscall_nr_dup = 23;
syscall_nr_dup3 = 24;
syscall_nr_fcntl = 25;
syscall_nr_inotify_init1 = 26;
syscall_nr_inotify_add_watch = 27;
syscall_nr_inotify_rm_watch = 28;
syscall_nr_ioctl = 29;
syscall_nr_ioprio_set = 30;
syscall_nr_ioprio_get = 31;
syscall_nr_flock = 32;
syscall_nr_mknodat = 33;
syscall_nr_mkdirat = 34;
syscall_nr_unlinkat = 35;
syscall_nr_symlinkat = 36;
syscall_nr_linkat = 37;
syscall_nr_renameat = 38;
syscall_nr_pivot_root = 41;
syscall_nr_statfs = 43;
syscall_nr_fstatfs = 44;
syscall_nr_truncate = 45;
syscall_nr_ftruncate = 46;
syscall_nr_ftruncate64 = syscall_nr_ftruncate;
syscall_nr_fallocate = 47;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_faccessat = 48;
syscall_nr_chdir = 49;
syscall_nr_fchdir = 50;
syscall_nr_fchmod = 52;
syscall_nr_fchmodat = 53;
syscall_nr_fchownat = 54;
syscall_nr_fchown = 55;
syscall_nr_openat = 56;
syscall_nr_close = 57;
syscall_nr_pipe2 = 59;
syscall_nr_quotactl = 60;
syscall_nr_getdents64 = 61;
syscall_nr_lseek = 62;
syscall_nr_read = 63;
syscall_nr_write = 64;
syscall_nr_readv = 65;
syscall_nr_writev = 66;
syscall_nr_pread64 = 67;
syscall_nr_pwrite64 = 68;
syscall_nr_preadv = 69;
syscall_nr_pwritev = 70;
syscall_nr_sendfile = 71;
syscall_nr_pselect6 = 72;
syscall_nr_ppoll = 73;
syscall_nr_signalfd4 = 74;
syscall_nr_vmsplice = 75;
syscall_nr_splice = 76;
syscall_nr_tee = 77;
syscall_nr_readlinkat = 78;
syscall_nr_newfstatat = 79;
syscall_nr_fstatat = syscall_nr_newfstatat;
syscall_nr_fstatat64 = syscall_nr_newfstatat;
syscall_nr_fstat = 80;
syscall_nr_fstat64 = syscall_nr_fstat;
syscall_nr_sync = 81;
syscall_nr_fsync = 82;
syscall_nr_fdatasync = 83;
syscall_nr_sync_file_range = 84;
syscall_nr_timerfd_create = 85;
syscall_nr_timerfd_settime = 86;
syscall_nr_timerfd_gettime = 87;
syscall_nr_utimensat = 88;
syscall_nr_capget = 90;
syscall_nr_capset = 91;
syscall_nr_personality = 92;
syscall_nr_exit = 93;
syscall_nr_exit_group = 94;
syscall_nr_waitid = 95;
syscall_nr_set_tid_address = 96;
syscall_nr_unshare = 97;
syscall_nr_futex = 98;
syscall_nr_nanosleep = 101;
syscall_nr_getitimer = 102;
syscall_nr_setitimer = 103;
syscall_nr_timer_create = 107;
syscall_nr_timer_gettime = 108;
syscall_nr_timer_getoverrun = 109;
syscall_nr_timer_settime = 110;
syscall_nr_timer_delete = 111;
syscall_nr_clock_gettime = 113;
syscall_nr_clock_getres = 114;
syscall_nr_clock_nanosleep = 115;
syscall_nr_ptrace = 117;
syscall_nr_sched_setparam = 118;
syscall_nr_sched_setscheduler = 119;
syscall_nr_sched_getscheduler = 120;
syscall_nr_sched_getparam = 121;
syscall_nr_sched_setaffinity = 122;
syscall_nr_sched_getaffinity = 123;
syscall_nr_sched_yield = 124;
syscall_nr_sched_get_priority_max = 125;
syscall_nr_sched_get_priority_min = 126;
syscall_nr_sched_rr_get_interval = 127;
syscall_nr_restart_syscall = 128;
syscall_nr_kill = 129;
syscall_nr_tkill = 130;
syscall_nr_tgkill = 131;
syscall_nr_sigaltstack = 132;
syscall_nr_rt_sigsuspend = 133;
syscall_nr_rt_sigaction = 134;
syscall_nr_rt_sigprocmask = 135;
syscall_nr_rt_sigpending = 136;
syscall_nr_rt_sigtimedwait = 137;
syscall_nr_rt_sigqueueinfo = 138;
syscall_nr_rt_sigreturn = 139;
syscall_nr_setpriority = 140;
syscall_nr_getpriority = 141;
syscall_nr_setregid = 143;
syscall_nr_setresuid = 147;
syscall_nr_getresuid = 148;
syscall_nr_getresgid = 150;
syscall_nr_times = 153;
syscall_nr_setpgid = 154;
syscall_nr_getpgid = 155;
syscall_nr_getsid = 156;
syscall_nr_setsid = 157;
syscall_nr_getgroups = 158;
syscall_nr_uname = 160;
syscall_nr_getrlimit = 163;
syscall_nr_setrlimit = 164;
syscall_nr_getrusage = 165;
syscall_nr_umask = 166;
syscall_nr_prctl = 167;
syscall_nr_getcpu = 168;
syscall_nr_gettimeofday = 169;
syscall_nr_getpid = 172;
syscall_nr_getppid = 173;
syscall_nr_getuid = 174;
syscall_nr_geteuid = 175;
syscall_nr_getgid = 176;
syscall_nr_getegid = 177;
syscall_nr_gettid = 178;
syscall_nr_sysinfo = 179;
syscall_nr_socket = 198;
syscall_nr_socketpair = 199;
syscall_nr_bind = 200;
syscall_nr_listen = 201;
syscall_nr_connect = 203;
syscall_nr_getsockname = 204;
syscall_nr_getpeername = 205;
syscall_nr_sendto = 206;
syscall_nr_recvfrom = 207;
syscall_nr_setsockopt = 208;
syscall_nr_getsockopt = 209;
syscall_nr_shutdown = 210;
syscall_nr_sendmsg = 211;
syscall_nr_recvmsg = 212;
syscall_nr_readahead = 213;
syscall_nr_brk = 214;
syscall_nr_munmap = 215;
syscall_nr_mremap = 216;
syscall_nr_clone = 220;
syscall_nr_execve = 221;
syscall_nr_mmap = 222;
syscall_nr_mmap64 = syscall_nr_mmap;
syscall_nr_fadvise64 = 223;
syscall_nr_mprotect = 226;
syscall_nr_msync = 227;
syscall_nr_mlock = 228;
syscall_nr_munlock = 229;
syscall_nr_mlockall = 230;
syscall_nr_munlockall = 231;
syscall_nr_mincore = 232;
syscall_nr_madvise = 233;
syscall_nr_rt_tgsigqueueinfo = 240;
syscall_nr_perf_event_open = 241;
syscall_nr_accept4 = 242;
syscall_nr_recvmmsg = 243;
syscall_nr_wait4 = 260;
syscall_nr_prlimit64 = 261;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 267;
syscall_nr_setns = 268;
syscall_nr_sendmmsg = 269;
syscall_nr_process_vm_readv = 270;
syscall_nr_process_vm_writev = 271;
syscall_nr_sched_setattr = 274;
syscall_nr_sched_getattr = 275;
syscall_nr_renameat2 = 276;
syscall_nr_seccomp = 277;
syscall_nr_getrandom = 278;
syscall_nr_memfd_create = 279;
syscall_nr_execveat = 281;
syscall_nr_mlock2 = 284;
syscall_nr_copy_file_range = 285;
syscall_nr_preadv2 = 286;
syscall_nr_pwritev2 = 287;
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_umount2 = 39 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_mount = 40 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 51 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 89 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 105 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 106 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 112 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_syslog = 116 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 116 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 142 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 144 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 145 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 146 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 149 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 151 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 152 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 159 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 161 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 162 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 170 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 171 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 224 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 225 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 266 deprecated 'This syscall is blocked on Android 8+';

View File

@ -1,98 +0,0 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2013 by Yury Sidorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Shared library startup code for Free Pascal. Android-ARM target.
#
.file "dllprt0.as"
.text
.globl FPC_SHARED_LIB_START
.type FPC_SHARED_LIB_START,#function
FPC_SHARED_LIB_START:
mov ip, sp
stmfd sp!,{fp, ip, lr, pc}
sub fp, ip, #4
/* Get GOT */
ldr r3,.L_GOT1
.LPIC1:
add r3,pc,r3
/* Save initial stackpointer */
ldr ip,.L__stkptr
ldr ip,[r3, ip]
str sp,[ip]
/* Get environment info from libc */
ldr ip,.Lenviron
ldr ip,[r3, ip]
ldr r0,[ip]
/* Check if environment is NULL */
cmp r0,#0
ldreq r0,.LEmptyEnv
ldreq r0,[r3, r0]
ldr ip,.Loperatingsystem_parameter_envp
ldr ip,[r3, ip]
str r0,[ip]
/* Call main */
bl FPC_LIB_MAIN_ANDROID
/* Call library init */
bl FPC_LIB_INIT_ANDROID
ldmea fp, {fp, sp, pc}
.L_GOT1:
.long _GLOBAL_OFFSET_TABLE_-.LPIC1-8
.L__stkptr:
.word __stkptr(GOT)
.Lenviron:
.word environ(GOT)
.LEmptyEnv:
.word EmptyEnv(GOT)
.Loperatingsystem_parameter_envp:
.word operatingsystem_parameter_envp(GOT)
/* --------------------------------------------------------- */
.globl _haltproc
.type _haltproc,#function
_haltproc:
.globl _haltproc_eabi
.type _haltproc_eabi,#function
_haltproc_eabi:
/* Simply call libc exit(). _haltproc has the same declaration as exit. */
bl exit
/* --------------------------------------------------------- */
.data
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
operatingsystem_parameter_argc:
.global operatingsystem_parameter_argc
.long 1
operatingsystem_parameter_argv:
.global operatingsystem_parameter_argv
.long EmptyCmdLine
EmptyCmdLine:
.long EmptyCmdStr
EmptyCmdStr:
.ascii "\0"
EmptyEnv:
.long 0
.long 0
.long 0
/* --------------------------------------------------------- */
.section .init_array, "aw"
.long FPC_SHARED_LIB_START

View File

@ -1,110 +0,0 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2013 by Yury Sidorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Program startup code for Free Pascal. Android-ARM target.
#
/* At this entry point, most registers' values are unspecified, except:
sp The stack contains the arguments and environment:
0(sp) argc
4(sp) argv[0]
...
(4*argc)(sp) NULL
(4*(argc+1))(sp) envp[0]
...
NULL
*/
/*
In our entry point we should save pointers to cmd line arguments
and environment vars, then pass control to libc startup code.
It will call "PASCALMAIN" via alias "main".
*/
.text
.globl _fpc_start
.type _fpc_start,#function
_fpc_start:
/* Get GOT */
ldr r3,.L_GOT1
.LPIC1:
add r3,pc,r3
/* Clear the frame pointer since this is the outermost frame. */
mov fp, #0
/* Save initial stackpointer */
ldr ip,.L__stkptr
ldr ip,[r3, ip]
str sp,[ip]
mov r0,sp
/* Pop argc off the stack and save a pointer to argv */
ldmia r0!, {r1}
ldr ip,.Loperatingsystem_parameter_argc
ldr ip,[r3, ip]
str r1,[ip]
ldr ip,.Loperatingsystem_parameter_argv
ldr ip,[r3, ip]
str r0,[ip]
/* calc envp */
add r1,r1,#1
add r1,r0,r1,LSL #2
ldr ip,.Loperatingsystem_parameter_envp
ldr ip,[r3, ip]
str r1,[ip]
/* Finally go to libc startup code. It will call "PASCALMAIN" via alias "main" */
ldr ip,.L_start
ldr ip,[r3, ip]
bx ip
.L_GOT1:
.long _GLOBAL_OFFSET_TABLE_-.LPIC1-8
.L__stkptr:
.word __stkptr(GOT)
.L_start:
.word _start(GOT)
.Loperatingsystem_parameter_argc:
.word operatingsystem_parameter_argc(GOT)
.Loperatingsystem_parameter_argv:
.word operatingsystem_parameter_argv(GOT)
.Loperatingsystem_parameter_envp:
.word operatingsystem_parameter_envp(GOT)
/* --------------------------------------------------------- */
.globl _haltproc
.type _haltproc,#function
_haltproc:
.globl _haltproc_eabi
.type _haltproc_eabi,#function
_haltproc_eabi:
/* Simply call libc exit(). _haltproc has the same declaration as exit. */
bl exit
/* --------------------------------------------------------- */
.data
/* Define a symbol for the first piece of initialized data. */
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
/* --------------------------------------------------------- */
.bss
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
.comm operatingsystem_parameter_argc,4
.comm operatingsystem_parameter_argv,4

View File

@ -1,217 +1,286 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2017 by Yuriy Sydorov,
member of the Free Pascal development team.
Syscall nrs for arm-android
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.
**********************************************************************}
// Available syscalls for arm-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
__NR_SYSCALL_BASE = 0;
syscall_nr_restart_syscall = 0;
syscall_nr_exit = 1;
syscall_nr_fork = 2;
syscall_nr_read = 3;
syscall_nr_write = 4;
syscall_nr_open = 5;
syscall_nr_close = 6;
syscall_nr_creat = 8;
syscall_nr_unlink = 10;
syscall_nr_execve = 11;
syscall_nr_chdir = 12;
syscall_nr_lseek = 19;
syscall_nr_getpid = 20;
syscall_nr_getuid = 24;
syscall_nr_ptrace = 26;
syscall_nr_access = 33;
syscall_nr_sync = 36;
syscall_nr_kill = 37;
syscall_nr_rename = 38;
syscall_nr_mkdir = 39;
syscall_nr_dup = 41;
syscall_nr_pipe = 42;
syscall_nr_times = 43;
syscall_nr_brk = 45;
syscall_nr_ioctl = 54;
syscall_nr_fcntl = 55;
syscall_nr_setpgid = 57;
syscall_nr_umask = 60;
syscall_nr_dup2 = 63;
syscall_nr_getppid = 64;
syscall_nr_setsid = 66;
syscall_nr_sigaction = 67;
syscall_nr_setrlimit = 75;
syscall_nr_getrusage = 77;
syscall_nr_gettimeofday = 78;
syscall_nr_readlink = 85;
syscall_nr_munmap = 91;
syscall_nr_truncate = 92;
syscall_nr_fchmod = 94;
syscall_nr_getpriority = 96;
syscall_nr_setpriority = 97;
syscall_nr_setitimer = 104;
syscall_nr_getitimer = 105;
syscall_nr_wait4 = 114;
syscall_nr_sysinfo = 116;
syscall_nr_fsync = 118;
syscall_nr_sigreturn = 119;
syscall_nr_clone = 120;
syscall_nr_uname = 122;
syscall_nr_mprotect = 125;
syscall_nr_quotactl = 131;
syscall_nr_getpgid = 132;
syscall_nr_fchdir = 133;
syscall_nr_personality = 136;
syscall_nr__llseek = 140;
syscall_nr_getdents = 141;
syscall_nr__newselect = 142;
syscall_nr_flock = 143;
syscall_nr_msync = 144;
syscall_nr_readv = 145;
syscall_nr_writev = 146;
syscall_nr_getsid = 147;
syscall_nr_fdatasync = 148;
syscall_nr_mlock = 150;
syscall_nr_munlock = 151;
syscall_nr_mlockall = 152;
syscall_nr_munlockall = 153;
syscall_nr_sched_setparam = 154;
syscall_nr_sched_getparam = 155;
syscall_nr_sched_setscheduler = 156;
syscall_nr_sched_getscheduler = 157;
syscall_nr_sched_yield = 158;
syscall_nr_sched_get_priority_max = 159;
syscall_nr_sched_get_priority_min = 160;
syscall_nr_sched_rr_get_interval = 161;
syscall_nr_nanosleep = 162;
syscall_nr_mremap = 163;
syscall_nr_poll = 168;
syscall_nr_prctl = 172;
syscall_nr_rt_sigreturn = 173;
syscall_nr_rt_sigaction = 174;
syscall_nr_rt_sigprocmask = 175;
syscall_nr_rt_sigpending = 176;
syscall_nr_rt_sigtimedwait = 177;
syscall_nr_rt_sigqueueinfo = 178;
syscall_nr_rt_sigsuspend = 179;
syscall_nr_pread64 = 180;
syscall_nr_pwrite64 = 181;
syscall_nr_getcwd = 183;
syscall_nr_capget = 184;
syscall_nr_capset = 185;
syscall_nr_sigaltstack = 186;
syscall_nr_sendfile = 187;
syscall_nr_vfork = 190;
syscall_nr_ugetrlimit = 191;
syscall_nr_getrlimit = syscall_nr_ugetrlimit;
syscall_nr_mmap2 = 192;
syscall_nr_truncate64 = 193;
syscall_nr_ftruncate64 = 194;
syscall_nr_stat64 = 195;
syscall_nr_lstat64 = 196;
syscall_nr_fstat64 = 197;
syscall_nr_fstat = syscall_nr_fstat64;
syscall_nr_getuid32 = 199;
syscall_nr_getgid32 = 200;
syscall_nr_getgid = syscall_nr_getgid32;
syscall_nr_geteuid32 = 201;
syscall_nr_geteuid = syscall_nr_geteuid32;
syscall_nr_getegid32 = 202;
syscall_nr_getegid = syscall_nr_getegid32;
syscall_nr_setregid32 = 204;
syscall_nr_setregid = syscall_nr_setregid32;
syscall_nr_getgroups32 = 205;
syscall_nr_getgroups = syscall_nr_getgroups32;
syscall_nr_fchown32 = 207;
syscall_nr_fchown = syscall_nr_fchown32;
syscall_nr_setresuid32 = 208;
syscall_nr_setresuid = syscall_nr_setresuid32;
syscall_nr_getresuid32 = 209;
syscall_nr_getresuid = syscall_nr_getresuid32;
syscall_nr_getresgid32 = 211;
syscall_nr_getresgid = syscall_nr_getresgid32;
syscall_nr_getdents64 = 217;
syscall_nr_mincore = 219;
syscall_nr_madvise = 220;
syscall_nr_fcntl64 = 221;
syscall_nr_gettid = 224;
syscall_nr_readahead = 225;
syscall_nr_setxattr = 226;
syscall_nr_lsetxattr = 227;
syscall_nr_fsetxattr = 228;
syscall_nr_getxattr = 229;
syscall_nr_lgetxattr = 230;
syscall_nr_fgetxattr = 231;
syscall_nr_listxattr = 232;
syscall_nr_llistxattr = 233;
syscall_nr_flistxattr = 234;
syscall_nr_removexattr = 235;
syscall_nr_lremovexattr = 236;
syscall_nr_fremovexattr = 237;
syscall_nr_tkill = 238;
syscall_nr_sendfile64 = 239;
syscall_nr_futex = 240;
syscall_nr_sched_setaffinity = 241;
syscall_nr_sched_getaffinity = 242;
syscall_nr_io_setup = 243;
syscall_nr_io_destroy = 244;
syscall_nr_io_getevents = 245;
syscall_nr_io_submit = 246;
syscall_nr_io_cancel = 247;
syscall_nr_exit_group = 248;
syscall_nr_epoll_create = 250;
syscall_nr_epoll_ctl = 251;
syscall_nr_epoll_wait = 252;
syscall_nr_remap_file_pages = 253;
syscall_nr_set_tid_address = 256;
syscall_nr_timer_create = 257;
syscall_nr_timer_settime = 258;
syscall_nr_timer_gettime = 259;
syscall_nr_timer_getoverrun = 260;
syscall_nr_timer_delete = 261;
syscall_nr_clock_gettime = 263;
syscall_nr_clock_getres = 264;
syscall_nr_clock_nanosleep = 265;
syscall_nr_statfs64 = 266;
syscall_nr_fstatfs64 = 267;
syscall_nr_tgkill = 268;
syscall_nr_arm_fadvise64_64 = 270;
syscall_nr_waitid = 280;
syscall_nr_socket = 281;
syscall_nr_bind = 282;
syscall_nr_connect = 283;
syscall_nr_listen = 284;
syscall_nr_getsockname = 286;
syscall_nr_getpeername = 287;
syscall_nr_socketpair = 288;
syscall_nr_sendto = 290;
syscall_nr_recvfrom = 292;
syscall_nr_shutdown = 293;
syscall_nr_setsockopt = 294;
syscall_nr_getsockopt = 295;
syscall_nr_sendmsg = 296;
syscall_nr_recvmsg = 297;
syscall_nr_inotify_init = 316;
syscall_nr_inotify_add_watch = 317;
syscall_nr_inotify_rm_watch = 318;
syscall_nr_openat = 322;
syscall_nr_mkdirat = 323;
syscall_nr_mknodat = 324;
syscall_nr_fchownat = 325;
syscall_nr_fstatat64 = 327;
syscall_nr_fstatat = syscall_nr_fstatat64;
syscall_nr_unlinkat = 328;
syscall_nr_renameat = 329;
syscall_nr_linkat = 330;
syscall_nr_symlinkat = 331;
syscall_nr_readlinkat = 332;
syscall_nr_fchmodat = 333;
syscall_nr_faccessat = 334;
syscall_nr_pselect6 = 335;
syscall_nr_ppoll = 336;
syscall_nr_unshare = 337;
syscall_nr_splice = 340;
syscall_nr_sync_file_range2 = 341;
syscall_nr_tee = 342;
syscall_nr_vmsplice = 343;
syscall_nr_getcpu = 345;
syscall_nr_epoll_pwait = 346;
syscall_nr_utimensat = 348;
syscall_nr_timerfd_create = 350;
syscall_nr_eventfd = 351;
syscall_nr_fallocate = 352;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_timerfd_settime = 353;
syscall_nr_timerfd_gettime = 354;
syscall_nr_signalfd4 = 355;
syscall_nr_eventfd2 = 356;
syscall_nr_epoll_create1 = 357;
syscall_nr_dup3 = 358;
syscall_nr_pipe2 = 359;
syscall_nr_inotify_init1 = 360;
syscall_nr_preadv = 361;
syscall_nr_pwritev = 362;
syscall_nr_rt_tgsigqueueinfo = 363;
syscall_nr_perf_event_open = 364;
syscall_nr_recvmmsg = 365;
syscall_nr_accept4 = 366;
syscall_nr_prlimit64 = 369;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 373;
syscall_nr_sendmmsg = 374;
syscall_nr_setns = 375;
syscall_nr_process_vm_readv = 376;
syscall_nr_process_vm_writev = 377;
syscall_nr_sched_setattr = 380;
syscall_nr_sched_getattr = 381;
syscall_nr_renameat2 = 382;
syscall_nr_seccomp = 383;
syscall_nr_getrandom = 384;
syscall_nr_memfd_create = 385;
syscall_nr_execveat = 387;
syscall_nr_mlock2 = 390;
syscall_nr_copy_file_range = 391;
syscall_nr_preadv2 = 392;
syscall_nr_pwritev2 = 393;
syscall_nr___ARM_NR_cacheflush = 983042;
syscall_nr_cacheflush = syscall_nr___ARM_NR_cacheflush;
syscall_nr___ARM_NR_set_tls = 983045;
syscall_nr_exit = (__NR_SYSCALL_BASE + 1);
syscall_nr_fork = (__NR_SYSCALL_BASE + 2);
syscall_nr_read = (__NR_SYSCALL_BASE + 3);
syscall_nr_write = (__NR_SYSCALL_BASE + 4);
syscall_nr_open = (__NR_SYSCALL_BASE + 5);
syscall_nr_close = (__NR_SYSCALL_BASE + 6);
syscall_nr_link = (__NR_SYSCALL_BASE + 9);
syscall_nr_unlink = (__NR_SYSCALL_BASE + 10);
syscall_nr_execve = (__NR_SYSCALL_BASE + 11);
syscall_nr_chdir = (__NR_SYSCALL_BASE + 12);
syscall_nr_mknod = (__NR_SYSCALL_BASE + 14);
syscall_nr_chmod = (__NR_SYSCALL_BASE + 15);
syscall_nr_lseek = (__NR_SYSCALL_BASE + 19);
syscall_nr_getpid = (__NR_SYSCALL_BASE + 20);
syscall_nr_mount = (__NR_SYSCALL_BASE + 21);
syscall_nr_ptrace = (__NR_SYSCALL_BASE + 26);
syscall_nr_pause = (__NR_SYSCALL_BASE + 29);
syscall_nr_access = (__NR_SYSCALL_BASE + 33);
syscall_nr_sync = (__NR_SYSCALL_BASE + 36);
syscall_nr_rename = (__NR_SYSCALL_BASE + 38);
syscall_nr_mkdir = (__NR_SYSCALL_BASE + 39);
syscall_nr_rmdir = (__NR_SYSCALL_BASE + 40);
syscall_nr_dup = (__NR_SYSCALL_BASE + 41);
syscall_nr_times = (__NR_SYSCALL_BASE + 43);
syscall_nr_brk = (__NR_SYSCALL_BASE + 45);
syscall_nr_acct = (__NR_SYSCALL_BASE + 51);
syscall_nr_umount2 = (__NR_SYSCALL_BASE + 52);
syscall_nr_ioctl = (__NR_SYSCALL_BASE + 54);
syscall_nr_fcntl = (__NR_SYSCALL_BASE + 55);
syscall_nr_setpgid = (__NR_SYSCALL_BASE + 57);
syscall_nr_umask = (__NR_SYSCALL_BASE + 60);
syscall_nr_chroot = (__NR_SYSCALL_BASE + 61);
syscall_nr_dup2 = (__NR_SYSCALL_BASE + 63);
syscall_nr_getppid = (__NR_SYSCALL_BASE + 64);
syscall_nr_setsid = (__NR_SYSCALL_BASE + 66);
syscall_nr_sigaction = (__NR_SYSCALL_BASE + 67);
syscall_nr_sigpending = (__NR_SYSCALL_BASE + 73);
syscall_nr_setrlimit = (__NR_SYSCALL_BASE + 75);
syscall_nr_getrusage = (__NR_SYSCALL_BASE + 77);
syscall_nr_gettimeofday = (__NR_SYSCALL_BASE + 78);
syscall_nr_settimeofday = (__NR_SYSCALL_BASE + 79);
syscall_nr_symlink = (__NR_SYSCALL_BASE + 83);
syscall_nr_readlink = (__NR_SYSCALL_BASE + 85);
syscall_nr_reboot = (__NR_SYSCALL_BASE + 88);
syscall_nr_munmap = (__NR_SYSCALL_BASE + 91);
syscall_nr_truncate = (__NR_SYSCALL_BASE + 92);
syscall_nr_ftruncate = (__NR_SYSCALL_BASE + 93);
syscall_nr_fchmod = (__NR_SYSCALL_BASE + 94);
syscall_nr_getpriority = (__NR_SYSCALL_BASE + 96);
syscall_nr_setpriority = (__NR_SYSCALL_BASE + 97);
syscall_nr_syslog = (__NR_SYSCALL_BASE + 103);
syscall_nr_setitimer = (__NR_SYSCALL_BASE + 104);
syscall_nr_getitimer = (__NR_SYSCALL_BASE + 105);
syscall_nr_wait4 = (__NR_SYSCALL_BASE + 114);
syscall_nr_sysinfo = (__NR_SYSCALL_BASE + 116);
syscall_nr_fsync = (__NR_SYSCALL_BASE + 118);
syscall_nr_clone = (__NR_SYSCALL_BASE + 120);
syscall_nr_uname = (__NR_SYSCALL_BASE + 122);
syscall_nr_mprotect = (__NR_SYSCALL_BASE + 125);
syscall_nr_sigprocmask = (__NR_SYSCALL_BASE + 126);
syscall_nr_init_module = (__NR_SYSCALL_BASE + 128);
syscall_nr_delete_module = (__NR_SYSCALL_BASE + 129);
syscall_nr_getpgid = (__NR_SYSCALL_BASE + 132);
syscall_nr_fchdir = (__NR_SYSCALL_BASE + 133);
syscall_nr_personality = (__NR_SYSCALL_BASE + 136);
syscall_nr__llseek = (__NR_SYSCALL_BASE + 140);
syscall_nr__newselect = (__NR_SYSCALL_BASE + 142);
syscall_nr_flock = (__NR_SYSCALL_BASE + 143);
syscall_nr_msync = (__NR_SYSCALL_BASE + 144);
syscall_nr_readv = (__NR_SYSCALL_BASE + 145);
syscall_nr_writev = (__NR_SYSCALL_BASE + 146);
syscall_nr_perf_event_open = (__NR_SYSCALL_BASE + 364);
syscall_nr_kill = (__NR_SYSCALL_BASE + 37);
syscall_nr_exit_group = (__NR_SYSCALL_BASE + 248);
syscall_nr_waitid = (__NR_SYSCALL_BASE + 280);
syscall_nr_setuid32 = (__NR_SYSCALL_BASE + 213);
syscall_nr_getuid32 = (__NR_SYSCALL_BASE + 199);
syscall_nr_getgid32 = (__NR_SYSCALL_BASE + 200);
syscall_nr_geteuid32 = (__NR_SYSCALL_BASE + 201);
syscall_nr_getegid32 = (__NR_SYSCALL_BASE + 202);
syscall_nr_getresuid32 = (__NR_SYSCALL_BASE + 209);
syscall_nr_getresgid32 = (__NR_SYSCALL_BASE + 211);
syscall_nr_gettid = (__NR_SYSCALL_BASE + 224);
syscall_nr_readahead = (__NR_SYSCALL_BASE + 225);
syscall_nr_getgroups32 = (__NR_SYSCALL_BASE + 205);
syscall_nr_setgid32 = (__NR_SYSCALL_BASE + 214);
syscall_nr_setreuid32 = (__NR_SYSCALL_BASE + 203);
syscall_nr_setresuid32 = (__NR_SYSCALL_BASE + 208);
syscall_nr_setresgid32 = (__NR_SYSCALL_BASE + 210);
syscall_nr_ugetrlimit = (__NR_SYSCALL_BASE + 191);
syscall_nr_setgroups32 = (__NR_SYSCALL_BASE + 206);
syscall_nr_vfork = (__NR_SYSCALL_BASE + 190);
syscall_nr_setregid32 = (__NR_SYSCALL_BASE + 204);
syscall_nr_prctl = (__NR_SYSCALL_BASE + 172);
syscall_nr_capget = (__NR_SYSCALL_BASE + 184);
syscall_nr_capset = (__NR_SYSCALL_BASE + 185);
syscall_nr_sigaltstack = (__NR_SYSCALL_BASE + 186);
syscall_nr_pread64 = (__NR_SYSCALL_BASE + 180);
syscall_nr_pwrite64 = (__NR_SYSCALL_BASE + 181);
syscall_nr_openat = (__NR_SYSCALL_BASE + 322);
syscall_nr_mmap2 = (__NR_SYSCALL_BASE + 192);
syscall_nr_mremap = (__NR_SYSCALL_BASE + 163);
syscall_nr_madvise = (__NR_SYSCALL_BASE + 220);
syscall_nr_mlock = (__NR_SYSCALL_BASE + 150);
syscall_nr_munlock = (__NR_SYSCALL_BASE + 151);
syscall_nr_mincore = (__NR_SYSCALL_BASE + 219);
syscall_nr_pipe = (__NR_SYSCALL_BASE + 42);
syscall_nr_pipe2 = (__NR_SYSCALL_BASE + 359);
syscall_nr_ftruncate64 = (__NR_SYSCALL_BASE + 194);
syscall_nr_getdents64 = (__NR_SYSCALL_BASE + 217);
syscall_nr_fdatasync = (__NR_SYSCALL_BASE + 148);
syscall_nr_fchown32 = (__NR_SYSCALL_BASE + 207);
syscall_nr_fcntl64 = (__NR_SYSCALL_BASE + 221);
syscall_nr_fstatfs64 = (__NR_SYSCALL_BASE + 267);
syscall_nr_sendfile = (__NR_SYSCALL_BASE + 187);
syscall_nr_fstatat64 = (__NR_SYSCALL_BASE + 327);
syscall_nr_mkdirat = (__NR_SYSCALL_BASE + 323);
syscall_nr_fchownat = (__NR_SYSCALL_BASE + 325);
syscall_nr_fchmodat = (__NR_SYSCALL_BASE + 333);
syscall_nr_renameat = (__NR_SYSCALL_BASE + 329);
syscall_nr_fsetxattr = (__NR_SYSCALL_BASE + 228);
syscall_nr_fgetxattr = (__NR_SYSCALL_BASE + 231);
syscall_nr_flistxattr = (__NR_SYSCALL_BASE + 234);
syscall_nr_fremovexattr = (__NR_SYSCALL_BASE + 237);
syscall_nr_unlinkat = (__NR_SYSCALL_BASE + 328);
syscall_nr_chown32 = (__NR_SYSCALL_BASE + 212);
syscall_nr_lchown32 = (__NR_SYSCALL_BASE + 198);
syscall_nr_fstat64 = (__NR_SYSCALL_BASE + 197);
syscall_nr_stat64 = (__NR_SYSCALL_BASE + 195);
syscall_nr_lstat64 = (__NR_SYSCALL_BASE + 196);
syscall_nr_getcwd = (__NR_SYSCALL_BASE + 183);
syscall_nr_faccessat = (__NR_SYSCALL_BASE + 334);
syscall_nr_setxattr = (__NR_SYSCALL_BASE + 226);
syscall_nr_lsetxattr = (__NR_SYSCALL_BASE + 227);
syscall_nr_getxattr = (__NR_SYSCALL_BASE + 229);
syscall_nr_lgetxattr = (__NR_SYSCALL_BASE + 230);
syscall_nr_listxattr = (__NR_SYSCALL_BASE + 232);
syscall_nr_llistxattr = (__NR_SYSCALL_BASE + 233);
syscall_nr_removexattr = (__NR_SYSCALL_BASE + 235);
syscall_nr_lremovexattr = (__NR_SYSCALL_BASE + 236);
syscall_nr_statfs64 = (__NR_SYSCALL_BASE + 266);
syscall_nr_unshare = (__NR_SYSCALL_BASE + 337);
syscall_nr_nanosleep = (__NR_SYSCALL_BASE + 162);
syscall_nr_clock_gettime = (__NR_SYSCALL_BASE + 263);
syscall_nr_clock_settime = (__NR_SYSCALL_BASE + 262);
syscall_nr_clock_getres = (__NR_SYSCALL_BASE + 264);
syscall_nr_clock_nanosleep = (__NR_SYSCALL_BASE + 265);
syscall_nr_timer_create = (__NR_SYSCALL_BASE + 257);
syscall_nr_timer_settime = (__NR_SYSCALL_BASE + 258);
syscall_nr_timer_gettime = (__NR_SYSCALL_BASE + 259);
syscall_nr_timer_getoverrun = (__NR_SYSCALL_BASE + 260);
syscall_nr_timer_delete = (__NR_SYSCALL_BASE + 261);
syscall_nr_utimes = (__NR_SYSCALL_BASE + 269);
syscall_nr_utimensat = (__NR_SYSCALL_BASE + 348);
syscall_nr_sigsuspend = (__NR_SYSCALL_BASE + 72);
syscall_nr_rt_sigaction = (__NR_SYSCALL_BASE + 174);
syscall_nr_rt_sigprocmask = (__NR_SYSCALL_BASE + 175);
syscall_nr_rt_sigtimedwait = (__NR_SYSCALL_BASE + 177);
syscall_nr_socket = (__NR_SYSCALL_BASE + 281);
syscall_nr_socketpair = (__NR_SYSCALL_BASE + 288);
syscall_nr_bind = (__NR_SYSCALL_BASE + 282);
syscall_nr_connect = (__NR_SYSCALL_BASE + 283);
syscall_nr_listen = (__NR_SYSCALL_BASE + 284);
syscall_nr_accept = (__NR_SYSCALL_BASE + 285);
syscall_nr_getsockname = (__NR_SYSCALL_BASE + 286);
syscall_nr_getpeername = (__NR_SYSCALL_BASE + 287);
syscall_nr_sendto = (__NR_SYSCALL_BASE + 290);
syscall_nr_recvfrom = (__NR_SYSCALL_BASE + 292);
syscall_nr_shutdown = (__NR_SYSCALL_BASE + 293);
syscall_nr_setsockopt = (__NR_SYSCALL_BASE + 294);
syscall_nr_getsockopt = (__NR_SYSCALL_BASE + 295);
syscall_nr_sendmsg = (__NR_SYSCALL_BASE + 296);
syscall_nr_recvmsg = (__NR_SYSCALL_BASE + 297);
syscall_nr_sched_setscheduler = (__NR_SYSCALL_BASE + 156);
syscall_nr_sched_getscheduler = (__NR_SYSCALL_BASE + 157);
syscall_nr_sched_yield = (__NR_SYSCALL_BASE + 158);
syscall_nr_sched_setparam = (__NR_SYSCALL_BASE + 154);
syscall_nr_sched_getparam = (__NR_SYSCALL_BASE + 155);
syscall_nr_sched_get_priority_max = (__NR_SYSCALL_BASE + 159);
syscall_nr_sched_get_priority_min = (__NR_SYSCALL_BASE + 160);
syscall_nr_sched_rr_get_interval = (__NR_SYSCALL_BASE + 161);
syscall_nr_sched_setaffinity = (__NR_SYSCALL_BASE + 241);
syscall_nr_sched_getaffinity = (__NR_SYSCALL_BASE + 242);
syscall_nr_getcpu = (__NR_SYSCALL_BASE + 345);
syscall_nr_ioprio_set = (__NR_SYSCALL_BASE + 314);
syscall_nr_ioprio_get = (__NR_SYSCALL_BASE + 315);
syscall_nr_futex = (__NR_SYSCALL_BASE + 240);
syscall_nr_epoll_create = (__NR_SYSCALL_BASE + 250);
syscall_nr_epoll_ctl = (__NR_SYSCALL_BASE + 251);
syscall_nr_epoll_wait = (__NR_SYSCALL_BASE + 252);
syscall_nr_inotify_init = (__NR_SYSCALL_BASE + 316);
syscall_nr_inotify_add_watch = (__NR_SYSCALL_BASE + 317);
syscall_nr_inotify_rm_watch = (__NR_SYSCALL_BASE + 318);
syscall_nr_poll = (__NR_SYSCALL_BASE + 168);
syscall_nr_eventfd2 = (__NR_SYSCALL_BASE + 356);
syscall_nr_ARM_set_tls = (__NR_SYSCALL_BASE + 983045);
syscall_nr_ARM_cacheflush = (__NR_SYSCALL_BASE + 983042);
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_mount = 21 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 51 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_umount2 = 52 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 61 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 74 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 79 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 87 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 88 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_syslog = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 115 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 121 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 124 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 128 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 129 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 138 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 139 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid32 = 203 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 203 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups32 = 206 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 206 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid32 = 210 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 210 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid32 = 213 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 213 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid32 = 214 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 214 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 262 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 372 deprecated 'This syscall is blocked on Android 8+';

View File

@ -50,12 +50,14 @@ var
u_strToLower: function (dest: PUnicodeChar; destCapacity: int32_t; src: PUnicodeChar; srcLength: int32_t; locale: PAnsiChar; var pErrorCode: UErrorCode): int32_t; cdecl;
u_strCompare: function (s1: PUnicodeChar; length1: int32_t; s2: PUnicodeChar; length2: int32_t; codePointOrder: UBool): int32_t; cdecl;
u_strCaseCompare: function (s1: PUnicodeChar; length1: int32_t; s2: PUnicodeChar; length2: int32_t; options: uint32_t; var pErrorCode: UErrorCode): int32_t; cdecl;
u_getDataDirectory: function(): PAnsiChar; cdecl;
u_setDataDirectory: procedure(directory: PAnsiChar); cdecl;
u_init: procedure(var status: UErrorCode); cdecl;
ucol_open: function(loc: PAnsiChar; var status: UErrorCode): PUCollator; cdecl;
ucol_close: procedure (coll: PUCollator); cdecl;
ucol_strcoll: function (coll: PUCollator; source: PUnicodeChar; sourceLength: int32_t; target: PUnicodeChar; targetLength: int32_t): int32_t; cdecl;
ucol_setStrength: procedure (coll: PUCollator; strength: int32_t); cdecl;
u_errorName: function (code: UErrorCode): PAnsiChar; cdecl;
threadvar
ThreadDataInited: boolean;
@ -63,16 +65,37 @@ threadvar
LastCP: TSystemCodePage;
DefColl: PUCollator;
function MaskExceptions: dword;
begin
{$ifdef cpux86_64}
Result:=GetMXCSR;
SetMXCSR(Result or %0000000010000000 {MM_MaskInvalidOp} or %0001000000000000 {MM_MaskPrecision});
{$else}
Result:=0;
{$endif cpux86_64}
end;
procedure UnmaskExceptions(oldmask: dword);
begin
{$ifdef cpux86_64}
SetMXCSR(oldmask);
{$endif cpux86_64}
end;
function OpenConverter(const name: ansistring): PUConverter;
var
err: UErrorCode;
oldmask: dword;
begin
{ ucnv_open() must be called with some SSE exception masked on x86_64-android. }
oldmask:=MaskExceptions;
err:=0;
Result:=ucnv_open(PAnsiChar(name), err);
if Result <> nil then begin
ucnv_setSubstChars(Result, '?', 1, err);
ucnv_setFallback(Result, True);
end;
UnmaskExceptions(oldmask);
end;
procedure InitThreadData;
@ -465,6 +488,9 @@ begin
if LastConv <> nil then
ucnv_close(LastConv);
if LibVer = '_3_8' then
exit; // ICU v3.8 on Android 1.5-2.1 is buggy and can't be unloaded properly
if hlibICU <> 0 then begin
UnloadLibrary(hlibICU);
hlibICU:=0;
@ -475,7 +501,7 @@ begin
end;
end;
function GetIcuProc(const Name: AnsiString; out ProcPtr; libId: longint = 0): boolean; [public, alias: 'CWSTRING_GET_ICU_PROC'];
function GetIcuProc(const Name: AnsiString; out ProcPtr; libId: longint = 0): boolean;
var
p: pointer;
hLib: TLibHandle;
@ -496,12 +522,14 @@ end;
function LoadICU: boolean;
const
ICUver: array [1..9] of ansistring = ('3_8', '4_2', '44', '46', '48', '50', '51', '53', '55');
ICUver: array [1..12] of ansistring = ('3_8', '4_2', '44', '46', '48', '50', '51', '53', '55', '56', '58', '60');
TestProcName = 'ucnv_open';
var
i: longint;
s: ansistring;
dir: PAnsiChar;
err: UErrorCode;
begin
Result:=False;
{$ifdef android}
@ -543,6 +571,7 @@ begin
// Trying versionless name
if GetProcedureAddress(hlibICU, TestProcName) = nil then begin
// Unable to get ICU version
SysLogWrite(ANDROID_LOG_ERROR, 'cwstring: Unable to get ICU version.');
UnloadICU;
exit;
end;
@ -558,18 +587,31 @@ begin
if not GetIcuProc('u_strToLower', u_strToLower) then exit;
if not GetIcuProc('u_strCompare', u_strCompare) then exit;
if not GetIcuProc('u_strCaseCompare', u_strCaseCompare) then exit;
if not GetIcuProc('u_errorName', u_errorName) then exit;
if not GetIcuProc('u_getDataDirectory', u_getDataDirectory) then exit;
if not GetIcuProc('u_setDataDirectory', u_setDataDirectory) then exit;
if not GetIcuProc('u_init', u_init) then exit;
if not GetIcuProc('ucol_open', ucol_open, 1) then exit;
if not GetIcuProc('ucol_close', ucol_close, 1) then exit;
if not GetIcuProc('ucol_strcoll', ucol_strcoll, 1) then exit;
if not GetIcuProc('ucol_setStrength', ucol_setStrength, 1) then exit;
// Checking if ICU data dir is set
dir:=u_getDataDirectory();
if (dir = nil) or (dir^ = #0) then
u_setDataDirectory('/system/usr/icu');
err:=0;
u_init(err);
Result:=True;
end;
var
oldm: TUnicodeStringManager;
{$ifdef android}
SysGetIcuProc: pointer; external name 'ANDROID_GET_ICU_PROC';
{$endif android}
initialization
GetUnicodeStringManager(oldm);
@ -578,6 +620,7 @@ initialization
if LoadICU then begin
SetCWideStringManager;
{$ifdef android}
SysGetIcuProc:=@GetIcuProc;
SetStdIOCodePages;
{$endif android}
end;

25
rtl/android/dllprt0.as Normal file
View File

@ -0,0 +1,25 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2018 by Yuriy Sydorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Shared library startup code for Free Pascal. Android target.
#
/* --------------------------------------------------------- */
.section .init_array, "aw"
.ifdef CPU64
.quad FPC_LIB_START_ANDROID
.else
.long FPC_LIB_START_ANDROID
.endif

View File

@ -1,92 +0,0 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2013 by Yury Sidorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Shared library startup code for Free Pascal. Android-i386 target.
#
.file "dllprt0.as"
.text
.globl FPC_SHARED_LIB_START
.type FPC_SHARED_LIB_START,@function
FPC_SHARED_LIB_START:
pushl %ebp
movl %esp,%ebp
/* Align the stack to a 16 byte boundary */
andl $~15, %esp
/* Save ebx */
pushl %ebx
/* GOT init */
call fpc_geteipasebx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
/* Save initial stackpointer */
movl __stkptr@GOT(%ebx),%eax
movl %esp,(%eax)
/* Get environment info from libc */
movl environ@GOT(%ebx),%eax
movl (%eax),%eax
/* Check if environment is NULL */
test %eax,%eax
jne env_ok
movl EmptyEnv@GOT(%ebx),%eax
env_ok:
movl operatingsystem_parameter_envp@GOT(%ebx),%edx
movl %eax,(%edx)
/* Restore ebx */
popl %ebx
/* Call main */
call FPC_LIB_MAIN_ANDROID@PLT
/* Call library init */
call FPC_LIB_INIT_ANDROID@PLT
leave
ret
/* --------------------------------------------------------- */
.globl _haltproc
.type _haltproc,@function
_haltproc:
/* GOT init */
call fpc_geteipasebx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
/* Jump to libc exit(). _haltproc has the same declaration as exit. */
jmp exit@PLT
/* --------------------------------------------------------- */
.data
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
operatingsystem_parameter_argc:
.global operatingsystem_parameter_argc
.long 1
operatingsystem_parameter_argv:
.global operatingsystem_parameter_argv
.long EmptyCmdLine
EmptyCmdLine:
.long EmptyCmdStr
EmptyCmdStr:
.ascii "\0"
EmptyEnv:
.long 0
.long 0
.long 0
/* --------------------------------------------------------- */
.section .init_array, "aw"
.long FPC_SHARED_LIB_START

View File

@ -1,98 +0,0 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2013 by Yury Sidorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Program startup code for Free Pascal. Android-i386 target.
#
# Stack layout at program start:
#
# nil
# envn
# ....
# .... ENVIRONMENT VARIABLES
# env1
# env0
# nil
# argn
# ....
# .... COMMAND LINE OPTIONS
# arg1
# arg0
# argc <--- esp
#
/*
In our entry point we should save pointers to cmd line arguments
and environment vars, then pass control to libc startup code.
It will call "PASCALMAIN" via alias "main".
*/
.file "prt0.as"
.text
.align 4
.globl _fpc_start
.type _fpc_start,@function
_fpc_start:
/* GOT init */
call fpc_geteipasebx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
/* Clear the frame pointer since this is the outermost frame. */
xorl %ebp,%ebp
/* Save initial stackpointer */
movl __stkptr@GOT(%ebx),%eax
movl %esp,(%eax)
/* First locate the start of the environment variables */
/* Get argc in ecx */
movl (%esp),%ecx
/* Save argc */
movl operatingsystem_parameter_argc@GOT(%ebx),%eax
movl %ecx,(%eax)
/* Get argv pointer in edx */
leal 4(%esp),%edx
/* Save argv */
movl operatingsystem_parameter_argv@GOT(%ebx),%eax
movl %edx,(%eax)
/* The start of the environment is: esp+ecx*4+12 */
leal 12(%esp,%ecx,4),%edx
/* Save envp */
movl operatingsystem_parameter_envp@GOT(%ebx),%eax
movl %edx,(%eax)
/* Finally go to libc startup code. It will call "PASCALMAIN" via alias "main". */
/* No need to align stack since it will aligned by libc. */
jmp _start
/* --------------------------------------------------------- */
.globl _haltproc
.type _haltproc,@function
_haltproc:
/* GOT init */
call fpc_geteipasebx
addl $_GLOBAL_OFFSET_TABLE_,%ebx
/* Jump to libc exit(). _haltproc has the same declaration as exit. */
jmp exit@PLT
/* --------------------------------------------------------- */
.data
/* Define a symbol for the first piece of initialized data. */
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
/* --------------------------------------------------------- */
.bss
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
.comm operatingsystem_parameter_argc,4
.comm operatingsystem_parameter_argv,4

View File

@ -1,204 +1,270 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2017 by Yuriy Sydorov,
member of the Free Pascal development team.
Syscall nrs for i386-android
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.
**********************************************************************}
// Available syscalls for x86-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
__NR_SYSCALL_BASE = 0;
syscall_nr_restart_syscall = 0;
syscall_nr_exit = 1;
syscall_nr_fork = 2;
syscall_nr_read = 3;
syscall_nr_write = 4;
syscall_nr_open = 5;
syscall_nr_close = 6;
syscall_nr_creat = 8;
syscall_nr_unlink = 10;
syscall_nr_execve = 11;
syscall_nr_chdir = 12;
syscall_nr_lseek = 19;
syscall_nr_getpid = 20;
syscall_nr_getuid = 24;
syscall_nr_ptrace = 26;
syscall_nr_access = 33;
syscall_nr_sync = 36;
syscall_nr_kill = 37;
syscall_nr_rename = 38;
syscall_nr_mkdir = 39;
syscall_nr_dup = 41;
syscall_nr_pipe = 42;
syscall_nr_times = 43;
syscall_nr_brk = 45;
syscall_nr_ioctl = 54;
syscall_nr_fcntl = 55;
syscall_nr_setpgid = 57;
syscall_nr_umask = 60;
syscall_nr_dup2 = 63;
syscall_nr_getppid = 64;
syscall_nr_setsid = 66;
syscall_nr_sigaction = 67;
syscall_nr_setrlimit = 75;
syscall_nr_getrusage = 77;
syscall_nr_gettimeofday = 78;
syscall_nr_readlink = 85;
syscall_nr_mmap = 90;
syscall_nr_mmap64 = syscall_nr_mmap;
syscall_nr_munmap = 91;
syscall_nr_truncate = 92;
syscall_nr_fchmod = 94;
syscall_nr_getpriority = 96;
syscall_nr_setpriority = 97;
syscall_nr_socketcall = 102;
syscall_nr_setitimer = 104;
syscall_nr_getitimer = 105;
syscall_nr_wait4 = 114;
syscall_nr_sysinfo = 116;
syscall_nr_fsync = 118;
syscall_nr_sigreturn = 119;
syscall_nr_clone = 120;
syscall_nr_uname = 122;
syscall_nr_mprotect = 125;
syscall_nr_quotactl = 131;
syscall_nr_getpgid = 132;
syscall_nr_fchdir = 133;
syscall_nr_personality = 136;
syscall_nr__llseek = 140;
syscall_nr_getdents = 141;
syscall_nr__newselect = 142;
syscall_nr_flock = 143;
syscall_nr_msync = 144;
syscall_nr_readv = 145;
syscall_nr_writev = 146;
syscall_nr_getsid = 147;
syscall_nr_fdatasync = 148;
syscall_nr_mlock = 150;
syscall_nr_munlock = 151;
syscall_nr_mlockall = 152;
syscall_nr_munlockall = 153;
syscall_nr_sched_setparam = 154;
syscall_nr_sched_getparam = 155;
syscall_nr_sched_setscheduler = 156;
syscall_nr_sched_getscheduler = 157;
syscall_nr_sched_yield = 158;
syscall_nr_sched_get_priority_max = 159;
syscall_nr_sched_get_priority_min = 160;
syscall_nr_sched_rr_get_interval = 161;
syscall_nr_nanosleep = 162;
syscall_nr_mremap = 163;
syscall_nr_poll = 168;
syscall_nr_prctl = 172;
syscall_nr_rt_sigreturn = 173;
syscall_nr_rt_sigaction = 174;
syscall_nr_rt_sigprocmask = 175;
syscall_nr_rt_sigpending = 176;
syscall_nr_rt_sigtimedwait = 177;
syscall_nr_rt_sigqueueinfo = 178;
syscall_nr_rt_sigsuspend = 179;
syscall_nr_pread64 = 180;
syscall_nr_pwrite64 = 181;
syscall_nr_getcwd = 183;
syscall_nr_capget = 184;
syscall_nr_capset = 185;
syscall_nr_sigaltstack = 186;
syscall_nr_sendfile = 187;
syscall_nr_vfork = 190;
syscall_nr_ugetrlimit = 191;
syscall_nr_getrlimit = syscall_nr_ugetrlimit;
syscall_nr_mmap2 = 192;
syscall_nr_truncate64 = 193;
syscall_nr_ftruncate64 = 194;
syscall_nr_stat64 = 195;
syscall_nr_lstat64 = 196;
syscall_nr_fstat64 = 197;
syscall_nr_fstat = syscall_nr_fstat64;
syscall_nr_getuid32 = 199;
syscall_nr_getgid32 = 200;
syscall_nr_getgid = syscall_nr_getgid32;
syscall_nr_geteuid32 = 201;
syscall_nr_geteuid = syscall_nr_geteuid32;
syscall_nr_getegid32 = 202;
syscall_nr_getegid = syscall_nr_getegid32;
syscall_nr_setregid32 = 204;
syscall_nr_setregid = syscall_nr_setregid32;
syscall_nr_getgroups32 = 205;
syscall_nr_getgroups = syscall_nr_getgroups32;
syscall_nr_fchown32 = 207;
syscall_nr_fchown = syscall_nr_fchown32;
syscall_nr_setresuid32 = 208;
syscall_nr_setresuid = syscall_nr_setresuid32;
syscall_nr_getresuid32 = 209;
syscall_nr_getresuid = syscall_nr_getresuid32;
syscall_nr_getresgid32 = 211;
syscall_nr_getresgid = syscall_nr_getresgid32;
syscall_nr_mincore = 218;
syscall_nr_madvise = 219;
syscall_nr_getdents64 = 220;
syscall_nr_fcntl64 = 221;
syscall_nr_gettid = 224;
syscall_nr_readahead = 225;
syscall_nr_setxattr = 226;
syscall_nr_lsetxattr = 227;
syscall_nr_fsetxattr = 228;
syscall_nr_getxattr = 229;
syscall_nr_lgetxattr = 230;
syscall_nr_fgetxattr = 231;
syscall_nr_listxattr = 232;
syscall_nr_llistxattr = 233;
syscall_nr_flistxattr = 234;
syscall_nr_removexattr = 235;
syscall_nr_lremovexattr = 236;
syscall_nr_fremovexattr = 237;
syscall_nr_tkill = 238;
syscall_nr_sendfile64 = 239;
syscall_nr_futex = 240;
syscall_nr_sched_setaffinity = 241;
syscall_nr_sched_getaffinity = 242;
syscall_nr_set_thread_area = 243;
syscall_nr_io_setup = 245;
syscall_nr_io_destroy = 246;
syscall_nr_io_getevents = 247;
syscall_nr_io_submit = 248;
syscall_nr_io_cancel = 249;
syscall_nr_exit_group = 252;
syscall_nr_epoll_create = 254;
syscall_nr_epoll_ctl = 255;
syscall_nr_epoll_wait = 256;
syscall_nr_remap_file_pages = 257;
syscall_nr_set_tid_address = 258;
syscall_nr_timer_create = 259;
syscall_nr_timer_settime = 260;
syscall_nr_timer_gettime = 261;
syscall_nr_timer_getoverrun = 262;
syscall_nr_timer_delete = 263;
syscall_nr_clock_gettime = 265;
syscall_nr_clock_getres = 266;
syscall_nr_clock_nanosleep = 267;
syscall_nr_statfs64 = 268;
syscall_nr_fstatfs64 = 269;
syscall_nr_tgkill = 270;
syscall_nr_fadvise64_64 = 272;
syscall_nr_waitid = 284;
syscall_nr_inotify_init = 291;
syscall_nr_inotify_add_watch = 292;
syscall_nr_inotify_rm_watch = 293;
syscall_nr_openat = 295;
syscall_nr_mkdirat = 296;
syscall_nr_mknodat = 297;
syscall_nr_fchownat = 298;
syscall_nr_fstatat64 = 300;
syscall_nr_fstatat = syscall_nr_fstatat64;
syscall_nr_unlinkat = 301;
syscall_nr_renameat = 302;
syscall_nr_linkat = 303;
syscall_nr_symlinkat = 304;
syscall_nr_readlinkat = 305;
syscall_nr_fchmodat = 306;
syscall_nr_faccessat = 307;
syscall_nr_pselect6 = 308;
syscall_nr_ppoll = 309;
syscall_nr_unshare = 310;
syscall_nr_splice = 313;
syscall_nr_sync_file_range = 314;
syscall_nr_tee = 315;
syscall_nr_vmsplice = 316;
syscall_nr_getcpu = 318;
syscall_nr_epoll_pwait = 319;
syscall_nr_utimensat = 320;
syscall_nr_timerfd_create = 322;
syscall_nr_eventfd = 323;
syscall_nr_fallocate = 324;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_timerfd_settime = 325;
syscall_nr_timerfd_gettime = 326;
syscall_nr_signalfd4 = 327;
syscall_nr_eventfd2 = 328;
syscall_nr_epoll_create1 = 329;
syscall_nr_dup3 = 330;
syscall_nr_pipe2 = 331;
syscall_nr_inotify_init1 = 332;
syscall_nr_preadv = 333;
syscall_nr_pwritev = 334;
syscall_nr_rt_tgsigqueueinfo = 335;
syscall_nr_perf_event_open = 336;
syscall_nr_prlimit64 = 340;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 344;
syscall_nr_setns = 346;
syscall_nr_process_vm_readv = 347;
syscall_nr_process_vm_writev = 348;
syscall_nr_sched_setattr = 351;
syscall_nr_sched_getattr = 352;
syscall_nr_renameat2 = 353;
syscall_nr_seccomp = 354;
syscall_nr_getrandom = 355;
syscall_nr_memfd_create = 356;
syscall_nr_execveat = 358;
syscall_nr_mlock2 = 376;
syscall_nr_copy_file_range = 377;
syscall_nr_preadv2 = 378;
syscall_nr_pwritev2 = 379;
syscall_nr_exit = (__NR_SYSCALL_BASE + 1);
syscall_nr_fork = (__NR_SYSCALL_BASE + 2);
syscall_nr_read = (__NR_SYSCALL_BASE + 3);
syscall_nr_write = (__NR_SYSCALL_BASE + 4);
syscall_nr_open = (__NR_SYSCALL_BASE + 5);
syscall_nr_close = (__NR_SYSCALL_BASE + 6);
syscall_nr_link = (__NR_SYSCALL_BASE + 9);
syscall_nr_unlink = (__NR_SYSCALL_BASE + 10);
syscall_nr_execve = (__NR_SYSCALL_BASE + 11);
syscall_nr_chdir = (__NR_SYSCALL_BASE + 12);
syscall_nr_mknod = (__NR_SYSCALL_BASE + 14);
syscall_nr_chmod = (__NR_SYSCALL_BASE + 15);
syscall_nr_lseek = (__NR_SYSCALL_BASE + 19);
syscall_nr_getpid = (__NR_SYSCALL_BASE + 20);
syscall_nr_mount = (__NR_SYSCALL_BASE + 21);
syscall_nr_ptrace = (__NR_SYSCALL_BASE + 26);
syscall_nr_pause = (__NR_SYSCALL_BASE + 29);
syscall_nr_access = (__NR_SYSCALL_BASE + 33);
syscall_nr_sync = (__NR_SYSCALL_BASE + 36);
syscall_nr_rename = (__NR_SYSCALL_BASE + 38);
syscall_nr_mkdir = (__NR_SYSCALL_BASE + 39);
syscall_nr_rmdir = (__NR_SYSCALL_BASE + 40);
syscall_nr_dup = (__NR_SYSCALL_BASE + 41);
syscall_nr_times = (__NR_SYSCALL_BASE + 43);
syscall_nr_brk = (__NR_SYSCALL_BASE + 45);
syscall_nr_acct = (__NR_SYSCALL_BASE + 51);
syscall_nr_umount2 = (__NR_SYSCALL_BASE + 52);
syscall_nr_ioctl = (__NR_SYSCALL_BASE + 54);
syscall_nr_fcntl = (__NR_SYSCALL_BASE + 55);
syscall_nr_setpgid = (__NR_SYSCALL_BASE + 57);
syscall_nr_umask = (__NR_SYSCALL_BASE + 60);
syscall_nr_chroot = (__NR_SYSCALL_BASE + 61);
syscall_nr_dup2 = (__NR_SYSCALL_BASE + 63);
syscall_nr_getppid = (__NR_SYSCALL_BASE + 64);
syscall_nr_setsid = (__NR_SYSCALL_BASE + 66);
syscall_nr_sigaction = (__NR_SYSCALL_BASE + 67);
syscall_nr_sigpending = (__NR_SYSCALL_BASE + 73);
syscall_nr_setrlimit = (__NR_SYSCALL_BASE + 75);
syscall_nr_getrusage = (__NR_SYSCALL_BASE + 77);
syscall_nr_gettimeofday = (__NR_SYSCALL_BASE + 78);
syscall_nr_settimeofday = (__NR_SYSCALL_BASE + 79);
syscall_nr_symlink = (__NR_SYSCALL_BASE + 83);
syscall_nr_readlink = (__NR_SYSCALL_BASE + 85);
syscall_nr_reboot = (__NR_SYSCALL_BASE + 88);
syscall_nr_munmap = (__NR_SYSCALL_BASE + 91);
syscall_nr_truncate = (__NR_SYSCALL_BASE + 92);
syscall_nr_ftruncate = (__NR_SYSCALL_BASE + 93);
syscall_nr_fchmod = (__NR_SYSCALL_BASE + 94);
syscall_nr_getpriority = (__NR_SYSCALL_BASE + 96);
syscall_nr_setpriority = (__NR_SYSCALL_BASE + 97);
syscall_nr_syslog = (__NR_SYSCALL_BASE + 103);
syscall_nr_setitimer = (__NR_SYSCALL_BASE + 104);
syscall_nr_getitimer = (__NR_SYSCALL_BASE + 105);
syscall_nr_wait4 = (__NR_SYSCALL_BASE + 114);
syscall_nr_sysinfo = (__NR_SYSCALL_BASE + 116);
syscall_nr_fsync = (__NR_SYSCALL_BASE + 118);
syscall_nr_clone = (__NR_SYSCALL_BASE + 120);
syscall_nr_uname = (__NR_SYSCALL_BASE + 122);
syscall_nr_mprotect = (__NR_SYSCALL_BASE + 125);
syscall_nr_sigprocmask = (__NR_SYSCALL_BASE + 126);
syscall_nr_init_module = (__NR_SYSCALL_BASE + 128);
syscall_nr_delete_module = (__NR_SYSCALL_BASE + 129);
syscall_nr_getpgid = (__NR_SYSCALL_BASE + 132);
syscall_nr_fchdir = (__NR_SYSCALL_BASE + 133);
syscall_nr_personality = (__NR_SYSCALL_BASE + 136);
syscall_nr__llseek = (__NR_SYSCALL_BASE + 140);
syscall_nr__newselect = (__NR_SYSCALL_BASE + 142);
syscall_nr_flock = (__NR_SYSCALL_BASE + 143);
syscall_nr_msync = (__NR_SYSCALL_BASE + 144);
syscall_nr_readv = (__NR_SYSCALL_BASE + 145);
syscall_nr_writev = (__NR_SYSCALL_BASE + 146);
syscall_nr_perf_event_open = (__NR_SYSCALL_BASE + 364);
syscall_nr_waitpid = (__NR_SYSCALL_BASE + 7);
syscall_nr_kill = (__NR_SYSCALL_BASE + 37);
syscall_nr_pipe = (__NR_SYSCALL_BASE + 42);
syscall_nr_sigsuspend = (__NR_SYSCALL_BASE + 72);
syscall_nr_socketcall = (__NR_SYSCALL_BASE + 102);
syscall_nr_fdatasync = (__NR_SYSCALL_BASE + 148);
syscall_nr_mlock = (__NR_SYSCALL_BASE + 150);
syscall_nr_munlock = (__NR_SYSCALL_BASE + 151);
syscall_nr_sched_setparam = (__NR_SYSCALL_BASE + 154);
syscall_nr_sched_getparam = (__NR_SYSCALL_BASE + 155);
syscall_nr_sched_setscheduler = (__NR_SYSCALL_BASE + 156);
syscall_nr_sched_getscheduler = (__NR_SYSCALL_BASE + 157);
syscall_nr_sched_yield = (__NR_SYSCALL_BASE + 158);
syscall_nr_sched_get_priority_max = (__NR_SYSCALL_BASE + 159);
syscall_nr_sched_get_priority_min = (__NR_SYSCALL_BASE + 160);
syscall_nr_sched_rr_get_interval = (__NR_SYSCALL_BASE + 161);
syscall_nr_nanosleep = (__NR_SYSCALL_BASE + 162);
syscall_nr_mremap = (__NR_SYSCALL_BASE + 163);
syscall_nr_poll = (__NR_SYSCALL_BASE + 168);
syscall_nr_prctl = (__NR_SYSCALL_BASE + 172);
syscall_nr_rt_sigaction = (__NR_SYSCALL_BASE + 174);
syscall_nr_rt_sigprocmask = (__NR_SYSCALL_BASE + 175);
syscall_nr_rt_sigtimedwait = (__NR_SYSCALL_BASE + 177);
syscall_nr_pread64 = (__NR_SYSCALL_BASE + 180);
syscall_nr_pwrite64 = (__NR_SYSCALL_BASE + 181);
syscall_nr_getcwd = (__NR_SYSCALL_BASE + 183);
syscall_nr_capget = (__NR_SYSCALL_BASE + 184);
syscall_nr_capset = (__NR_SYSCALL_BASE + 185);
syscall_nr_sigaltstack = (__NR_SYSCALL_BASE + 186);
syscall_nr_sendfile = (__NR_SYSCALL_BASE + 187);
syscall_nr_ugetrlimit = (__NR_SYSCALL_BASE + 191);
syscall_nr_mmap2 = (__NR_SYSCALL_BASE + 192);
syscall_nr_ftruncate64 = (__NR_SYSCALL_BASE + 194);
syscall_nr_stat64 = (__NR_SYSCALL_BASE + 195);
syscall_nr_lstat64 = (__NR_SYSCALL_BASE + 196);
syscall_nr_fstat64 = (__NR_SYSCALL_BASE + 197);
syscall_nr_lchown32 = (__NR_SYSCALL_BASE + 198);
syscall_nr_getuid32 = (__NR_SYSCALL_BASE + 199);
syscall_nr_getgid32 = (__NR_SYSCALL_BASE + 200);
syscall_nr_geteuid32 = (__NR_SYSCALL_BASE + 201);
syscall_nr_getegid32 = (__NR_SYSCALL_BASE + 202);
syscall_nr_setreuid32 = (__NR_SYSCALL_BASE + 203);
syscall_nr_setregid32 = (__NR_SYSCALL_BASE + 204);
syscall_nr_getgroups32 = (__NR_SYSCALL_BASE + 205);
syscall_nr_setgroups32 = (__NR_SYSCALL_BASE + 206);
syscall_nr_fchown32 = (__NR_SYSCALL_BASE + 207);
syscall_nr_setresuid32 = (__NR_SYSCALL_BASE + 208);
syscall_nr_getresuid32 = (__NR_SYSCALL_BASE + 209);
syscall_nr_setresgid32 = (__NR_SYSCALL_BASE + 210);
syscall_nr_getresgid32 = (__NR_SYSCALL_BASE + 211);
syscall_nr_chown32 = (__NR_SYSCALL_BASE + 212);
syscall_nr_setuid32 = (__NR_SYSCALL_BASE + 213);
syscall_nr_setgid32 = (__NR_SYSCALL_BASE + 214);
syscall_nr_mincore = (__NR_SYSCALL_BASE + 218);
syscall_nr_madvise = (__NR_SYSCALL_BASE + 219);
syscall_nr_getdents64 = (__NR_SYSCALL_BASE + 220);
syscall_nr_fcntl64 = (__NR_SYSCALL_BASE + 221);
syscall_nr_gettid = (__NR_SYSCALL_BASE + 224);
syscall_nr_readahead = (__NR_SYSCALL_BASE + 225);
syscall_nr_setxattr = (__NR_SYSCALL_BASE + 226);
syscall_nr_lsetxattr = (__NR_SYSCALL_BASE + 227);
syscall_nr_fsetxattr = (__NR_SYSCALL_BASE + 228);
syscall_nr_getxattr = (__NR_SYSCALL_BASE + 229);
syscall_nr_lgetxattr = (__NR_SYSCALL_BASE + 230);
syscall_nr_fgetxattr = (__NR_SYSCALL_BASE + 231);
syscall_nr_listxattr = (__NR_SYSCALL_BASE + 232);
syscall_nr_llistxattr = (__NR_SYSCALL_BASE + 233);
syscall_nr_flistxattr = (__NR_SYSCALL_BASE + 234);
syscall_nr_removexattr = (__NR_SYSCALL_BASE + 235);
syscall_nr_lremovexattr = (__NR_SYSCALL_BASE + 236);
syscall_nr_fremovexattr = (__NR_SYSCALL_BASE + 237);
syscall_nr_tkill = (__NR_SYSCALL_BASE + 238);
syscall_nr_futex = (__NR_SYSCALL_BASE + 240);
syscall_nr_sched_setaffinity = (__NR_SYSCALL_BASE + 241);
syscall_nr_sched_getaffinity = (__NR_SYSCALL_BASE + 242);
syscall_nr_set_thread_area = (__NR_SYSCALL_BASE + 243);
syscall_nr_exit_group = (__NR_SYSCALL_BASE + 252);
syscall_nr_epoll_create = (__NR_SYSCALL_BASE + 254);
syscall_nr_epoll_ctl = (__NR_SYSCALL_BASE + 255);
syscall_nr_epoll_wait = (__NR_SYSCALL_BASE + 256);
syscall_nr_timer_create = (__NR_SYSCALL_BASE + 259);
syscall_nr_timer_settime = (__NR_SYSCALL_BASE + 260);
syscall_nr_timer_gettime = (__NR_SYSCALL_BASE + 261);
syscall_nr_timer_getoverrun = (__NR_SYSCALL_BASE + 262);
syscall_nr_timer_delete = (__NR_SYSCALL_BASE + 263);
syscall_nr_clock_settime = (__NR_SYSCALL_BASE + 264);
syscall_nr_clock_gettime = (__NR_SYSCALL_BASE + 265);
syscall_nr_clock_getres = (__NR_SYSCALL_BASE + 266);
syscall_nr_clock_nanosleep = (__NR_SYSCALL_BASE + 267);
syscall_nr_statfs64 = (__NR_SYSCALL_BASE + 268);
syscall_nr_fstatfs64 = (__NR_SYSCALL_BASE + 269);
syscall_nr_tgkill = (__NR_SYSCALL_BASE + 270);
syscall_nr_utimes = (__NR_SYSCALL_BASE + 271);
syscall_nr_waitid = (__NR_SYSCALL_BASE + 284);
syscall_nr_ioprio_set = (__NR_SYSCALL_BASE + 289);
syscall_nr_ioprio_get = (__NR_SYSCALL_BASE + 290);
syscall_nr_inotify_init = (__NR_SYSCALL_BASE + 291);
syscall_nr_inotify_add_watch = (__NR_SYSCALL_BASE + 292);
syscall_nr_inotify_rm_watch = (__NR_SYSCALL_BASE + 293);
syscall_nr_openat = (__NR_SYSCALL_BASE + 295);
syscall_nr_mkdirat = (__NR_SYSCALL_BASE + 296);
syscall_nr_fchownat = (__NR_SYSCALL_BASE + 298);
syscall_nr_fstatat64 = (__NR_SYSCALL_BASE + 300);
syscall_nr_unlinkat = (__NR_SYSCALL_BASE + 301);
syscall_nr_renameat = (__NR_SYSCALL_BASE + 302);
syscall_nr_fchmodat = (__NR_SYSCALL_BASE + 306);
syscall_nr_faccessat = (__NR_SYSCALL_BASE + 307);
syscall_nr_unshare = (__NR_SYSCALL_BASE + 310);
syscall_nr_getcpu = (__NR_SYSCALL_BASE + 318);
syscall_nr_utimensat = (__NR_SYSCALL_BASE + 320);
syscall_nr_eventfd2 = (__NR_SYSCALL_BASE + 328);
syscall_nr_pipe2 = (__NR_SYSCALL_BASE + 331);
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_mount = 21 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 51 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_umount2 = 52 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 61 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 74 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 79 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 87 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 88 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_syslog = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 115 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 121 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 124 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 128 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 129 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 138 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 139 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid32 = 203 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 203 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups32 = 206 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 206 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid32 = 210 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 210 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid32 = 213 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 213 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid32 = 214 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 214 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 264 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 343 deprecated 'This syscall is blocked on Android 8+';

View File

@ -0,0 +1,249 @@
// Available syscalls for mips64-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
syscall_nr_read = 5000;
syscall_nr_write = 5001;
syscall_nr_close = 5003;
syscall_nr_fstat = 5005;
syscall_nr_fstat64 = syscall_nr_fstat;
syscall_nr_lseek = 5008;
syscall_nr_mmap = 5009;
syscall_nr_mmap64 = syscall_nr_mmap;
syscall_nr_mprotect = 5010;
syscall_nr_munmap = 5011;
syscall_nr_brk = 5012;
syscall_nr_rt_sigaction = 5013;
syscall_nr_rt_sigprocmask = 5014;
syscall_nr_ioctl = 5015;
syscall_nr_pread64 = 5016;
syscall_nr_pwrite64 = 5017;
syscall_nr_readv = 5018;
syscall_nr_writev = 5019;
syscall_nr_sched_yield = 5023;
syscall_nr_mremap = 5024;
syscall_nr_msync = 5025;
syscall_nr_mincore = 5026;
syscall_nr_madvise = 5027;
syscall_nr_dup = 5031;
syscall_nr_nanosleep = 5034;
syscall_nr_getitimer = 5035;
syscall_nr_setitimer = 5036;
syscall_nr_getpid = 5038;
syscall_nr_sendfile = 5039;
syscall_nr_socket = 5040;
syscall_nr_connect = 5041;
syscall_nr_sendto = 5043;
syscall_nr_recvfrom = 5044;
syscall_nr_sendmsg = 5045;
syscall_nr_recvmsg = 5046;
syscall_nr_shutdown = 5047;
syscall_nr_bind = 5048;
syscall_nr_listen = 5049;
syscall_nr_getsockname = 5050;
syscall_nr_getpeername = 5051;
syscall_nr_socketpair = 5052;
syscall_nr_setsockopt = 5053;
syscall_nr_getsockopt = 5054;
syscall_nr_clone = 5055;
syscall_nr_execve = 5057;
syscall_nr_exit = 5058;
syscall_nr_wait4 = 5059;
syscall_nr_kill = 5060;
syscall_nr_uname = 5061;
syscall_nr_fcntl = 5070;
syscall_nr_flock = 5071;
syscall_nr_fsync = 5072;
syscall_nr_fdatasync = 5073;
syscall_nr_truncate = 5074;
syscall_nr_ftruncate = 5075;
syscall_nr_ftruncate64 = syscall_nr_ftruncate;
syscall_nr_getcwd = 5077;
syscall_nr_chdir = 5078;
syscall_nr_fchdir = 5079;
syscall_nr_fchmod = 5089;
syscall_nr_fchown = 5091;
syscall_nr_umask = 5093;
syscall_nr_gettimeofday = 5094;
syscall_nr_getrlimit = 5095;
syscall_nr_getrusage = 5096;
syscall_nr_sysinfo = 5097;
syscall_nr_times = 5098;
syscall_nr_ptrace = 5099;
syscall_nr_getuid = 5100;
syscall_nr_getgid = 5102;
syscall_nr_geteuid = 5105;
syscall_nr_getegid = 5106;
syscall_nr_setpgid = 5107;
syscall_nr_getppid = 5108;
syscall_nr_setsid = 5110;
syscall_nr_setregid = 5112;
syscall_nr_getgroups = 5113;
syscall_nr_setresuid = 5115;
syscall_nr_getresuid = 5116;
syscall_nr_getresgid = 5118;
syscall_nr_getpgid = 5119;
syscall_nr_getsid = 5122;
syscall_nr_capget = 5123;
syscall_nr_capset = 5124;
syscall_nr_rt_sigpending = 5125;
syscall_nr_rt_sigtimedwait = 5126;
syscall_nr_rt_sigqueueinfo = 5127;
syscall_nr_rt_sigsuspend = 5128;
syscall_nr_sigaltstack = 5129;
syscall_nr_personality = 5132;
syscall_nr_statfs = 5134;
syscall_nr_fstatfs = 5135;
syscall_nr_getpriority = 5137;
syscall_nr_setpriority = 5138;
syscall_nr_sched_setparam = 5139;
syscall_nr_sched_getparam = 5140;
syscall_nr_sched_setscheduler = 5141;
syscall_nr_sched_getscheduler = 5142;
syscall_nr_sched_get_priority_max = 5143;
syscall_nr_sched_get_priority_min = 5144;
syscall_nr_sched_rr_get_interval = 5145;
syscall_nr_mlock = 5146;
syscall_nr_munlock = 5147;
syscall_nr_mlockall = 5148;
syscall_nr_munlockall = 5149;
syscall_nr_pivot_root = 5151;
syscall_nr_prctl = 5153;
syscall_nr_setrlimit = 5155;
syscall_nr_sync = 5157;
syscall_nr_quotactl = 5172;
syscall_nr_gettid = 5178;
syscall_nr_readahead = 5179;
syscall_nr_setxattr = 5180;
syscall_nr_lsetxattr = 5181;
syscall_nr_fsetxattr = 5182;
syscall_nr_getxattr = 5183;
syscall_nr_lgetxattr = 5184;
syscall_nr_fgetxattr = 5185;
syscall_nr_listxattr = 5186;
syscall_nr_llistxattr = 5187;
syscall_nr_flistxattr = 5188;
syscall_nr_removexattr = 5189;
syscall_nr_lremovexattr = 5190;
syscall_nr_fremovexattr = 5191;
syscall_nr_tkill = 5192;
syscall_nr_futex = 5194;
syscall_nr_sched_setaffinity = 5195;
syscall_nr_sched_getaffinity = 5196;
syscall_nr_cacheflush = 5197;
syscall_nr_io_setup = 5200;
syscall_nr_io_destroy = 5201;
syscall_nr_io_getevents = 5202;
syscall_nr_io_submit = 5203;
syscall_nr_io_cancel = 5204;
syscall_nr_exit_group = 5205;
syscall_nr_epoll_ctl = 5208;
syscall_nr_rt_sigreturn = 5211;
syscall_nr_set_tid_address = 5212;
syscall_nr_restart_syscall = 5213;
syscall_nr_fadvise64 = 5215;
syscall_nr_timer_create = 5216;
syscall_nr_timer_settime = 5217;
syscall_nr_timer_gettime = 5218;
syscall_nr_timer_getoverrun = 5219;
syscall_nr_timer_delete = 5220;
syscall_nr_clock_gettime = 5222;
syscall_nr_clock_getres = 5223;
syscall_nr_clock_nanosleep = 5224;
syscall_nr_tgkill = 5225;
syscall_nr_waitid = 5237;
syscall_nr_set_thread_area = 5242;
syscall_nr_inotify_add_watch = 5244;
syscall_nr_inotify_rm_watch = 5245;
syscall_nr_openat = 5247;
syscall_nr_mkdirat = 5248;
syscall_nr_mknodat = 5249;
syscall_nr_fchownat = 5250;
syscall_nr_newfstatat = 5252;
syscall_nr_fstatat = syscall_nr_newfstatat;
syscall_nr_fstatat64 = syscall_nr_newfstatat;
syscall_nr_unlinkat = 5253;
syscall_nr_renameat = 5254;
syscall_nr_linkat = 5255;
syscall_nr_symlinkat = 5256;
syscall_nr_readlinkat = 5257;
syscall_nr_fchmodat = 5258;
syscall_nr_faccessat = 5259;
syscall_nr_pselect6 = 5260;
syscall_nr_ppoll = 5261;
syscall_nr_unshare = 5262;
syscall_nr_splice = 5263;
syscall_nr_sync_file_range = 5264;
syscall_nr_tee = 5265;
syscall_nr_vmsplice = 5266;
syscall_nr_getcpu = 5271;
syscall_nr_epoll_pwait = 5272;
syscall_nr_ioprio_set = 5273;
syscall_nr_ioprio_get = 5274;
syscall_nr_utimensat = 5275;
syscall_nr_fallocate = 5279;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_timerfd_create = 5280;
syscall_nr_timerfd_gettime = 5281;
syscall_nr_timerfd_settime = 5282;
syscall_nr_signalfd4 = 5283;
syscall_nr_eventfd2 = 5284;
syscall_nr_eventfd = syscall_nr_eventfd2;
syscall_nr_epoll_create1 = 5285;
syscall_nr_dup3 = 5286;
syscall_nr_pipe2 = 5287;
syscall_nr_inotify_init1 = 5288;
syscall_nr_preadv = 5289;
syscall_nr_pwritev = 5290;
syscall_nr_rt_tgsigqueueinfo = 5291;
syscall_nr_perf_event_open = 5292;
syscall_nr_accept4 = 5293;
syscall_nr_recvmmsg = 5294;
syscall_nr_prlimit64 = 5297;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 5301;
syscall_nr_sendmmsg = 5302;
syscall_nr_setns = 5303;
syscall_nr_process_vm_readv = 5304;
syscall_nr_process_vm_writev = 5305;
syscall_nr_getdents64 = 5308;
syscall_nr_sched_setattr = 5309;
syscall_nr_sched_getattr = 5310;
syscall_nr_renameat2 = 5311;
syscall_nr_seccomp = 5312;
syscall_nr_getrandom = 5313;
syscall_nr_memfd_create = 5314;
syscall_nr_execveat = 5316;
syscall_nr_mlock2 = 5319;
syscall_nr_copy_file_range = 5320;
syscall_nr_preadv2 = 5321;
syscall_nr_pwritev2 = 5322;
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_syslog = 5101 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 5101 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 5103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 5104 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 5111 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 5114 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 5117 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 5120 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 5121 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 5154 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 5156 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 5158 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 5159 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_mount = 5160 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_umount2 = 5161 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 5162 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 5163 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 5164 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 5165 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 5166 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 5168 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 5169 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 5221 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 5300 deprecated 'This syscall is blocked on Android 8+';

View File

@ -1,95 +0,0 @@
/*
Library startup code for Android/MIPS
by Vsevolod Alekseyev
*/
.set noat
.section ".text"
.align 4
.global FPC_SHARED_LIB_START
FPC_SHARED_LIB_START:
.ent FPC_SHARED_LIB_START
.frame $sp, 32, $ra
.set noreorder
.cpload $t9
/*
Stack structure:
sp+16 - gp
sp+20 - sp
sp+24 - ra
*/
/* Save old sp, align the stack, set up the frame, save regs */
move $t0, $sp
li $t1, -8
and $sp, $sp, $t1
subu $sp, $sp, 32
.cprestore 16
sw $t0, 20($sp)
sw $ra, 24($sp)
/* Save initial stack pointer, return address */
la $t0, __stkptr
sw $sp, ($t0)
/* Get environment from libc */
la $t0, environ
lw $t0, ($t0)
bne $t0, $zero, GotEnv
nop
la $t0, EmptyEnv
GotEnv:
la $t1, operatingsystem_parameter_envp
sw $t0, ($t1)
/* Call main */
jal FPC_LIB_MAIN_ANDROID
nop
/* Call library init */
jal FPC_LIB_INIT_ANDROID
nop
/* restore registers, exit */
lw $ra, 24($sp)
jr $ra
lw $sp, 20($sp)
.end FPC_SHARED_LIB_START
.size FPC_SHARED_LIB_START, .-FPC_SHARED_LIB_START
/*************************/
.global _haltproc
_haltproc:
.ent _haltproc
.set noreorder
.cpload $t9
la $t9, exit
jr $t9
nop
.end _haltproc
.size _haltproc, .-_haltproc
/*************************/
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
operatingsystem_parameter_argc:
.global operatingsystem_parameter_argc
.long 1
operatingsystem_parameter_argv:
.global operatingsystem_parameter_argv
.long EmptyCmdLine
EmptyCmdLine:
.long EmptyCmdStr
EmptyCmdStr:
.ascii "\0"
EmptyEnv:
.long 0
.long 0
.long 0
/* --------------------------------------------------------- */
.section .init_array, "aw"
.long FPC_SHARED_LIB_START

View File

@ -1,57 +0,0 @@
/*
Startup code for Android/MIPS
by Vsevolod Alekseyev
*/
.set at
.section ".text"
.align 4
.global _fpc_start
_fpc_start:
.ent _fpc_start
.set noreorder
.cpload $t9
/*Align the stack, save the old sp */
move $t0, $sp
li $t1, -8
and $sp, $sp, $t1
sw $t0, __stkptr
/* Get argc/argv/envp from the stack; old sp is in t0 */
lw $t1, ($t0)
sw $t1, (operatingsystem_parameter_argc)
addiu $t2, $t0, 4
sw $t2, (operatingsystem_parameter_argv)
addiu $t3, $t1, 1
sll $t3, $t3, 2
add $t2, $t2, $t3
sw $t2, (operatingsystem_parameter_envp)
la $t9, _start
jr $t9
nop
.end _fpc_start
/*************************/
.global _haltproc
_haltproc:
.ent _haltproc
.set noreorder
.cpload $t9
lw $a0, (operatingsystem_result)
la $t9, exit
jr $t9
nop
.end _haltproc
.size _haltproc, .-_haltproc
/*************************/
.comm __stkptr,4
.comm operatingsystem_parameter_envp,4
.comm operatingsystem_parameter_argc,4
.comm operatingsystem_parameter_argv,4

View File

@ -1,220 +1,270 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2017 by Yuriy Sydorov,
member of the Free Pascal development team.
Syscall nrs for mipsel-android
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.
**********************************************************************}
// Available syscalls for mips-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
__NR_SYSCALL_BASE = 4000;
syscall_nr_exit = 4001;
syscall_nr_fork = 4002;
syscall_nr_read = 4003;
syscall_nr_write = 4004;
syscall_nr_open = 4005;
syscall_nr_close = 4006;
syscall_nr_creat = 4008;
syscall_nr_unlink = 4010;
syscall_nr_execve = 4011;
syscall_nr_chdir = 4012;
syscall_nr_lseek = 4019;
syscall_nr_getpid = 4020;
syscall_nr_getuid = 4024;
syscall_nr_ptrace = 4026;
syscall_nr_access = 4033;
syscall_nr_sync = 4036;
syscall_nr_kill = 4037;
syscall_nr_rename = 4038;
syscall_nr_mkdir = 4039;
syscall_nr_dup = 4041;
syscall_nr_pipe = 4042;
syscall_nr_times = 4043;
syscall_nr_brk = 4045;
syscall_nr_getgid = 4047;
syscall_nr_geteuid = 4049;
syscall_nr_getegid = 4050;
syscall_nr_ioctl = 4054;
syscall_nr_fcntl = 4055;
syscall_nr_setpgid = 4057;
syscall_nr_umask = 4060;
syscall_nr_dup2 = 4063;
syscall_nr_getppid = 4064;
syscall_nr_setsid = 4066;
syscall_nr_sigaction = 4067;
syscall_nr_setregid = 4071;
syscall_nr_setrlimit = 4075;
syscall_nr_getrlimit = 4076;
syscall_nr_getrusage = 4077;
syscall_nr_gettimeofday = 4078;
syscall_nr_getgroups = 4080;
syscall_nr_readlink = 4085;
syscall_nr_mmap = 4090;
syscall_nr_mmap64 = syscall_nr_mmap;
syscall_nr_munmap = 4091;
syscall_nr_truncate = 4092;
syscall_nr_fchmod = 4094;
syscall_nr_fchown = 4095;
syscall_nr_getpriority = 4096;
syscall_nr_setpriority = 4097;
syscall_nr_setitimer = 4104;
syscall_nr_getitimer = 4105;
syscall_nr_wait4 = 4114;
syscall_nr_sysinfo = 4116;
syscall_nr_fsync = 4118;
syscall_nr_sigreturn = 4119;
syscall_nr_clone = 4120;
syscall_nr_uname = 4122;
syscall_nr_mprotect = 4125;
syscall_nr_quotactl = 4131;
syscall_nr_getpgid = 4132;
syscall_nr_fchdir = 4133;
syscall_nr_personality = 4136;
syscall_nr__llseek = 4140;
syscall_nr_getdents = 4141;
syscall_nr__newselect = 4142;
syscall_nr_flock = 4143;
syscall_nr_msync = 4144;
syscall_nr_readv = 4145;
syscall_nr_writev = 4146;
syscall_nr_cacheflush = 4147;
syscall_nr_getsid = 4151;
syscall_nr_fdatasync = 4152;
syscall_nr_mlock = 4154;
syscall_nr_munlock = 4155;
syscall_nr_mlockall = 4156;
syscall_nr_munlockall = 4157;
syscall_nr_sched_setparam = 4158;
syscall_nr_sched_getparam = 4159;
syscall_nr_sched_setscheduler = 4160;
syscall_nr_sched_getscheduler = 4161;
syscall_nr_sched_yield = 4162;
syscall_nr_sched_get_priority_max = 4163;
syscall_nr_sched_get_priority_min = 4164;
syscall_nr_sched_rr_get_interval = 4165;
syscall_nr_nanosleep = 4166;
syscall_nr_mremap = 4167;
syscall_nr_bind = 4169;
syscall_nr_connect = 4170;
syscall_nr_getpeername = 4171;
syscall_nr_getsockname = 4172;
syscall_nr_getsockopt = 4173;
syscall_nr_listen = 4174;
syscall_nr_recvfrom = 4176;
syscall_nr_recvmsg = 4177;
syscall_nr_sendmsg = 4179;
syscall_nr_sendto = 4180;
syscall_nr_setsockopt = 4181;
syscall_nr_shutdown = 4182;
syscall_nr_socket = 4183;
syscall_nr_socketpair = 4184;
syscall_nr_setresuid = 4185;
syscall_nr_getresuid = 4186;
syscall_nr_poll = 4188;
syscall_nr_getresgid = 4191;
syscall_nr_prctl = 4192;
syscall_nr_rt_sigreturn = 4193;
syscall_nr_rt_sigaction = 4194;
syscall_nr_rt_sigprocmask = 4195;
syscall_nr_rt_sigpending = 4196;
syscall_nr_rt_sigtimedwait = 4197;
syscall_nr_rt_sigqueueinfo = 4198;
syscall_nr_rt_sigsuspend = 4199;
syscall_nr_pread64 = 4200;
syscall_nr_pwrite64 = 4201;
syscall_nr_getcwd = 4203;
syscall_nr_capget = 4204;
syscall_nr_capset = 4205;
syscall_nr_sigaltstack = 4206;
syscall_nr_sendfile = 4207;
syscall_nr_mmap2 = 4210;
syscall_nr_truncate64 = 4211;
syscall_nr_ftruncate64 = 4212;
syscall_nr_stat64 = 4213;
syscall_nr_lstat64 = 4214;
syscall_nr_fstat64 = 4215;
syscall_nr_fstat = syscall_nr_fstat64;
syscall_nr_mincore = 4217;
syscall_nr_madvise = 4218;
syscall_nr_getdents64 = 4219;
syscall_nr_fcntl64 = 4220;
syscall_nr_gettid = 4222;
syscall_nr_readahead = 4223;
syscall_nr_setxattr = 4224;
syscall_nr_lsetxattr = 4225;
syscall_nr_fsetxattr = 4226;
syscall_nr_getxattr = 4227;
syscall_nr_lgetxattr = 4228;
syscall_nr_fgetxattr = 4229;
syscall_nr_listxattr = 4230;
syscall_nr_llistxattr = 4231;
syscall_nr_flistxattr = 4232;
syscall_nr_removexattr = 4233;
syscall_nr_lremovexattr = 4234;
syscall_nr_fremovexattr = 4235;
syscall_nr_tkill = 4236;
syscall_nr_sendfile64 = 4237;
syscall_nr_futex = 4238;
syscall_nr_sched_setaffinity = 4239;
syscall_nr_sched_getaffinity = 4240;
syscall_nr_io_setup = 4241;
syscall_nr_io_destroy = 4242;
syscall_nr_io_getevents = 4243;
syscall_nr_io_submit = 4244;
syscall_nr_io_cancel = 4245;
syscall_nr_exit_group = 4246;
syscall_nr_epoll_create = 4248;
syscall_nr_epoll_ctl = 4249;
syscall_nr_epoll_wait = 4250;
syscall_nr_remap_file_pages = 4251;
syscall_nr_set_tid_address = 4252;
syscall_nr_restart_syscall = 4253;
syscall_nr_fadvise64 = 4254;
syscall_nr_statfs64 = 4255;
syscall_nr_fstatfs64 = 4256;
syscall_nr_timer_create = 4257;
syscall_nr_timer_settime = 4258;
syscall_nr_timer_gettime = 4259;
syscall_nr_timer_getoverrun = 4260;
syscall_nr_timer_delete = 4261;
syscall_nr_clock_gettime = 4263;
syscall_nr_clock_getres = 4264;
syscall_nr_clock_nanosleep = 4265;
syscall_nr_tgkill = 4266;
syscall_nr_waitid = 4278;
syscall_nr_set_thread_area = 4283;
syscall_nr_inotify_init = 4284;
syscall_nr_inotify_add_watch = 4285;
syscall_nr_inotify_rm_watch = 4286;
syscall_nr_openat = 4288;
syscall_nr_mkdirat = 4289;
syscall_nr_mknodat = 4290;
syscall_nr_fchownat = 4291;
syscall_nr_fstatat64 = 4293;
syscall_nr_fstatat = syscall_nr_fstatat64;
syscall_nr_unlinkat = 4294;
syscall_nr_renameat = 4295;
syscall_nr_linkat = 4296;
syscall_nr_symlinkat = 4297;
syscall_nr_readlinkat = 4298;
syscall_nr_fchmodat = 4299;
syscall_nr_faccessat = 4300;
syscall_nr_pselect6 = 4301;
syscall_nr_ppoll = 4302;
syscall_nr_unshare = 4303;
syscall_nr_splice = 4304;
syscall_nr_sync_file_range = 4305;
syscall_nr_tee = 4306;
syscall_nr_vmsplice = 4307;
syscall_nr_getcpu = 4312;
syscall_nr_epoll_pwait = 4313;
syscall_nr_utimensat = 4316;
syscall_nr_eventfd = 4319;
syscall_nr_fallocate = 4320;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_timerfd_create = 4321;
syscall_nr_timerfd_gettime = 4322;
syscall_nr_timerfd_settime = 4323;
syscall_nr_signalfd4 = 4324;
syscall_nr_eventfd2 = 4325;
syscall_nr_epoll_create1 = 4326;
syscall_nr_dup3 = 4327;
syscall_nr_pipe2 = 4328;
syscall_nr_inotify_init1 = 4329;
syscall_nr_preadv = 4330;
syscall_nr_pwritev = 4331;
syscall_nr_rt_tgsigqueueinfo = 4332;
syscall_nr_perf_event_open = 4333;
syscall_nr_accept4 = 4334;
syscall_nr_recvmmsg = 4335;
syscall_nr_prlimit64 = 4338;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 4342;
syscall_nr_sendmmsg = 4343;
syscall_nr_setns = 4344;
syscall_nr_process_vm_readv = 4345;
syscall_nr_process_vm_writev = 4346;
syscall_nr_sched_setattr = 4349;
syscall_nr_sched_getattr = 4350;
syscall_nr_renameat2 = 4351;
syscall_nr_seccomp = 4352;
syscall_nr_getrandom = 4353;
syscall_nr_memfd_create = 4354;
syscall_nr_execveat = 4356;
syscall_nr_mlock2 = 4359;
syscall_nr_copy_file_range = 4360;
syscall_nr_preadv2 = 4361;
syscall_nr_pwritev2 = 4362;
syscall_nr_exit = (__NR_SYSCALL_BASE + 1);
syscall_nr_fork = (__NR_SYSCALL_BASE + 2);
syscall_nr_read = (__NR_SYSCALL_BASE + 3);
syscall_nr_write = (__NR_SYSCALL_BASE + 4);
syscall_nr_open = (__NR_SYSCALL_BASE + 5);
syscall_nr_close = (__NR_SYSCALL_BASE + 6);
syscall_nr_link = (__NR_SYSCALL_BASE + 9);
syscall_nr_unlink = (__NR_SYSCALL_BASE + 10);
syscall_nr_execve = (__NR_SYSCALL_BASE + 11);
syscall_nr_chdir = (__NR_SYSCALL_BASE + 12);
syscall_nr_mknod = (__NR_SYSCALL_BASE + 14);
syscall_nr_chmod = (__NR_SYSCALL_BASE + 15);
syscall_nr_lseek = (__NR_SYSCALL_BASE + 19);
syscall_nr_getpid = (__NR_SYSCALL_BASE + 20);
syscall_nr_mount = (__NR_SYSCALL_BASE + 21);
syscall_nr_ptrace = (__NR_SYSCALL_BASE + 26);
syscall_nr_pause = (__NR_SYSCALL_BASE + 29);
syscall_nr_access = (__NR_SYSCALL_BASE + 33);
syscall_nr_sync = (__NR_SYSCALL_BASE + 36);
syscall_nr_rename = (__NR_SYSCALL_BASE + 38);
syscall_nr_mkdir = (__NR_SYSCALL_BASE + 39);
syscall_nr_rmdir = (__NR_SYSCALL_BASE + 40);
syscall_nr_dup = (__NR_SYSCALL_BASE + 41);
syscall_nr_times = (__NR_SYSCALL_BASE + 43);
syscall_nr_brk = (__NR_SYSCALL_BASE + 45);
syscall_nr_acct = (__NR_SYSCALL_BASE + 51);
syscall_nr_umount2 = (__NR_SYSCALL_BASE + 52);
syscall_nr_ioctl = (__NR_SYSCALL_BASE + 54);
syscall_nr_fcntl = (__NR_SYSCALL_BASE + 55);
syscall_nr_setpgid = (__NR_SYSCALL_BASE + 57);
syscall_nr_umask = (__NR_SYSCALL_BASE + 60);
syscall_nr_chroot = (__NR_SYSCALL_BASE + 61);
syscall_nr_dup2 = (__NR_SYSCALL_BASE + 63);
syscall_nr_getppid = (__NR_SYSCALL_BASE + 64);
syscall_nr_setsid = (__NR_SYSCALL_BASE + 66);
syscall_nr_sigaction = (__NR_SYSCALL_BASE + 67);
syscall_nr_sigpending = (__NR_SYSCALL_BASE + 73);
syscall_nr_setrlimit = (__NR_SYSCALL_BASE + 75);
syscall_nr_getrusage = (__NR_SYSCALL_BASE + 77);
syscall_nr_gettimeofday = (__NR_SYSCALL_BASE + 78);
syscall_nr_settimeofday = (__NR_SYSCALL_BASE + 79);
syscall_nr_symlink = (__NR_SYSCALL_BASE + 83);
syscall_nr_readlink = (__NR_SYSCALL_BASE + 85);
syscall_nr_reboot = (__NR_SYSCALL_BASE + 88);
syscall_nr_munmap = (__NR_SYSCALL_BASE + 91);
syscall_nr_truncate = (__NR_SYSCALL_BASE + 92);
syscall_nr_ftruncate = (__NR_SYSCALL_BASE + 93);
syscall_nr_fchmod = (__NR_SYSCALL_BASE + 94);
syscall_nr_getpriority = (__NR_SYSCALL_BASE + 96);
syscall_nr_setpriority = (__NR_SYSCALL_BASE + 97);
syscall_nr_syslog = (__NR_SYSCALL_BASE + 103);
syscall_nr_setitimer = (__NR_SYSCALL_BASE + 104);
syscall_nr_getitimer = (__NR_SYSCALL_BASE + 105);
syscall_nr_wait4 = (__NR_SYSCALL_BASE + 114);
syscall_nr_sysinfo = (__NR_SYSCALL_BASE + 116);
syscall_nr_fsync = (__NR_SYSCALL_BASE + 118);
syscall_nr_clone = (__NR_SYSCALL_BASE + 120);
syscall_nr_uname = (__NR_SYSCALL_BASE + 122);
syscall_nr_mprotect = (__NR_SYSCALL_BASE + 125);
syscall_nr_sigprocmask = (__NR_SYSCALL_BASE + 126);
syscall_nr_init_module = (__NR_SYSCALL_BASE + 128);
syscall_nr_delete_module = (__NR_SYSCALL_BASE + 129);
syscall_nr_getpgid = (__NR_SYSCALL_BASE + 132);
syscall_nr_fchdir = (__NR_SYSCALL_BASE + 133);
syscall_nr_personality = (__NR_SYSCALL_BASE + 136);
syscall_nr__llseek = (__NR_SYSCALL_BASE + 140);
syscall_nr__newselect = (__NR_SYSCALL_BASE + 142);
syscall_nr_flock = (__NR_SYSCALL_BASE + 143);
syscall_nr_msync = (__NR_SYSCALL_BASE + 144);
syscall_nr_readv = (__NR_SYSCALL_BASE + 145);
syscall_nr_writev = (__NR_SYSCALL_BASE + 146);
syscall_nr_perf_event_open = (__NR_SYSCALL_BASE + 364);
syscall_nr_syscall = (__NR_SYSCALL_BASE + 0);
syscall_nr_waitpid = (__NR_SYSCALL_BASE + 7);
syscall_nr_lchown = (__NR_SYSCALL_BASE + 16);
syscall_nr_setuid = (__NR_SYSCALL_BASE + 23);
syscall_nr_getuid = (__NR_SYSCALL_BASE + 24);
syscall_nr_kill = (__NR_SYSCALL_BASE + 37);
syscall_nr_setgid = (__NR_SYSCALL_BASE + 46);
syscall_nr_getgid = (__NR_SYSCALL_BASE + 47);
syscall_nr_geteuid = (__NR_SYSCALL_BASE + 49);
syscall_nr_getegid = (__NR_SYSCALL_BASE + 50);
syscall_nr_setreuid = (__NR_SYSCALL_BASE + 70);
syscall_nr_setregid = (__NR_SYSCALL_BASE + 71);
syscall_nr_sigsuspend = (__NR_SYSCALL_BASE + 72);
syscall_nr_getrlimit = (__NR_SYSCALL_BASE + 76);
syscall_nr_getgroups = (__NR_SYSCALL_BASE + 80);
syscall_nr_setgroups = (__NR_SYSCALL_BASE + 81);
syscall_nr_fchown = (__NR_SYSCALL_BASE + 95);
syscall_nr_cacheflush = (__NR_SYSCALL_BASE + 147);
syscall_nr_fdatasync = (__NR_SYSCALL_BASE + 152);
syscall_nr_mlock = (__NR_SYSCALL_BASE + 154);
syscall_nr_munlock = (__NR_SYSCALL_BASE + 155);
syscall_nr_sched_setparam = (__NR_SYSCALL_BASE + 158);
syscall_nr_sched_getparam = (__NR_SYSCALL_BASE + 159);
syscall_nr_sched_setscheduler = (__NR_SYSCALL_BASE + 160);
syscall_nr_sched_getscheduler = (__NR_SYSCALL_BASE + 161);
syscall_nr_sched_yield = (__NR_SYSCALL_BASE + 162);
syscall_nr_sched_get_priority_max = (__NR_SYSCALL_BASE + 163);
syscall_nr_sched_get_priority_min = (__NR_SYSCALL_BASE + 164);
syscall_nr_sched_rr_get_interval = (__NR_SYSCALL_BASE + 165);
syscall_nr_nanosleep = (__NR_SYSCALL_BASE + 166);
syscall_nr_mremap = (__NR_SYSCALL_BASE + 167);
syscall_nr_accept = (__NR_SYSCALL_BASE + 168);
syscall_nr_bind = (__NR_SYSCALL_BASE + 169);
syscall_nr_connect = (__NR_SYSCALL_BASE + 170);
syscall_nr_getpeername = (__NR_SYSCALL_BASE + 171);
syscall_nr_getsockname = (__NR_SYSCALL_BASE + 172);
syscall_nr_getsockopt = (__NR_SYSCALL_BASE + 173);
syscall_nr_listen = (__NR_SYSCALL_BASE + 174);
syscall_nr_recvfrom = (__NR_SYSCALL_BASE + 176);
syscall_nr_recvmsg = (__NR_SYSCALL_BASE + 177);
syscall_nr_sendmsg = (__NR_SYSCALL_BASE + 179);
syscall_nr_sendto = (__NR_SYSCALL_BASE + 180);
syscall_nr_setsockopt = (__NR_SYSCALL_BASE + 181);
syscall_nr_shutdown = (__NR_SYSCALL_BASE + 182);
syscall_nr_socket = (__NR_SYSCALL_BASE + 183);
syscall_nr_socketpair = (__NR_SYSCALL_BASE + 184);
syscall_nr_setresuid = (__NR_SYSCALL_BASE + 185);
syscall_nr_getresuid = (__NR_SYSCALL_BASE + 186);
syscall_nr_poll = (__NR_SYSCALL_BASE + 188);
syscall_nr_setresgid = (__NR_SYSCALL_BASE + 190);
syscall_nr_getresgid = (__NR_SYSCALL_BASE + 191);
syscall_nr_prctl = (__NR_SYSCALL_BASE + 192);
syscall_nr_rt_sigaction = (__NR_SYSCALL_BASE + 194);
syscall_nr_rt_sigprocmask = (__NR_SYSCALL_BASE + 195);
syscall_nr_rt_sigtimedwait = (__NR_SYSCALL_BASE + 197);
syscall_nr_pread64 = (__NR_SYSCALL_BASE + 200);
syscall_nr_pwrite64 = (__NR_SYSCALL_BASE + 201);
syscall_nr_chown = (__NR_SYSCALL_BASE + 202);
syscall_nr_getcwd = (__NR_SYSCALL_BASE + 203);
syscall_nr_capget = (__NR_SYSCALL_BASE + 204);
syscall_nr_capset = (__NR_SYSCALL_BASE + 205);
syscall_nr_sigaltstack = (__NR_SYSCALL_BASE + 206);
syscall_nr_sendfile = (__NR_SYSCALL_BASE + 207);
syscall_nr_mmap2 = (__NR_SYSCALL_BASE + 210);
syscall_nr_ftruncate64 = (__NR_SYSCALL_BASE + 212);
syscall_nr_stat64 = (__NR_SYSCALL_BASE + 213);
syscall_nr_lstat64 = (__NR_SYSCALL_BASE + 214);
syscall_nr_fstat64 = (__NR_SYSCALL_BASE + 215);
syscall_nr_mincore = (__NR_SYSCALL_BASE + 217);
syscall_nr_madvise = (__NR_SYSCALL_BASE + 218);
syscall_nr_getdents64 = (__NR_SYSCALL_BASE + 219);
syscall_nr_fcntl64 = (__NR_SYSCALL_BASE + 220);
syscall_nr_gettid = (__NR_SYSCALL_BASE + 222);
syscall_nr_readahead = (__NR_SYSCALL_BASE + 223);
syscall_nr_setxattr = (__NR_SYSCALL_BASE + 224);
syscall_nr_lsetxattr = (__NR_SYSCALL_BASE + 225);
syscall_nr_fsetxattr = (__NR_SYSCALL_BASE + 226);
syscall_nr_getxattr = (__NR_SYSCALL_BASE + 227);
syscall_nr_lgetxattr = (__NR_SYSCALL_BASE + 228);
syscall_nr_fgetxattr = (__NR_SYSCALL_BASE + 229);
syscall_nr_listxattr = (__NR_SYSCALL_BASE + 230);
syscall_nr_llistxattr = (__NR_SYSCALL_BASE + 231);
syscall_nr_flistxattr = (__NR_SYSCALL_BASE + 232);
syscall_nr_removexattr = (__NR_SYSCALL_BASE + 233);
syscall_nr_lremovexattr = (__NR_SYSCALL_BASE + 234);
syscall_nr_fremovexattr = (__NR_SYSCALL_BASE + 235);
syscall_nr_tkill = (__NR_SYSCALL_BASE + 236);
syscall_nr_futex = (__NR_SYSCALL_BASE + 238);
syscall_nr_sched_setaffinity = (__NR_SYSCALL_BASE + 239);
syscall_nr_sched_getaffinity = (__NR_SYSCALL_BASE + 240);
syscall_nr_exit_group = (__NR_SYSCALL_BASE + 246);
syscall_nr_epoll_create = (__NR_SYSCALL_BASE + 248);
syscall_nr_epoll_ctl = (__NR_SYSCALL_BASE + 249);
syscall_nr_epoll_wait = (__NR_SYSCALL_BASE + 250);
syscall_nr_statfs64 = (__NR_SYSCALL_BASE + 255);
syscall_nr_fstatfs64 = (__NR_SYSCALL_BASE + 256);
syscall_nr_timer_create = (__NR_SYSCALL_BASE + 257);
syscall_nr_timer_settime = (__NR_SYSCALL_BASE + 258);
syscall_nr_timer_gettime = (__NR_SYSCALL_BASE + 259);
syscall_nr_timer_getoverrun = (__NR_SYSCALL_BASE + 260);
syscall_nr_timer_delete = (__NR_SYSCALL_BASE + 261);
syscall_nr_clock_settime = (__NR_SYSCALL_BASE + 262);
syscall_nr_clock_gettime = (__NR_SYSCALL_BASE + 263);
syscall_nr_clock_getres = (__NR_SYSCALL_BASE + 264);
syscall_nr_clock_nanosleep = (__NR_SYSCALL_BASE + 265);
syscall_nr_tgkill = (__NR_SYSCALL_BASE + 266);
syscall_nr_utimes = (__NR_SYSCALL_BASE + 267);
syscall_nr_waitid = (__NR_SYSCALL_BASE + 278);
syscall_nr_set_thread_area = (__NR_SYSCALL_BASE + 283);
syscall_nr_inotify_init = (__NR_SYSCALL_BASE + 284);
syscall_nr_inotify_add_watch = (__NR_SYSCALL_BASE + 285);
syscall_nr_inotify_rm_watch = (__NR_SYSCALL_BASE + 286);
syscall_nr_openat = (__NR_SYSCALL_BASE + 288);
syscall_nr_mkdirat = (__NR_SYSCALL_BASE + 289);
syscall_nr_fchownat = (__NR_SYSCALL_BASE + 291);
syscall_nr_fstatat64 = (__NR_SYSCALL_BASE + 293);
syscall_nr_unlinkat = (__NR_SYSCALL_BASE + 294);
syscall_nr_renameat = (__NR_SYSCALL_BASE + 295);
syscall_nr_fchmodat = (__NR_SYSCALL_BASE + 299);
syscall_nr_faccessat = (__NR_SYSCALL_BASE + 300);
syscall_nr_unshare = (__NR_SYSCALL_BASE + 303);
syscall_nr_getcpu = (__NR_SYSCALL_BASE + 312);
syscall_nr_ioprio_set = (__NR_SYSCALL_BASE + 314);
syscall_nr_ioprio_get = (__NR_SYSCALL_BASE + 315);
syscall_nr_utimensat = (__NR_SYSCALL_BASE + 316);
syscall_nr_eventfd2 = (__NR_SYSCALL_BASE + 325);
syscall_nr_pipe2 = (__NR_SYSCALL_BASE + 328);
syscall_nr_pipe = (__NR_SYSCALL_BASE + 42);
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_mount = 4021 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 4023 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 4046 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 4051 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_umount2 = 4052 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 4061 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 4070 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 4074 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 4079 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 4081 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 4087 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 4088 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_syslog = 4103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 4103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 4115 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 4121 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 4124 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 4128 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 4129 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 4138 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 4139 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 4190 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 4262 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 4341 deprecated 'This syscall is blocked on Android 8+';

34
rtl/android/prt0.as Normal file
View File

@ -0,0 +1,34 @@
#
# This file is part of the Free Pascal run time library.
# Copyright (c) 2018 by Yuriy Sydorov and other
# members of the Free Pascal development team.
#
# 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.
#
#**********************************************************************}
#
# Program startup code for Free Pascal. Android target.
#
/* --------------------------------------------------------- */
.data
/* Define a symbol for the first piece of initialized data. */
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start
/* --------------------------------------------------------- */
.section .init_array, "aw"
.ifdef CPU64
.quad FPC_PROG_START_ANDROID
.else
.long FPC_PROG_START_ANDROID
.endif

View File

@ -1,6 +1,6 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2015 by Yury Sidorov,
Copyright (c) 2015-2018 by Yuriy Sydorov,
member of the Free Pascal development team.
Android-specific part of the System unit.
@ -13,6 +13,72 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
var
__stkptr : Pointer; public name '__stkptr';
operatingsystem_parameter_envp : Pointer; public name 'operatingsystem_parameter_envp';
operatingsystem_parameter_argc : LongInt; public name 'operatingsystem_parameter_argc';
operatingsystem_parameter_argv : Pointer; public name 'operatingsystem_parameter_argv';
_environ: pointer external name 'environ';
GetIcuProc: pointer; public name 'ANDROID_GET_ICU_PROC';
procedure CommonMainAndroid;
const
EmptyEnv: array[0..2] of PAnsiChar = (nil, nil, nil);
EmptyCmdLine: array[0..0] of PAnsiChar = ( '' );
var
i: longint;
p: PPAnsiChar;
begin
// Get the current stack pointer, adjust and save it
__stkptr:=pointer(ptruint(Sptr) or $FFFF);
// Get the environment from the environ variable of libc
p:=_environ;
if p = nil then
operatingsystem_parameter_envp:=@EmptyEnv
else
begin
operatingsystem_parameter_envp:=p;
// Finding argc and argv. They are placed before envp
Dec(p);
if p^ = nil then
begin
i:=0;
while i < 200 do
begin
Dec(p);
if ptrint(p^) = i then
begin
// argc found
operatingsystem_parameter_argc:=i;
operatingsystem_parameter_argv:=p + 1;
break;
end;
Inc(i);
end;
end;
end;
if operatingsystem_parameter_argc = 0 then
begin
// argc and argv are not available
operatingsystem_parameter_argc:=1;
operatingsystem_parameter_argv:=@EmptyCmdLine;
end;
end;
// ************* Program startup code
procedure ProgMainAndroid; cdecl; [public, alias:'FPC_PROG_START_ANDROID'];
begin
CommonMainAndroid;
end;
// ************* Shared library startup code
procedure LibMainAndroid; external name 'FPC_LIB_MAIN_ANDROID';
procedure atexit(p: pointer); cdecl; external;
var
@ -44,8 +110,15 @@ begin
end;
end;
procedure SysInitAndroidLib; [public, alias:'FPC_LIB_INIT_ANDROID'];
// This procedure is called first when a shared library is loaded
procedure AndroidLibStart; cdecl; [public, alias:'FPC_LIB_START_ANDROID'];
begin
CommonMainAndroid;
// Call main code FPC_LIB_MAIN_ANDROID of the library.
// It points either to a standard PASCALMAIN or FPC_JNI_LIB_MAIN_ANDROID if JNI_OnLoad is exported by the library
// The linker makes all the magic.
LibMainAndroid;
{ Starting from Android 4.4 stdio handles are closed by libc prior to calling
finalization routines of shared libraries. This causes a error while trying to
writeln during library finalization and finally a crash because the error can
@ -59,6 +132,38 @@ begin
atexit(@SysAndroidLibExit);
end;
// ************* JNI init
function JNI_OnLoad_Real(vm: pointer; reserved: pointer): longint;{$ifdef windows} stdcall {$else} cdecl {$endif}; external name 'FPC_JNI_ON_LOAD';
procedure PascalMain; external name 'PASCALMAIN';
// This proxy function is called when JVM calls the JNI_OnLoad() exported function
function JNI_OnLoad_Proxy(vm: pointer; reserved: pointer): longint;{$ifdef windows} stdcall {$else} cdecl {$endif}; [public, alias:'FPC_JNI_ON_LOAD_PROXY'];
begin
IsJniLibrary:=True;
// Call library initialization
PascalMain;
// Call user's JNI_OnLoad().
Result:=JNI_OnLoad_Real(vm, reserved);
end;
// This procedure is called instead of library initialization when JNI_OnLoad is exported
procedure JniLibMain; [public, alias:'FPC_JNI_LIB_MAIN_ANDROID'];
begin
// Must be empty.
end;
// ************* haltproc
procedure _exit(e:longint); cdecl; external name 'exit';
procedure _haltproc(e:longint);cdecl; [public, alias: {$if defined(CPUARM) and defined(FPC_ABI_EABI)} '_haltproc_eabi' {$else} '_haltproc' {$endif}];
begin
_exit(e);
end;
// ************* Misc functions
function __system_property_get(name:Pchar; value:Pchar):longint;cdecl;external 'c' name '__system_property_get';
function GetSystemProperty(Name: PAnsiChar): shortstring;
@ -206,27 +311,6 @@ begin
DefaultLogTag[len + 1]:=#0;
end;
// ************* JNI init
function JNI_OnLoad_Real(vm: pointer; reserved: pointer): longint;{$ifdef windows} stdcall {$else} cdecl {$endif}; external name 'FPC_JNI_ON_LOAD';
procedure PascalMain; external name 'PASCALMAIN';
// This proxy function is called when JVM calls the JNI_OnLoad() exported function
function JNI_OnLoad_Proxy(vm: pointer; reserved: pointer): longint;{$ifdef windows} stdcall {$else} cdecl {$endif}; [public, alias:'FPC_JNI_ON_LOAD_PROXY'];
begin
IsJniLibrary:=True;
// Call library initialization
PascalMain;
// Call user's JNI_OnLoad().
Result:=JNI_OnLoad_Real(vm, reserved);
end;
// This procedure is called instead of library initialization when JNI_OnLoad is exported
procedure JniLibMain; [public, alias:'FPC_JNI_LIB_MAIN_ANDROID'];
begin
// Must be empty.
end;
// ************* System init
procedure InitAndroid;

View File

@ -45,7 +45,7 @@ var
TZStandardName: utf8string;
TZDaylightName: utf8string;
function GetIcuProc(const Name: AnsiString; var ProcPtr; libId: longint): boolean; external name 'CWSTRING_GET_ICU_PROC';
GetIcuProc: function (const Name: AnsiString; var ProcPtr; libId: longint): boolean; external name 'ANDROID_GET_ICU_PROC';
procedure ReadTimeZoneFromICU;
var
@ -55,6 +55,7 @@ var
err: UErrorCode;
cal: UCalendar;
begin
if not Assigned(GetIcuProc) then exit;
if not GetIcuProc('ucal_open', ucal_open, 1) then exit;
if not GetIcuProc('ucal_close', ucal_close, 1) then exit;
if not GetIcuProc('ucal_getTimeZoneDisplayName', ucal_getTimeZoneDisplayName, 1) then exit;
@ -103,33 +104,33 @@ type
true : (__tm_gmtoff : longint;__tm_zone : Pchar);
end;
function localtime(t: PLongInt): Ptm; cdecl; external 'c' name 'localtime';
function localtime(t: Ptime_t): Ptm; cdecl; external 'c' name 'localtime';
var
c_tzname: array[0..1] of PAnsiChar; external 'c' name 'tzname';
procedure ReadTimeZoneFromLibC;
function ReadTimeZoneFromLibC: boolean;
var
t: longint;
t: time_t;
tt: Ptm;
begin
t:=fptime;
tt:=localtime(@t);
ReadTimeZoneFromLibC:=False;
tzname[false]:=c_tzname[0];
tzname[true]:=c_tzname[1];
t:=fptime;
tt:=localtime(@t);
if tt <> nil then
begin
tzdaylight:=tt^.tm_isdst <> 0;
tzseconds:=tt^.tm_gmtoff;
ReadTimeZoneFromLibC:=tzname[false] <> nil;
end;
end;
procedure InitLocalTime;
begin
if SystemApiLevel > 10 then
ReadTimeZoneFromLibC;
// If cuurent Android version is too old and does not support timezone
// in libc, use ICU library.
if tzname[false] = nil then
if (SystemApiLevel <= 10) or not ReadTimeZoneFromLibC then
// If current Android version is too old and does not support timezone
// in libc, use ICU library.
ReadTimeZoneFromICU;
end;

View File

@ -0,0 +1,249 @@
// Available syscalls for x86_64-android.
// This file is autogenerated by the genandroidsyscalls.py script.
// Script location: https://svn.freepascal.org/svn/fpcbuild/scripts/android
const
syscall_nr_read = 0;
syscall_nr_write = 1;
syscall_nr_close = 3;
syscall_nr_fstat = 5;
syscall_nr_fstat64 = syscall_nr_fstat;
syscall_nr_lseek = 8;
syscall_nr_mmap = 9;
syscall_nr_mmap64 = syscall_nr_mmap;
syscall_nr_mprotect = 10;
syscall_nr_munmap = 11;
syscall_nr_brk = 12;
syscall_nr_rt_sigaction = 13;
syscall_nr_rt_sigprocmask = 14;
syscall_nr_rt_sigreturn = 15;
syscall_nr_ioctl = 16;
syscall_nr_pread64 = 17;
syscall_nr_pwrite64 = 18;
syscall_nr_readv = 19;
syscall_nr_writev = 20;
syscall_nr_sched_yield = 24;
syscall_nr_mremap = 25;
syscall_nr_msync = 26;
syscall_nr_mincore = 27;
syscall_nr_madvise = 28;
syscall_nr_dup = 32;
syscall_nr_nanosleep = 35;
syscall_nr_getitimer = 36;
syscall_nr_setitimer = 38;
syscall_nr_getpid = 39;
syscall_nr_sendfile = 40;
syscall_nr_socket = 41;
syscall_nr_connect = 42;
syscall_nr_sendto = 44;
syscall_nr_recvfrom = 45;
syscall_nr_sendmsg = 46;
syscall_nr_recvmsg = 47;
syscall_nr_shutdown = 48;
syscall_nr_bind = 49;
syscall_nr_listen = 50;
syscall_nr_getsockname = 51;
syscall_nr_getpeername = 52;
syscall_nr_socketpair = 53;
syscall_nr_setsockopt = 54;
syscall_nr_getsockopt = 55;
syscall_nr_clone = 56;
syscall_nr_vfork = 58;
syscall_nr_execve = 59;
syscall_nr_exit = 60;
syscall_nr_wait4 = 61;
syscall_nr_kill = 62;
syscall_nr_uname = 63;
syscall_nr_fcntl = 72;
syscall_nr_flock = 73;
syscall_nr_fsync = 74;
syscall_nr_fdatasync = 75;
syscall_nr_truncate = 76;
syscall_nr_ftruncate = 77;
syscall_nr_ftruncate64 = syscall_nr_ftruncate;
syscall_nr_getcwd = 79;
syscall_nr_chdir = 80;
syscall_nr_fchdir = 81;
syscall_nr_fchmod = 91;
syscall_nr_fchown = 93;
syscall_nr_umask = 95;
syscall_nr_gettimeofday = 96;
syscall_nr_getrlimit = 97;
syscall_nr_getrusage = 98;
syscall_nr_sysinfo = 99;
syscall_nr_times = 100;
syscall_nr_ptrace = 101;
syscall_nr_getuid = 102;
syscall_nr_getgid = 104;
syscall_nr_geteuid = 107;
syscall_nr_getegid = 108;
syscall_nr_setpgid = 109;
syscall_nr_getppid = 110;
syscall_nr_setsid = 112;
syscall_nr_setregid = 114;
syscall_nr_getgroups = 115;
syscall_nr_setresuid = 117;
syscall_nr_getresuid = 118;
syscall_nr_getresgid = 120;
syscall_nr_getpgid = 121;
syscall_nr_getsid = 124;
syscall_nr_capget = 125;
syscall_nr_capset = 126;
syscall_nr_rt_sigpending = 127;
syscall_nr_rt_sigtimedwait = 128;
syscall_nr_rt_sigqueueinfo = 129;
syscall_nr_rt_sigsuspend = 130;
syscall_nr_sigaltstack = 131;
syscall_nr_personality = 135;
syscall_nr_statfs = 137;
syscall_nr_fstatfs = 138;
syscall_nr_getpriority = 140;
syscall_nr_setpriority = 141;
syscall_nr_sched_setparam = 142;
syscall_nr_sched_getparam = 143;
syscall_nr_sched_setscheduler = 144;
syscall_nr_sched_getscheduler = 145;
syscall_nr_sched_get_priority_max = 146;
syscall_nr_sched_get_priority_min = 147;
syscall_nr_sched_rr_get_interval = 148;
syscall_nr_mlock = 149;
syscall_nr_munlock = 150;
syscall_nr_mlockall = 151;
syscall_nr_munlockall = 152;
syscall_nr_pivot_root = 155;
syscall_nr_prctl = 157;
syscall_nr_arch_prctl = 158;
syscall_nr_setrlimit = 160;
syscall_nr_sync = 162;
syscall_nr_quotactl = 179;
syscall_nr_gettid = 186;
syscall_nr_readahead = 187;
syscall_nr_setxattr = 188;
syscall_nr_lsetxattr = 189;
syscall_nr_fsetxattr = 190;
syscall_nr_getxattr = 191;
syscall_nr_lgetxattr = 192;
syscall_nr_fgetxattr = 193;
syscall_nr_listxattr = 194;
syscall_nr_llistxattr = 195;
syscall_nr_flistxattr = 196;
syscall_nr_removexattr = 197;
syscall_nr_lremovexattr = 198;
syscall_nr_fremovexattr = 199;
syscall_nr_tkill = 200;
syscall_nr_futex = 202;
syscall_nr_sched_setaffinity = 203;
syscall_nr_sched_getaffinity = 204;
syscall_nr_io_setup = 206;
syscall_nr_io_destroy = 207;
syscall_nr_io_getevents = 208;
syscall_nr_io_submit = 209;
syscall_nr_io_cancel = 210;
syscall_nr_getdents64 = 217;
syscall_nr_set_tid_address = 218;
syscall_nr_restart_syscall = 219;
syscall_nr_fadvise64 = 221;
syscall_nr_timer_create = 222;
syscall_nr_timer_settime = 223;
syscall_nr_timer_gettime = 224;
syscall_nr_timer_getoverrun = 225;
syscall_nr_timer_delete = 226;
syscall_nr_clock_gettime = 228;
syscall_nr_clock_getres = 229;
syscall_nr_clock_nanosleep = 230;
syscall_nr_exit_group = 231;
syscall_nr_epoll_ctl = 233;
syscall_nr_tgkill = 234;
syscall_nr_waitid = 247;
syscall_nr_ioprio_set = 251;
syscall_nr_ioprio_get = 252;
syscall_nr_inotify_add_watch = 254;
syscall_nr_inotify_rm_watch = 255;
syscall_nr_openat = 257;
syscall_nr_mkdirat = 258;
syscall_nr_mknodat = 259;
syscall_nr_fchownat = 260;
syscall_nr_newfstatat = 262;
syscall_nr_fstatat = syscall_nr_newfstatat;
syscall_nr_fstatat64 = syscall_nr_newfstatat;
syscall_nr_unlinkat = 263;
syscall_nr_renameat = 264;
syscall_nr_linkat = 265;
syscall_nr_symlinkat = 266;
syscall_nr_readlinkat = 267;
syscall_nr_fchmodat = 268;
syscall_nr_faccessat = 269;
syscall_nr_pselect6 = 270;
syscall_nr_ppoll = 271;
syscall_nr_unshare = 272;
syscall_nr_splice = 275;
syscall_nr_tee = 276;
syscall_nr_sync_file_range = 277;
syscall_nr_vmsplice = 278;
syscall_nr_utimensat = 280;
syscall_nr_epoll_pwait = 281;
syscall_nr_timerfd_create = 283;
syscall_nr_fallocate = 285;
syscall_nr_fallocate64 = syscall_nr_fallocate;
syscall_nr_timerfd_settime = 286;
syscall_nr_timerfd_gettime = 287;
syscall_nr_accept4 = 288;
syscall_nr_signalfd4 = 289;
syscall_nr_eventfd2 = 290;
syscall_nr_eventfd = syscall_nr_eventfd2;
syscall_nr_epoll_create1 = 291;
syscall_nr_dup3 = 292;
syscall_nr_pipe2 = 293;
syscall_nr_inotify_init1 = 294;
syscall_nr_preadv = 295;
syscall_nr_pwritev = 296;
syscall_nr_rt_tgsigqueueinfo = 297;
syscall_nr_perf_event_open = 298;
syscall_nr_recvmmsg = 299;
syscall_nr_prlimit64 = 302;
syscall_nr_prlimit = syscall_nr_prlimit64;
syscall_nr_syncfs = 306;
syscall_nr_sendmmsg = 307;
syscall_nr_setns = 308;
syscall_nr_getcpu = 309;
syscall_nr_process_vm_readv = 310;
syscall_nr_process_vm_writev = 311;
syscall_nr_sched_setattr = 314;
syscall_nr_sched_getattr = 315;
syscall_nr_renameat2 = 316;
syscall_nr_seccomp = 317;
syscall_nr_getrandom = 318;
syscall_nr_memfd_create = 319;
syscall_nr_execveat = 322;
syscall_nr_mlock2 = 325;
syscall_nr_copy_file_range = 326;
syscall_nr_preadv2 = 327;
syscall_nr_pwritev2 = 328;
// The following syscalls are blocked by SECCOMP starting from Android 8.
// Do not use them, unless you know what you are doing.
const
syscall_nr_syslog = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_klogctl = 103 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setuid = 105 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgid = 106 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setreuid = 113 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setgroups = 116 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setresgid = 119 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsuid = 122 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setfsgid = 123 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_adjtimex = 159 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_chroot = 161 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_acct = 163 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_settimeofday = 164 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_mount = 165 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_umount2 = 166 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapon = 167 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_swapoff = 168 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_reboot = 169 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_sethostname = 170 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_setdomainname = 171 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_init_module = 175 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_delete_module = 176 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_settime = 227 deprecated 'This syscall is blocked on Android 8+';
syscall_nr_clock_adjtime = 305 deprecated 'This syscall is blocked on Android 8+';

View File

@ -88,7 +88,7 @@
{$pop}
{$ELSEIF defined(UNIX)}
{$ELSEIF defined(UNIX) and not defined(android)}
function getTempDir: string;
var

View File

@ -42,6 +42,11 @@ type
uc_flags : cULong;
uc_link : PUContext;
uc_stack : stack_t;
uc_mcontext : TSigContext;
uc_sigmask : sigset_t;
__padding : array[1..128 - sizeof(sigset_t)] of byte;
__pad : cULong;
{ The following field should be 16-byte-aligned. Currently the
directive for specifying alignment is buggy, so the preceding
field was added so that the record has the right size. }
uc_mcontext : TSigContext;
end;

View File

@ -15,21 +15,6 @@
**********************************************************************}
{$ifdef android}
const
syscall_nr_pread = syscall_nr_pread64;
syscall_nr_pwrite = syscall_nr_pwrite64;
{$ifndef cpumips}
syscall_nr_getuid = syscall_nr_getuid32;
syscall_nr_geteuid = syscall_nr_geteuid32;
syscall_nr_getgid = syscall_nr_getgid32;
syscall_nr_getegid = syscall_nr_getegid32;
syscall_nr_setuid = syscall_nr_setuid32;
syscall_nr_setgid = syscall_nr_setgid32;
syscall_nr_getgroups = syscall_nr_getgroups32;
{$endif cpumips}
{$endif android}
Function fpKill(Pid:pid_t;Sig:cint):cint;
{
Send signal 'sig' to a process, or a group of processes.
@ -52,11 +37,7 @@ Function fpSigPending(var nset: TSigSet):cint;
signals is set in SSet
}
begin
{$ifdef android}
fpsigpending:=do_syscall(syscall_nr_sigpending,TSysParam(@nset));
{$else}
fpsigpending:=do_syscall(syscall_nr_rt_sigpending,TSysParam(@nset));
{$endif android}
end;
function fpsigsuspend(const sigmask:TSigSet):cint;
@ -66,11 +47,7 @@ function fpsigsuspend(const sigmask:TSigSet):cint;
}
begin
{$ifdef android}
fpsigsuspend:= do_syscall(syscall_nr_sigsuspend,TSysParam(@sigmask));
{$else}
fpsigsuspend:= do_syscall(syscall_nr_rt_sigsuspend,TSysParam(@sigmask),TSysParam(8));
{$endif android}
end;
function fpsigtimedwait(const sigset:TSigSet;info:Psiginfo;timeout:Ptimespec):cint;
@ -320,7 +297,7 @@ end;
function fpgetpgrp : pid_t;
begin
{$if defined(generic_linux_syscalls) or defined(android)}
{$if defined(generic_linux_syscalls)}
fpgetpgrp:=do_syscall(syscall_nr_getpgid,0);
{$else}
fpgetpgrp:=do_syscall(syscall_nr_getpgrp);
@ -336,11 +313,7 @@ end;
function fpgetsid (pid:TPid): pid_t;
begin
{$ifdef android}
fpgetsid:=0;
{$else}
fpgetsid:=do_syscall(syscall_nr_getsid,pid);
{$endif android}
end;
Function fpumask(cmask:mode_t):mode_t;
@ -389,7 +362,7 @@ end;
Function fpchown(path:pchar;owner:uid_t;group:gid_t):cint;
begin
{$if defined(generic_linux_syscalls) or defined(android)}
{$if defined(generic_linux_syscalls)}
fpChOwn:=do_syscall(syscall_nr_fchownat,AT_FDCWD,TSysParam(path),TSysParam(owner),TSysParam(group),0);
{$else}
fpChOwn:=do_syscall(syscall_nr_chown,TSysParam(path),TSysParam(owner),TSysParam(group));
@ -487,7 +460,7 @@ Function fpSelect(N:cint;readfds,writefds,exceptfds:pfdSet;TimeOut:PTimeVal):cin
Select checks whether the file descriptor sets in readfs/writefs/exceptfs
have changed.
}
{$if defined(generic_linux_syscalls)}
{$if defined(generic_linux_syscalls) and not defined(NO_SYSCALL_PSELECT6)}
var ts : timespec;
pts : PTimeSpec;
@ -522,7 +495,7 @@ end;
{$endif}
function fpPoll(fds: ppollfd; nfds: cuint; timeout: clong): cint;
{$if defined(generic_linux_syscalls)}
{$if defined(generic_linux_syscalls) and not defined(NO_SYSCALL_PPOLL)}
var ts : timespec;
begin
if timeout<0 then
@ -569,12 +542,12 @@ function fpNice(N:cint):cint;
Doesn't exist in BSD. Linux emu uses setpriority in a construct as below:
}
{$if defined(generic_linux_syscalls) or defined(cpux86_64) or defined(android)}
{$if defined(generic_linux_syscalls) or defined(cpux86_64)}
var
oldprio : cint;
{$endif}
begin
{$if defined(generic_linux_syscalls) or defined(cpux86_64) or defined(android)}
{$if defined(generic_linux_syscalls) or defined(cpux86_64)}
oldprio:=fpGetPriority(Prio_Process,0);
fpNice:=fpSetPriority(Prio_Process,0,oldprio+N);
if fpNice=0 then

View File

@ -110,6 +110,7 @@ const
wake UADDR2; }
{$ifndef FPC_USE_LIBC}
{$ifndef android}
function futex(uaddr:Pcint;op,val:cint;timeout:Ptimespec;addr2:Pcint;val3:cint):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
function futex(var uaddr;op,val:cint;timeout:Ptimespec;var addr2;val3:cint):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
function futex(var uaddr;op,val:cint;var timeout:Ttimespec;var addr2;val3:cint):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
@ -117,6 +118,7 @@ function futex(var uaddr;op,val:cint;var timeout:Ttimespec;var addr2;val3:cint):
function futex(uaddr:Pcint;op,val:cint;timeout:Ptimespec):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
function futex(var uaddr;op,val:cint;timeout:Ptimespec):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
function futex(var uaddr;op,val:cint;var timeout:Ttimespec):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
{$endif android}
{$else}
// futex is currently not exposed by glibc
//function futex(uaddr:Pcint;op,val:cint;timeout:Ptimespec;addr2:Pcint;val3:cint):cint; cdecl; external name 'futex';
@ -624,6 +626,8 @@ begin
fdatasync:=do_SysCall(syscall_nr_fdatasync, fd);
end;
{$ifndef android}
function futex(uaddr:Pcint;op,val:cint;timeout:Ptimespec;addr2:Pcint;val3:cint):cint;{$ifdef SYSTEMINLINE}inline;{$endif}
begin
@ -663,6 +667,8 @@ begin
futex:=do_syscall(syscall_nr_futex,Tsysparam(@uaddr),Tsysparam(op),Tsysparam(val),Tsysparam(@timeout));
end;
{$endif android}
{$else}
{Libc case.}
@ -753,12 +759,6 @@ begin
clock_settime:=do_SysCall(syscall_nr_clock_settime,tsysparam(clk_id),tsysparam(tp));
end;
{$if defined(android) and not defined(cpumips)}
const
syscall_nr_setregid = syscall_nr_setregid32;
syscall_nr_setreuid = syscall_nr_setreuid32;
{$endif}
function setregid(rgid,egid : uid_t): cint;
begin

View File

@ -12,6 +12,8 @@
**********************************************************************}
{$ifndef generic_linux_syscalls}
{$define FPC_BASEUNIX_HAS_FPPIPE}
Function fppipe(var fildes : tfildes):cint;assembler;
{
@ -46,3 +48,5 @@ asm
sw $v1,4($t1)
.L2:
end;
{$endif generic_linux_syscalls}

View File

@ -95,12 +95,15 @@
{$endif cpusparc64}
{$ifdef android}
{$define generic_linux_syscalls}
{$ifdef cpuarm}
{$define NO_SYSCALL_PSELECT6}
{$define NO_SYSCALL_PPOLL}
{$endif cpuarm}
{$define userenameat}
{$undef usestime}
{$undef OLDMMAP}
{$define MMAP2}
{$define NO_SYSCALL_UTIME}
{$ifndef cpumips}
{$define NO_SYSCALL_GETRLIMIT}
{$ifndef cpu64}
{$define MMAP2}
{$endif}
{$define FPC_USEGETTIMEOFDAY}
{$endif android}

View File

@ -249,13 +249,21 @@ asm
end;
{$endif cpusparc or cpusparc64}
{$ifndef android}
{$if defined(android)}
{$if defined(cpux86_64)}
{$define NEED_USER_TRAMPOLINE}
{$endif}
{$else not android}
{$if defined(cpui386) or defined(cpuarm) or defined(cpux86_64)}
{$define NEED_USER_TRAMPOLINE}
{$endif}
{$if defined(cpui386) or defined(cpuarm)}
{$define NEED_USER_TRAMPOLINE_RT_DIFFERENT}
{$endif}
{$endif android}
{$ifdef NEED_USER_TRAMPOLINE}

View File

@ -274,7 +274,7 @@ procedure UnhookSignal(RtlSigNum: Integer; OnlyIfHooked: Boolean = True);
fillchar(act,sizeof(act),0);
pointer(act.sa_handler):=pointer(SIG_DFL);
end;
if (fpsigaction(rtlsig2ossig[RtlSigNum],@act,nil)=0) then
if (fpsigaction(rtlsig2ossig[i],@act,nil)=0) then
siginfo[i].hooked:=false;
end;
end;

View File

@ -16,9 +16,6 @@ Unit Unix;
Interface
Uses
{$ifdef android}
cwstring,
{$endif android}
BaseUnix,UnixType;
// If you deprecated new symbols, please annotate the version.
// this makes it easier to decide if they can already be removed.

File diff suppressed because it is too large Load Diff

View File

@ -461,9 +461,7 @@ else
ifeq ($(CPU_TARGET),i386)
BINUTILSPREFIX=i686-linux-android-
else
ifeq ($(CPU_TARGET),mipsel)
BINUTILSPREFIX=mipsel-linux-android-
endif
BINUTILSPREFIX=$(CPU_TARGET)-linux-android-
endif
endif
endif

View File

@ -143,7 +143,7 @@ interface
{ wii } ( false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false),
{ aix } ( false, false, true, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false),
{ java } ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false),
{ android } ( true, false, false, false, false, true, false, false, false, false, false, true, false, false, true, false, false, false, false),
{ android } ( true, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false),
{ msdos } ( false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true , false, false, false),
{ aros } ( true, false, false, false, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false),
{dragonfly} ( false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false),