]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mlib-tgt-darwin.adb: New file.
authorNicolas Setton <setton@act-europe.fr>
Wed, 27 Oct 2004 12:27:53 +0000 (14:27 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 27 Oct 2004 12:27:53 +0000 (14:27 +0200)
2004-10-26  Nicolas Setton  <setton@act-europe.fr>

* mlib-tgt-darwin.adb: New file.

* mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb,
mlib-tgt-vms-alpha.adb, mlib-tgt-vms-ia64.adb,
mlib-tgt-mingw.adb, mlib-tgt-vxworks.adb (Archive_Indexer_Options): New
subprogram body.

* Makefile.in: Add support for building shared libraries under Darwin.
(EXTRA_GNATRTL_NONTASKING_OBJS, ppc-vxworks): Add s-vxwexc.o, containing
the low level EH init subprogram to be called from __gnat_initialize.

* mlib-tgt.ads, mlib-tgt.adb (Archive_Indexer_Options): New subprogram,
indicates which options to pass to the archive indexer.

* mlib-utl.adb: Add support for calling ranlib with additional
options. This is needed for instance under Mac OS X.
(Ranlib_Options): New global variable, used to store the potential
options to pass to ranlib.
(Ar): Use Ranlib_Options when spawning ranlib.
(Initialize): Set the value of ranlib option.

From-SVN: r89639

15 files changed:
gcc/ada/Makefile.in
gcc/ada/mlib-tgt-aix.adb
gcc/ada/mlib-tgt-darwin.adb [new file with mode: 0644]
gcc/ada/mlib-tgt-hpux.adb
gcc/ada/mlib-tgt-irix.adb
gcc/ada/mlib-tgt-linux.adb
gcc/ada/mlib-tgt-mingw.adb
gcc/ada/mlib-tgt-solaris.adb
gcc/ada/mlib-tgt-tru64.adb
gcc/ada/mlib-tgt-vms-alpha.adb
gcc/ada/mlib-tgt-vms-ia64.adb
gcc/ada/mlib-tgt-vxworks.adb
gcc/ada/mlib-tgt.adb
gcc/ada/mlib-tgt.ads
gcc/ada/mlib-utl.adb

index 4c84b7c4ff29b96c9eda2dd523ca0ef5ab7ab505..45737fa0d0bb26b06d2cd2d7f5913ce87f5b6afb 100644 (file)
@@ -559,7 +559,7 @@ ifeq ($(strip $(filter-out powerpc% wrs vxworks,$(targ))),)
     s-tfsetr.adb<s-tfsetr-vxworks.adb 
   endif
 
-  EXTRA_GNATRTL_NONTASKING_OBJS=i-vxwork.o i-vxwoio.o
+  EXTRA_GNATRTL_NONTASKING_OBJS=i-vxwork.o i-vxwoio.o s-vxwexc.o
   EXTRA_GNATRTL_TASKING_OBJS=s-vxwork.o
 endif
 
@@ -1403,6 +1403,14 @@ ifeq ($(strip $(filter-out powerpc darwin%,$(arch) $(osys))),)
   s-tpopsp.adb<s-tpopsp-posix-foreign.adb \
   g-soccon.ads<g-soccon-aix.ads \
   system.ads<system-darwin-ppc.ads
+
+  TOOLS_TARGET_PAIRS =  \
+    mlib-tgt.adb<mlib-tgt-darwin.adb
+
+  GNATLIB_SHARED = gnatlib-shared-darwin
+  SO_OPTS = -Wl,-flat_namespace
+  RANLIB = ranlib -c
+  LIBRARY_VERSION := $(LIB_VERSION)
 endif
 
 # The runtime library for gnat comprises two directories.  One contains the
@@ -1874,6 +1882,28 @@ gnatlib-shared-win32:
                $(SO_OPTS)libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
                $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext)
 
+gnatlib-shared-darwin:
+       $(MAKE) $(FLAGS_TO_PASS) \
+            GNATLIBFLAGS="$(GNATLIBFLAGS)" \
+            GNATLIBCFLAGS="$(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS)" \
+            THREAD_KIND="$(THREAD_KIND)" \
+            gnatlib
+       $(RM) rts/libgnat$(soext) rts/libgnarl$(soext)
+       cd rts; ../../xgcc -B../../ -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \
+               -o libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
+               $(GNATRTL_NONTASKING_OBJS) $(LIBGNAT_OBJS) \
+               $(SO_OPTS) \
+               $(MISCLIB) -lm
+       cd rts; ../../xgcc -B../../ -dynamiclib $(TARGET_LIBGCC2_CFLAGS) \
+               -o libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
+               $(GNATRTL_TASKING_OBJS) \
+               $(SO_OPTS) \
+               $(THREADSLIB) -Wl,libgnat$(hyphen)$(LIBRARY_VERSION)$(soext)
+       cd rts; $(LN_S) libgnat$(hyphen)$(LIBRARY_VERSION)$(soext) \
+               libgnat$(soext)
+       cd rts; $(LN_S) libgnarl$(hyphen)$(LIBRARY_VERSION)$(soext) \
+               libgnarl$(soext)
+
 gnatlib-shared-vms:
        $(MAKE) $(FLAGS_TO_PASS) \
              GNATLIBFLAGS="$(GNATLIBFLAGS)" \
index a0afe8797506ebde44c0b19f90a02866ddb3a889..004cab8b9ade20d393e61d3f7e13fbb9f316001e 100644 (file)
@@ -110,6 +110,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
diff --git a/gcc/ada/mlib-tgt-darwin.adb b/gcc/ada/mlib-tgt-darwin.adb
new file mode 100644 (file)
index 0000000..96a41e4
--- /dev/null
@@ -0,0 +1,366 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                             M L I B . T G T                              --
+--                             (Darwin Version)                             --
+--                                                                          --
+--                                 B o d y                                  --
+--                                                                          --
+--              Copyright (C) 2001-2004, Free Software Foundation, Inc.     --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
+-- for  more details.  You should have  received  a copy of the GNU General --
+-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
+-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
+-- MA 02111-1307, USA.                                                      --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This package provides a set of target dependent routines to build
+--  static, dynamic and shared libraries.
+
+--  This is the Darwin version of the body.
+
+with MLib.Fil;
+with MLib.Utl;
+with Namet;  use Namet;
+with Opt;
+with Output; use Output;
+with Prj.Com;
+with System;
+
+package body MLib.Tgt is
+
+   use GNAT;
+   use MLib;
+
+   No_Arguments        : aliased Argument_List         := (1 .. 0 => null);
+   Empty_Argument_List : constant Argument_List_Access := No_Arguments'Access;
+
+   Wl_Init_String : aliased String         := "-Wl,-init";
+   Wl_Init        : constant String_Access := Wl_Init_String'Access;
+   Wl_Fini_String : aliased String         := "-Wl,-fini";
+   Wl_Fini        : constant String_Access := Wl_Fini_String'Access;
+
+   Init_Fini_List :  constant Argument_List_Access :=
+                       new Argument_List'(1 => Wl_Init,
+                                          2 => null,
+                                          3 => Wl_Fini,
+                                          4 => null);
+   --  Used to put switches for automatic elaboration/finalization
+
+   ---------------------
+   -- Archive_Builder --
+   ---------------------
+
+   function Archive_Builder return String is
+   begin
+      return "ar";
+   end Archive_Builder;
+
+   -----------------------------
+   -- Archive_Builder_Options --
+   -----------------------------
+
+   function Archive_Builder_Options return String_List_Access is
+   begin
+      return new String_List'(1 => new String'("cr"));
+   end Archive_Builder_Options;
+
+   -----------------
+   -- Archive_Ext --
+   -----------------
+
+   function Archive_Ext return  String is
+   begin
+      return "a";
+   end Archive_Ext;
+
+   ---------------------
+   -- Archive_Indexer --
+   ---------------------
+
+   function Archive_Indexer return String is
+   begin
+      return "ranlib";
+   end Archive_Indexer;
+
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List'(1 => new String'("-c"));
+   end Archive_Indexer_Options;
+
+   ---------------------------
+   -- Build_Dynamic_Library --
+   ---------------------------
+
+   procedure Build_Dynamic_Library
+     (Ofiles       : Argument_List;
+      Foreign      : Argument_List;
+      Afiles       : Argument_List;
+      Options      : Argument_List;
+      Options_2    : Argument_List;
+      Interfaces   : Argument_List;
+      Lib_Filename : String;
+      Lib_Dir      : String;
+      Symbol_Data  : Symbol_Record;
+      Driver_Name  : Name_Id := No_Name;
+      Lib_Version  : String  := "";
+      Auto_Init    : Boolean := False)
+   is
+      pragma Unreferenced (Foreign);
+      pragma Unreferenced (Afiles);
+      pragma Unreferenced (Interfaces);
+      pragma Unreferenced (Symbol_Data);
+
+      Lib_File : constant String :=
+                   Lib_Dir & Directory_Separator & "lib" &
+                   Fil.Ext_To (Lib_Filename, DLL_Ext);
+
+      Version_Arg          : String_Access;
+      Symbolic_Link_Needed : Boolean := False;
+
+      Init_Fini : Argument_List_Access := Empty_Argument_List;
+
+   begin
+      if Opt.Verbose_Mode then
+         Write_Str ("building relocatable shared library ");
+         Write_Line (Lib_File);
+      end if;
+
+      --  If specified, add automatic elaboration/finalization
+
+      if Auto_Init then
+         Init_Fini := Init_Fini_List;
+         Init_Fini (2) := new String'("-Wl," & Lib_Filename & "init");
+         Init_Fini (4) := new String'("-Wl," & Lib_Filename & "final");
+      end if;
+
+      if Lib_Version = "" then
+         Utl.Gcc
+           (Output_File => Lib_File,
+            Objects     => Ofiles,
+            Options     => Options & Init_Fini.all,
+            Driver_Name => Driver_Name,
+            Options_2   => Options_2);
+
+      else
+         Version_Arg := new String'("-Wl,-flat_namespace"); -- ???
+
+         if Is_Absolute_Path (Lib_Version) then
+            Utl.Gcc
+              (Output_File => Lib_Version,
+               Objects     => Ofiles,
+               Options     => Options & Version_Arg & Init_Fini.all,
+               Driver_Name => Driver_Name,
+               Options_2   => Options_2);
+            Symbolic_Link_Needed := Lib_Version /= Lib_File;
+
+         else
+            Utl.Gcc
+              (Output_File => Lib_Dir & Directory_Separator & Lib_Version,
+               Objects     => Ofiles,
+               Options     => Options & Version_Arg & Init_Fini.all,
+               Driver_Name => Driver_Name,
+               Options_2   => Options_2);
+            Symbolic_Link_Needed :=
+              Lib_Dir & Directory_Separator & Lib_Version /= Lib_File;
+         end if;
+
+         if Symbolic_Link_Needed then
+            declare
+               Success : Boolean;
+               Oldpath : String (1 .. Lib_Version'Length + 1);
+               Newpath : String (1 .. Lib_File'Length + 1);
+
+               Result : Integer;
+               pragma Unreferenced (Result);
+
+               function Symlink
+                 (Oldpath : System.Address;
+                  Newpath : System.Address) return Integer;
+               pragma Import (C, Symlink, "__gnat_symlink");
+
+            begin
+               Oldpath (1 .. Lib_Version'Length) := Lib_Version;
+               Oldpath (Oldpath'Last)            := ASCII.NUL;
+               Newpath (1 .. Lib_File'Length)    := Lib_File;
+               Newpath (Newpath'Last)            := ASCII.NUL;
+
+               Delete_File (Lib_File, Success);
+
+               Result := Symlink (Oldpath'Address, Newpath'Address);
+            end;
+         end if;
+      end if;
+   end Build_Dynamic_Library;
+
+   -------------
+   -- DLL_Ext --
+   -------------
+
+   function DLL_Ext return String is
+   begin
+      return "dylib";
+   end DLL_Ext;
+
+   --------------------
+   -- Dynamic_Option --
+   --------------------
+
+   function Dynamic_Option return String is
+   begin
+      return "-dynamiclib";
+   end Dynamic_Option;
+
+   -------------------
+   -- Is_Object_Ext --
+   -------------------
+
+   function Is_Object_Ext (Ext : String) return Boolean is
+   begin
+      return Ext = ".o";
+   end Is_Object_Ext;
+
+   --------------
+   -- Is_C_Ext --
+   --------------
+
+   function Is_C_Ext (Ext : String) return Boolean is
+   begin
+      return Ext = ".c";
+   end Is_C_Ext;
+
+   --------------------
+   -- Is_Archive_Ext --
+   --------------------
+
+   function Is_Archive_Ext (Ext : String) return Boolean is
+   begin
+      return Ext = ".a" or else Ext = ".dyld";
+   end Is_Archive_Ext;
+
+   -------------
+   -- Libgnat --
+   -------------
+
+   function Libgnat return String is
+   begin
+      return "libgnat.a";
+   end Libgnat;
+
+   ------------------------
+   -- Library_Exists_For --
+   ------------------------
+
+   function Library_Exists_For (Project : Project_Id) return Boolean is
+   begin
+      if not Projects.Table (Project).Library then
+         Prj.Com.Fail ("INTERNAL ERROR: Library_Exists_For called " &
+                       "for non library project");
+         return False;
+
+      else
+         declare
+            Lib_Dir : constant String :=
+              Get_Name_String (Projects.Table (Project).Library_Dir);
+            Lib_Name : constant String :=
+              Get_Name_String (Projects.Table (Project).Library_Name);
+
+         begin
+            if Projects.Table (Project).Library_Kind = Static then
+               return Is_Regular_File
+                 (Lib_Dir & Directory_Separator & "lib" &
+                  Fil.Ext_To (Lib_Name, Archive_Ext));
+
+            else
+               return Is_Regular_File
+                 (Lib_Dir & Directory_Separator & "lib" &
+                  Fil.Ext_To (Lib_Name, DLL_Ext));
+            end if;
+         end;
+      end if;
+   end Library_Exists_For;
+
+   ---------------------------
+   -- Library_File_Name_For --
+   ---------------------------
+
+   function Library_File_Name_For (Project : Project_Id) return Name_Id is
+   begin
+      if not Projects.Table (Project).Library then
+         Prj.Com.Fail ("INTERNAL ERROR: Library_File_Name_For called " &
+                       "for non library project");
+         return No_Name;
+
+      else
+         declare
+            Lib_Name : constant String :=
+              Get_Name_String (Projects.Table (Project).Library_Name);
+
+         begin
+            Name_Len := 3;
+            Name_Buffer (1 .. Name_Len) := "lib";
+
+            if Projects.Table (Project).Library_Kind = Static then
+               Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, Archive_Ext));
+
+            else
+               Add_Str_To_Name_Buffer (Fil.Ext_To (Lib_Name, DLL_Ext));
+            end if;
+
+            return Name_Find;
+         end;
+      end if;
+   end Library_File_Name_For;
+
+   ----------------
+   -- Object_Ext --
+   ----------------
+
+   function Object_Ext return String is
+   begin
+      return "o";
+   end Object_Ext;
+
+   ----------------
+   -- PIC_Option --
+   ----------------
+
+   function PIC_Option return String is
+   begin
+      return "-fPIC";
+   end PIC_Option;
+
+   -----------------------------------------------
+   -- Standalone_Library_Auto_Init_Is_Supported --
+   -----------------------------------------------
+
+   function Standalone_Library_Auto_Init_Is_Supported return Boolean is
+   begin
+      return True;
+   end Standalone_Library_Auto_Init_Is_Supported;
+
+   ---------------------------
+   -- Support_For_Libraries --
+   ---------------------------
+
+   function Support_For_Libraries return Library_Support is
+   begin
+      return Full;
+   end Support_For_Libraries;
+
+end MLib.Tgt;
index a438b762f6e2efb28da248970d1a699766a2e8e8..d10becf04cb0bdcc84e640e1c1842e0c9c872139 100644 (file)
@@ -90,6 +90,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 25fc1c13e15fcd36e4c861c4b8a57ff1fe89fcc5..eee46a1febae5898f1c71973b318ab447f77f97a 100644 (file)
@@ -91,6 +91,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index a3b82a4cda6af31adc07103b91c3a52cae002308..71584f26a3a2108f4da064801c5ed96712f4d40d 100644 (file)
@@ -94,6 +94,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 0dddb89a6bdfaf176bd45ffb9598cedc6e8cc3e9..140bbccff997c1a53191858abe615f8ddc78cc45 100644 (file)
@@ -82,6 +82,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 4052debc4fc99191361a6f9933f94d6ef33136de..7f588dd8b6ab97a32330f47e89168f3171bf024b 100644 (file)
@@ -88,6 +88,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 89be1edac386a81b85369ad5cd1cc2fb3169eed7..37f961ad4851e7793e8f910ae700d5e6b286d938 100644 (file)
@@ -96,6 +96,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 07f06cf59e01337ecb7bf6483c53f2cac36ce8f1..bf96371c51519e86165631ac2df38245f19de2d1 100644 (file)
@@ -118,6 +118,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index c4bd070393203a0a664ca315c96efdd4573b8e29..cad8ae1401b4281e8a23ce72bfcaa5fa9e01a8b2 100644 (file)
@@ -118,6 +118,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index a304b51a4abc9e723c488df199d32a506a839c35..51b911afde592efeb17e9342cdc19a3f3ecaf82e 100644 (file)
@@ -81,6 +81,15 @@ package body MLib.Tgt is
       return "ranlib" & Get_Target_Suffix;
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index a31adbd95bb52b8cb507b54dba35c75d96a1499e..267177ba91c65b63b712393104708afea490b525 100644 (file)
@@ -67,6 +67,15 @@ package body MLib.Tgt is
       return "ranlib";
    end Archive_Indexer;
 
+   -----------------------------
+   -- Archive_Indexer_Options --
+   -----------------------------
+
+   function Archive_Indexer_Options return String_List_Access is
+   begin
+      return new String_List (1 .. 0);
+   end Archive_Indexer_Options;
+
    ---------------------------
    -- Build_Dynamic_Library --
    ---------------------------
index 9b1a71a8fc494386d5cdf4f7212c5f9df3159cb8..4373dee439d649cb1dded285f9350768a42fe1e7 100644 (file)
@@ -64,6 +64,9 @@ package MLib.Tgt is
    --  Returns the name of the program, if any, that generates an index
    --  to the contents of an archive, usually "ranlib".
 
+   function Archive_Indexer_Options return String_List_Access;
+   --  A list of options to invoke the Archive_Indexer, usually empty.
+
    function Dynamic_Option return String;
    --  gcc option to create a dynamic library.
    --  For Unix, returns "-shared", for Windows returns "-mdll".
index f61386af3cc4d7f3e7239e719023d4eafed7fd60..4d21c2fa8ea738fbadf6e9c0970c94597483f554 100644 (file)
@@ -36,17 +36,18 @@ with GNAT;     use GNAT;
 
 package body MLib.Utl is
 
-   Initialized   : Boolean := False;
+   Initialized : Boolean := False;
 
-   Gcc_Name      : constant String := "gcc";
-   Gcc_Exec      : OS_Lib.String_Access;
+   Gcc_Name : constant String := "gcc";
+   Gcc_Exec : OS_Lib.String_Access;
 
-   Ar_Name       : OS_Lib.String_Access;
-   Ar_Exec       : OS_Lib.String_Access;
-   Ar_Options    : OS_Lib.String_List_Access;
+   Ar_Name    : OS_Lib.String_Access;
+   Ar_Exec    : OS_Lib.String_Access;
+   Ar_Options : OS_Lib.String_List_Access;
 
-   Ranlib_Name   : OS_Lib.String_Access;
-   Ranlib_Exec   : OS_Lib.String_Access := null;
+   Ranlib_Name    : OS_Lib.String_Access;
+   Ranlib_Exec    : OS_Lib.String_Access := null;
+   Ranlib_Options : OS_Lib.String_List_Access := null;
 
    procedure Initialize;
    --  Look for the tools in the path and record the full path for each one
@@ -116,7 +117,7 @@ package body MLib.Utl is
 
          OS_Lib.Spawn
            (Ranlib_Exec.all,
-            (1 => Arguments (Ar_Options'Length + 1)),
+            Ranlib_Options.all & (Arguments (Ar_Options'Length + 1)),
             Success);
 
          if not Success then
@@ -284,6 +285,8 @@ package body MLib.Utl is
                Write_Line (Ranlib_Exec.all);
             end if;
          end if;
+
+         Ranlib_Options := Archive_Indexer_Options;
       end if;
    end Initialize;