diff --git a/gcc/ada/adadecode.c b/gcc/ada/adadecode.c
index a63b7e7641b0..92155ef2025a 100644
--- a/gcc/ada/adadecode.c
+++ b/gcc/ada/adadecode.c
@@ -29,6 +29,7 @@
  *                                                                          *
  ****************************************************************************/
 
+#include "adaint.h"  /* for a macro version of xstrdup.  */
 
 #if defined(IN_RTS)
 #include "tconfig.h"
@@ -42,8 +43,6 @@
 #include <stdio.h>
 #include <ctype.h>
 
-#include "adaint.h"  /* for a macro version of xstrdup.  */
-
 #ifndef ISDIGIT
 #define ISDIGIT(c) isdigit(c)
 #endif
diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c
index 414346558654..2586a1368903 100644
--- a/gcc/ada/adaint.c
+++ b/gcc/ada/adaint.c
@@ -85,6 +85,8 @@
 #define _LARGEFILE64_SOURCE 1
 #endif
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -202,8 +204,6 @@ UINT __gnat_current_ccs_encoding;
 #include <utime.h>
 #endif
 
-#include "adaint.h"
-
 /* Define symbols O_BINARY and O_TEXT as harmless zeroes if they are not
    defined in the current system. On DOS-like systems these flags control
    whether the file is opened/created in text-translation mode (CR/LF in
diff --git a/gcc/ada/adaint.h b/gcc/ada/adaint.h
index 0d12f7e90209..74182446d4ac 100644
--- a/gcc/ada/adaint.h
+++ b/gcc/ada/adaint.h
@@ -316,6 +316,7 @@ extern void   *__gnat_lwp_self			   (void);
 
 /* Routines for interface to required CPU set primitives */
 
+#define _GNU_SOURCE
 #include <sched.h>
 
 extern cpu_set_t *__gnat_cpu_alloc                 (size_t);
diff --git a/gcc/ada/argv.c b/gcc/ada/argv.c
index f62cf1eb37dc..0b6c5fe6f0df 100644
--- a/gcc/ada/argv.c
+++ b/gcc/ada/argv.c
@@ -42,6 +42,8 @@
    main program, and these routines are accessed from the
    Ada.Command_Line.Environment package.  */
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -51,8 +53,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/gcc/ada/cio.c b/gcc/ada/cio.c
index ff97abe36ef1..56aa3477c8cd 100644
--- a/gcc/ada/cio.c
+++ b/gcc/ada/cio.c
@@ -29,6 +29,8 @@
  *                                                                          *
  ****************************************************************************/
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -38,8 +40,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
-
 /* We need L_tmpnam definition */
 #include <stdio.h>
 
diff --git a/gcc/ada/cstreams.c b/gcc/ada/cstreams.c
index cdcb531e2b3f..dde6b9948089 100644
--- a/gcc/ada/cstreams.c
+++ b/gcc/ada/cstreams.c
@@ -52,6 +52,8 @@
 #include "vxWorks.h"
 #endif
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -61,8 +63,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/gcc/ada/exit.c b/gcc/ada/exit.c
index 6274571c6f04..336b0f8f386b 100644
--- a/gcc/ada/exit.c
+++ b/gcc/ada/exit.c
@@ -33,6 +33,8 @@
 #include "vxWorks.h"
 #endif
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -42,8 +44,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
index 0258f106d404..0416244ae428 100644
--- a/gcc/ada/gcc-interface/Makefile.in
+++ b/gcc/ada/gcc-interface/Makefile.in
@@ -1574,7 +1574,7 @@ ifeq ($(strip $(filter-out powerpc% linux%,$(target_cpu) $(target_os))),)
 endif
 
 # ARM linux, GNU eabi
-ifeq ($(strip $(filter-out arm% linux-gnueabi%,$(target_cpu) $(target_os))),)
+ifeq ($(strip $(filter-out arm% linux-gnueabi% linux-musleabi% linux-muslgnueabi%,$(target_cpu) $(target_os))),)
   LIBGNAT_TARGET_PAIRS = \
   a-intnam.ads<libgnarl/a-intnam__linux.ads \
   s-inmaop.adb<libgnarl/s-inmaop__posix.adb \
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 5088ecffc4f1..02a45b3ce7ca 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -53,6 +53,8 @@
 #undef __linux__
 #endif
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -65,7 +67,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
 #include "raise.h"
 
 #ifdef __cplusplus
diff --git a/gcc/ada/libgnarl/s-osinte__linux.ads b/gcc/ada/libgnarl/s-osinte__linux.ads
index 5bf4a5fe1d26..c52cc70dfbab 100644
--- a/gcc/ada/libgnarl/s-osinte__linux.ads
+++ b/gcc/ada/libgnarl/s-osinte__linux.ads
@@ -394,12 +394,6 @@ package System.OS_Interface is
    PTHREAD_RWLOCK_PREFER_WRITER_NP              : constant := 1;
    PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP : constant := 2;
 
-   function pthread_rwlockattr_setkind_np
-     (attr : access pthread_rwlockattr_t;
-      pref : int) return int;
-   pragma Import
-     (C, pthread_rwlockattr_setkind_np, "pthread_rwlockattr_setkind_np");
-
    function pthread_rwlock_init
      (mutex : access pthread_rwlock_t;
       attr  : access pthread_rwlockattr_t) return int;
@@ -464,11 +458,6 @@ package System.OS_Interface is
       protocol : int) return int;
    pragma Import (C, pthread_mutexattr_setprotocol);
 
-   function pthread_mutexattr_setprioceiling
-     (attr        : access pthread_mutexattr_t;
-      prioceiling : int) return int;
-   pragma Import (C, pthread_mutexattr_setprioceiling);
-
    type struct_sched_param is record
       sched_priority : int;  --  scheduling priority
    end record;
diff --git a/gcc/ada/libgnarl/s-taprop__linux.adb b/gcc/ada/libgnarl/s-taprop__linux.adb
index e55cd65e54f6..32d72b3980a6 100644
--- a/gcc/ada/libgnarl/s-taprop__linux.adb
+++ b/gcc/ada/libgnarl/s-taprop__linux.adb
@@ -202,9 +202,6 @@ package body System.Task_Primitives.Operations is
    pragma Import
      (C, GNAT_pthread_condattr_setup, "__gnat_pthread_condattr_setup");
 
-   function GNAT_has_cap_sys_nice return C.int;
-   pragma Import
-     (C, GNAT_has_cap_sys_nice, "__gnat_has_cap_sys_nice");
    --  We do not have pragma Linker_Options ("-lcap"); here, because this
    --  library is not present on many Linux systems. 'libcap' is the Linux
    --  "capabilities" library, called by __gnat_has_cap_sys_nice.
@@ -214,38 +211,6 @@ package body System.Task_Primitives.Operations is
    --  Convert Ada priority to Linux priority. Priorities are 1 .. 99 on
    --  GNU/Linux, so we map 0 .. 98 to 1 .. 99.
 
-   function Get_Ceiling_Support return Boolean;
-   --  Get the value of the Ceiling_Support constant (see below).
-   --  Note well: If this function or related code is modified, it should be
-   --  tested by hand, because automated testing doesn't exercise it.
-
-   -------------------------
-   -- Get_Ceiling_Support --
-   -------------------------
-
-   function Get_Ceiling_Support return Boolean is
-      Ceiling_Support : Boolean := False;
-   begin
-      if Locking_Policy /= 'C' then
-         return False;
-      end if;
-
-      declare
-         function geteuid return Integer;
-         pragma Import (C, geteuid, "geteuid");
-         Superuser : constant Boolean := geteuid = 0;
-         Has_Cap : constant C.int := GNAT_has_cap_sys_nice;
-         pragma Assert (Has_Cap in 0 | 1);
-      begin
-         Ceiling_Support := Superuser or else Has_Cap = 1;
-      end;
-
-      return Ceiling_Support;
-   end Get_Ceiling_Support;
-
-   pragma Warnings (Off, "non-static call not allowed in preelaborated unit");
-   Ceiling_Support : constant Boolean := Get_Ceiling_Support;
-   pragma Warnings (On, "non-static call not allowed in preelaborated unit");
    --  True if the locking policy is Ceiling_Locking, and the current process
    --  has permission to use this policy. The process has permission if it is
    --  running as 'root', or if the capability was set by the setcap command,
@@ -348,7 +313,9 @@ package body System.Task_Primitives.Operations is
    -- Init_Mutex --
    ----------------
 
+   pragma Warnings (Off, "formal parameter * is not referenced");
    function Init_Mutex (L : RTS_Lock_Ptr; Prio : Any_Priority) return C.int is
+   pragma Warnings (On, "formal parameter * is not referenced");
       Mutex_Attr : aliased pthread_mutexattr_t;
       Result, Result_2 : C.int;
 
@@ -360,16 +327,7 @@ package body System.Task_Primitives.Operations is
          return Result;
       end if;
 
-      if Ceiling_Support then
-         Result := pthread_mutexattr_setprotocol
-           (Mutex_Attr'Access, PTHREAD_PRIO_PROTECT);
-         pragma Assert (Result = 0);
-
-         Result := pthread_mutexattr_setprioceiling
-           (Mutex_Attr'Access, Prio_To_Linux_Prio (Prio));
-         pragma Assert (Result = 0);
-
-      elsif Locking_Policy = 'I' then
+      if Locking_Policy = 'I' then
          Result := pthread_mutexattr_setprotocol
            (Mutex_Attr'Access, PTHREAD_PRIO_INHERIT);
          pragma Assert (Result = 0);
@@ -409,11 +367,6 @@ package body System.Task_Primitives.Operations is
             Result := pthread_rwlockattr_init (RWlock_Attr'Access);
             pragma Assert (Result = 0);
 
-            Result := pthread_rwlockattr_setkind_np
-              (RWlock_Attr'Access,
-               PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
-            pragma Assert (Result = 0);
-
             Result := pthread_rwlock_init (L.RW'Access, RWlock_Attr'Access);
 
             pragma Assert (Result in 0 | ENOMEM);
diff --git a/gcc/ada/libgnat/s-dwalin.adb b/gcc/ada/libgnat/s-dwalin.adb
index a857b67132af..1e2bb4c545ad 100644
--- a/gcc/ada/libgnat/s-dwalin.adb
+++ b/gcc/ada/libgnat/s-dwalin.adb
@@ -382,7 +382,7 @@ package body System.Dwarf_Lines is
 
    function Low (C : Dwarf_Context) return Address is
    begin
-      return C.Low;
+      return To_Address (To_Integer (C.Low) + C.Load_Slide);
    end Low;
 
    ----------
@@ -1210,19 +1210,21 @@ package body System.Dwarf_Lines is
                --  Discard symbols whose length is 0
                Sz := uint32 (Size (S));
 
-               --  Try to filter symbols at the same address. This is a best
-               --  effort as they might not be consecutive.
-               Addr := uint32 (Value (S) - uint64 (C.Low));
-               if Sz > 0 and then Addr /= Prev_Addr then
-                  Nbr_Symbols := Nbr_Symbols + 1;
-                  Prev_Addr   := Addr;
-
-                  if Phase = 2 then
-                     C.Cache (Nbr_Symbols) :=
-                       (First => Addr,
-                        Size  => Sz,
-                        Sym   => uint32 (Off (S)),
-                        Line  => 0);
+               if Sz > 0 then
+                  --  Try to filter symbols at the same address. This is a best
+                  --  effort as they might not be consecutive.
+                  Addr := uint32 (Value (S) - uint64 (C.Low));
+                  if Addr /= Prev_Addr then
+                     Nbr_Symbols := Nbr_Symbols + 1;
+                     Prev_Addr   := Addr;
+
+                     if Phase = 2 then
+                        C.Cache (Nbr_Symbols) :=
+                          (First => Addr,
+                           Size  => Sz,
+                           Sym   => uint32 (Off (S)),
+                           Line  => 0);
+                     end if;
                   end if;
                end if;
 
@@ -1267,6 +1269,10 @@ package body System.Dwarf_Lines is
             --  Read table
             loop
                Read_Aranges_Entry (C, Ar_Start, Ar_Len);
+               --  Skip references to discarded sections
+               while Ar_Start = 0 and Ar_Len /= 0 loop
+                  Read_Aranges_Entry (C, Ar_Start, Ar_Len);
+               end loop;
                exit when Ar_Start = 0 and Ar_Len = 0;
 
                Len   := uint32 (Ar_Len);
diff --git a/gcc/ada/libgnat/s-trasym__dwarf.adb b/gcc/ada/libgnat/s-trasym__dwarf.adb
index db7c5eb4cdd8..3cd60ecbc37b 100644
--- a/gcc/ada/libgnat/s-trasym__dwarf.adb
+++ b/gcc/ada/libgnat/s-trasym__dwarf.adb
@@ -123,7 +123,8 @@ package body System.Traceback.Symbolic is
    --  Return the String contained in Item, up until the first NUL character
 
    pragma Warnings (Off, "*Add_Module_To_Cache*");
-   procedure Add_Module_To_Cache (Module_Name : String);
+   procedure Add_Module_To_Cache (Module_Name  : String;
+                                  Load_Address : System.Address);
    --  To be called by Build_Cache_For_All_Modules to add a new module to the
    --  list. May not be referenced.
 
@@ -217,12 +218,13 @@ package body System.Traceback.Symbolic is
    -- Add_Module_To_Cache --
    -------------------------
 
-   procedure Add_Module_To_Cache (Module_Name : String) is
+   procedure Add_Module_To_Cache (Module_Name  : String;
+                                  Load_Address : System.Address) is
       Module  : Module_Cache_Acc;
       Success : Boolean;
    begin
       Module := new Module_Cache;
-      Init_Module (Module.all, Success, Module_Name);
+      Init_Module (Module.all, Success, Module_Name, Load_Address);
       if not Success then
          Free (Module);
          return;
diff --git a/gcc/ada/libgnat/s-tsmona__linux.adb b/gcc/ada/libgnat/s-tsmona__linux.adb
index cbebd0652048..c882aa64a6e2 100644
--- a/gcc/ada/libgnat/s-tsmona__linux.adb
+++ b/gcc/ada/libgnat/s-tsmona__linux.adb
@@ -87,45 +87,49 @@ package body Module_Name is
    -- Build_Cache_For_All_Modules --
    ---------------------------------
 
-   procedure Build_Cache_For_All_Modules is
-      type link_map;
-      type link_map_acc is access all link_map;
-      pragma Convention (C, link_map_acc);
-
-      type link_map is record
-         l_addr : Address;
-         --  Base address of the shared object
-
-         l_name : Address;
-         --  Null-terminated absolute file name
-
-         l_ld   : Address;
-         --  Dynamic section
-
-         l_next, l_prev : link_map_acc;
-         --  Chain
-      end record;
-      pragma Convention (C, link_map);
-
-      type r_debug_type is record
-         r_version : Integer;
-         r_map : link_map_acc;
-      end record;
-      pragma Convention (C, r_debug_type);
+   type dl_phdr_info is record
+      dlpi_addr  : Address;
+      dlpi_name  : Address;
+      dlpi_phdr  : Address;
+      dlpi_phnum : unsigned_short;
+   end record;
+   pragma Convention (C, dl_phdr_info);
+
+   type Callback_Type is access function
+     (info : not null access dl_phdr_info;
+      size : size_t;
+      data : Address) return int;
+   pragma Convention (C, Callback_Type);
+
+   function Build_Cache_Callback
+     (info : not null access dl_phdr_info;
+      size : size_t;
+      data : Address) return int;
+   pragma Convention (C, Build_Cache_Callback);
+
+   function Build_Cache_Callback
+     (info : not null access dl_phdr_info;
+      size : size_t;
+      data : Address) return int is
+      pragma Unreferenced (size);
+      pragma Unreferenced (data);
+   begin
+      if Big_String_Conv.To_Pointer (info.dlpi_name) (1) /= ASCII.NUL then
+         --  Discard non-file (like the executable itself or the gate).
+         Add_Module_To_Cache (Value (info.dlpi_name), info.dlpi_addr);
+      end if;
+      return 0;
+   end Build_Cache_Callback;
 
-      r_debug : r_debug_type;
-      pragma Import (C, r_debug, "_r_debug");
+   function dl_iterate_phdr
+     (callback : Callback_Type;
+      data     : Address) return int;
+   pragma Import (C, dl_iterate_phdr, "dl_iterate_phdr");
 
-      lm : link_map_acc;
+   procedure Build_Cache_For_All_Modules is
+      unused : int;
    begin
-      lm := r_debug.r_map;
-      while lm /= null loop
-         if Big_String_Conv.To_Pointer (lm.l_name) (1) /= ASCII.NUL then
-            --  Discard non-file (like the executable itself or the gate).
-            Add_Module_To_Cache (Value (lm.l_name));
-         end if;
-         lm := lm.l_next;
-      end loop;
+      unused := dl_iterate_phdr (Build_Cache_Callback'Access, Null_Address);
    end Build_Cache_For_All_Modules;
 
    ---------
diff --git a/gcc/ada/mkdir.c b/gcc/ada/mkdir.c
index c101d968a851..43cdd51e8320 100644
--- a/gcc/ada/mkdir.c
+++ b/gcc/ada/mkdir.c
@@ -34,6 +34,8 @@
 #include <version.h>
 #endif /* __vxworks */
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -53,8 +55,6 @@
 #endif
 #endif
 
-#include "adaint.h"
-
 /*  This function provides a portable binding to the mkdir function.  */
 
 int
diff --git a/gcc/ada/raise.c b/gcc/ada/raise.c
index 70ad6cd3282a..eb92de1b2137 100644
--- a/gcc/ada/raise.c
+++ b/gcc/ada/raise.c
@@ -32,6 +32,8 @@
 /* Shared routines to support exception handling.  __gnat_unhandled_terminate
    is shared between all exception handling mechanisms.  */
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #include "tconfig.h"
 #include "tsystem.h"
@@ -40,7 +42,6 @@
 #include "system.h"
 #endif
 
-#include "adaint.h"
 #include "raise.h"
 
 #ifdef __cplusplus
diff --git a/gcc/ada/sysdep.c b/gcc/ada/sysdep.c
index 98b3901cb16f..98db6a14c2d5 100644
--- a/gcc/ada/sysdep.c
+++ b/gcc/ada/sysdep.c
@@ -52,6 +52,8 @@
 #undef __linux__
 #endif
 
+#include "adaint.h"
+
 #ifdef IN_RTS
 #define POSIX
 #include "tconfig.h"
@@ -72,8 +74,6 @@
 extern struct tm *localtime_r(const time_t *, struct tm *);
 #endif
 
-#include "adaint.h"
-
 /* Don't use macros versions of this functions on VxWorks since they cause
    imcompatible changes in some VxWorks versions */
 #ifdef __vxworks
diff --git a/gcc/ada/terminals.c b/gcc/ada/terminals.c
index 7025f57d645e..074845584958 100644
--- a/gcc/ada/terminals.c
+++ b/gcc/ada/terminals.c
@@ -1112,7 +1112,6 @@ __gnat_setup_winsize (void *desc, int rows, int columns)
    (HP-UX) */
 #if !defined (__hpux__) && !defined (BSD) && !defined (__APPLE__) \
   && !defined (__rtems__) && !defined (__QNXNTO__)
-#   include <termio.h>
 #endif
 
 #include <sys/ioctl.h>
@@ -1159,7 +1158,8 @@ __gnat_setup_winsize (void *desc, int rows, int columns)
 #if defined (__APPLE__) || defined (BSD)
 #define USE_OPENPTY
 #elif defined (__linux__)
-#define USE_GETPT
+#include <pty.h>
+#define USE_OPENPTY
 #elif defined (__sun__)
 #define USE_CLONE_DEVICE "/dev/ptmx"
 #elif defined (_AIX)