Ver Fonte

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 -

yury há 6 anos atrás
pai
commit
0654857ce1
50 ficheiros alterados com 2254 adições e 1714 exclusões
  1. 5 7
      .gitattributes
  2. 1 1
      compiler/aarch64/agcpugas.pas
  3. 3 0
      compiler/aarch64/cputarg.pas
  4. 1 0
      compiler/fpcdefs.inc
  5. 4 5
      compiler/options.pas
  6. 7 1
      compiler/systems.inc
  7. 9 1
      compiler/systems.pas
  8. 142 0
      compiler/systems/i_android.pas
  9. 16 2
      compiler/systems/t_android.pas
  10. 7 1
      compiler/utils/ppuutils/ppudump.pp
  11. 2 1
      compiler/x86/agx86att.pas
  12. 1 1
      compiler/x86_64/cpuelf.pas
  13. 3 0
      compiler/x86_64/cputarg.pas
  14. 18 0
      packages/fcl-net/src/netdb.pp
  15. 1 1
      packages/fpmkunit/src/fpmkunit.pp
  16. 5 1
      packages/rtl-extra/src/android/clocale.pp
  17. 0 239
      packages/rtl-extra/src/android/unixsock.inc
  18. 4 0
      packages/rtl-extra/src/android/unxsockh.inc
  19. 2 0
      rtl/Makefile.fpc
  20. 13 5
      rtl/android/Makefile
  21. 13 5
      rtl/android/Makefile.fpc
  22. 247 0
      rtl/android/aarch64/sysnr.inc
  23. 0 98
      rtl/android/arm/dllprt0.as
  24. 0 110
      rtl/android/arm/prt0.as
  25. 283 214
      rtl/android/arm/sysnr.inc
  26. 48 5
      rtl/android/cwstring.pp
  27. 25 0
      rtl/android/dllprt0.as
  28. 0 92
      rtl/android/i386/dllprt0.as
  29. 0 98
      rtl/android/i386/prt0.as
  30. 267 201
      rtl/android/i386/sysnr.inc
  31. 249 0
      rtl/android/mips64/sysnr.inc
  32. 0 95
      rtl/android/mipsel/dllprt0.as
  33. 0 57
      rtl/android/mipsel/prt0.as
  34. 267 217
      rtl/android/mipsel/sysnr.inc
  35. 34 0
      rtl/android/prt0.as
  36. 107 23
      rtl/android/sysandroid.inc
  37. 12 11
      rtl/android/unixandroid.inc
  38. 249 0
      rtl/android/x86_64/sysnr.inc
  39. 1 1
      rtl/inc/isotmp.inc
  40. 6 1
      rtl/linux/aarch64/sighndh.inc
  41. 6 33
      rtl/linux/bunxsysc.inc
  42. 6 6
      rtl/linux/linux.pp
  43. 4 0
      rtl/linux/mips/bsyscall.inc
  44. 8 5
      rtl/linux/osdefs.inc
  45. 9 1
      rtl/linux/ossysc.inc
  46. 1 1
      rtl/unix/sysutils.pp
  47. 0 3
      rtl/unix/unix.pp
  48. 166 167
      utils/fpcm/fpcmake.inc
  49. 1 3
      utils/fpcm/fpcmake.ini
  50. 1 1
      utils/fpcm/fpcmmain.pp

+ 5 - 7
.gitattributes

@@ -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

+ 1 - 1
compiler/aarch64/agcpugas.pas

@@ -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 : '// ';

+ 3 - 0
compiler/aarch64/cputarg.pas

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

+ 1 - 0
compiler/fpcdefs.inc

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

+ 4 - 5
compiler/options.pas

@@ -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 }

+ 7 - 1
compiler/systems.inc

@@ -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

+ 9 - 1
compiler/systems.pas

@@ -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}

+ 142 - 0
compiler/systems/i_android.pas

@@ -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);

+ 16 - 2
compiler/systems/t_android.pas

@@ -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);

+ 7 - 1
compiler/utils/ppuutils/ppudump.pp

@@ -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

+ 2 - 1
compiler/x86/agx86att.pas

@@ -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 : '# ';

+ 1 - 1
compiler/x86_64/cpuelf.pas

@@ -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 : '';

+ 3 - 0
compiler/x86_64/cputarg.pas

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

+ 18 - 0
packages/fcl-net/src/netdb.pp

@@ -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))

+ 1 - 1
packages/fpmkunit/src/fpmkunit.pp

@@ -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),

+ 5 - 1
packages/rtl-extra/src/android/clocale.pp

@@ -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;

+ 0 - 239
packages/rtl-extra/src/android/unixsock.inc

@@ -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}
-

+ 4 - 0
packages/rtl-extra/src/android/unxsockh.inc

@@ -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;

+ 2 - 0
rtl/Makefile.fpc

@@ -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

+ 13 - 5
rtl/android/Makefile

@@ -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

+ 13 - 5
rtl/android/Makefile.fpc

@@ -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)

+ 247 - 0
rtl/android/aarch64/sysnr.inc

@@ -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+';

+ 0 - 98
rtl/android/arm/dllprt0.as

@@ -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

+ 0 - 110
rtl/android/arm/prt0.as

@@ -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

+ 283 - 214
rtl/android/arm/sysnr.inc

@@ -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_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_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_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+';

+ 48 - 5
rtl/android/cwstring.pp

@@ -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 - 0
rtl/android/dllprt0.as

@@ -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

+ 0 - 92
rtl/android/i386/dllprt0.as

@@ -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

+ 0 - 98
rtl/android/i386/prt0.as

@@ -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

+ 267 - 201
rtl/android/i386/sysnr.inc

@@ -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_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_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_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+';

+ 249 - 0
rtl/android/mips64/sysnr.inc

@@ -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+';

+ 0 - 95
rtl/android/mipsel/dllprt0.as

@@ -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

+ 0 - 57
rtl/android/mipsel/prt0.as

@@ -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

+ 267 - 217
rtl/android/mipsel/sysnr.inc

@@ -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                         = (__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_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_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 - 0
rtl/android/prt0.as

@@ -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

+ 107 - 23
rtl/android/sysandroid.inc

@@ -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;

+ 12 - 11
rtl/android/unixandroid.inc

@@ -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;

+ 249 - 0
rtl/android/x86_64/sysnr.inc

@@ -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+';

+ 1 - 1
rtl/inc/isotmp.inc

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

+ 6 - 1
rtl/linux/aarch64/sighndh.inc

@@ -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;

+ 6 - 33
rtl/linux/bunxsysc.inc

@@ -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

+ 6 - 6
rtl/linux/linux.pp

@@ -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

+ 4 - 0
rtl/linux/mips/bsyscall.inc

@@ -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}

+ 8 - 5
rtl/linux/osdefs.inc

@@ -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}

+ 9 - 1
rtl/linux/ossysc.inc

@@ -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}

+ 1 - 1
rtl/unix/sysutils.pp

@@ -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;

+ 0 - 3
rtl/unix/unix.pp

@@ -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.

Diff do ficheiro suprimidas por serem muito extensas
+ 166 - 167
utils/fpcm/fpcmake.inc


+ 1 - 3
utils/fpcm/fpcmake.ini

@@ -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

+ 1 - 1
utils/fpcm/fpcmmain.pp

@@ -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),

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff