1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- V X L I N K . L I N K --
9 -- Copyright (C) 2018, AdaCore --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
28 with Ada
.Command_Line
; use Ada
.Command_Line
;
29 with GNAT
.Directory_Operations
; use GNAT
.Directory_Operations
;
31 package body VxLink
.Link
is
33 Gcc
: constant String := VxLink
.Gcc
;
40 (Linker
: out VxLink_Linker
)
42 Leading
: Boolean := True;
43 Next_Is_Object
: Boolean := False;
46 for J
in 1 .. Ada
.Command_Line
.Argument_Count
loop
48 Arg
: String renames Argument
(J
);
50 if Next_Is_Object
then
51 Next_Is_Object
:= False;
52 Linker
.Dest_Object
:= To_Unbounded_String
(Arg
);
55 elsif Argument
(J
) = "-o" then
56 Next_Is_Object
:= True;
58 elsif Argument
(J
) = "-noauto-register" then
59 -- Filter out this argument, and do not generate _ctors/_dtors
60 Linker
.Add_CDtors
:= False;
61 elsif Arg
= "-v" and then not Is_Verbose
then
62 -- first -v means VxLink should be verbose, two -v passes -v to
66 if Arg
= "-nostdlib" or Arg
= "-nostartfiles" then
67 Linker
.Add_CDtors
:= False;
71 Linker
.Args_Leading
.Append
(Arg
);
73 Linker
.Args_Trailing
.Append
(Arg
);
79 if Linker
.Dest_Object
= Null_Unbounded_String
then
80 Set_Error_State
("no output object is defined");
81 elsif Linker
.Add_CDtors
then
82 -- We'll need to create intermediate artefacts, so we'll use the
83 -- destination object as base namespace just in case we have
84 -- several link operations in the same directory
86 Obj
: constant String :=
87 Base_Name
(To_String
(Linker
.Dest_Object
));
90 for J
in reverse Obj
'Range loop
93 To_Unbounded_String
(Obj
(Obj
'First .. J
- 1));
98 Linker
.Partial_Obj
:= Linker
.Dest_Base
& "-partial.o";
107 function Needs_CDtor
(Linker
: VxLink_Linker
) return Boolean is
109 return Linker
.Add_CDtors
;
116 function Partial_Object
(Linker
: VxLink_Linker
) return String is
118 return To_String
(Linker
.Partial_Obj
);
125 function Namespace
(Linker
: VxLink_Linker
) return String is
127 return To_String
(Linker
.Dest_Base
);
130 ---------------------
131 -- Do_Initial_Link --
132 ---------------------
134 procedure Do_Initial_Link
(Linker
: VxLink_Linker
)
136 Args
: Arguments_List
;
137 Gxx_Path
: constant String := Gxx
;
139 if Is_Error_State
then
143 if Gxx_Path
'Length /= 0 then
148 Args
.Append
(Linker
.Args_Leading
);
151 if Linker
.Add_CDtors
then
152 Args
.Append
(To_String
(Linker
.Partial_Obj
));
154 Args
.Append
(To_String
(Linker
.Dest_Object
));
157 Args
.Append
(Linker
.Args_Trailing
);
159 if not Linker
.Add_CDtors
then
160 Args
.Append
("-nostartfiles");
170 procedure Do_Final_Link
171 (Linker
: VxLink_Linker
;
174 Args
: Arguments_List
;
176 if not Linker
.Add_CDtors
then
180 if Is_Error_State
then
185 Args
.Append
("-nostdlib");
186 Args
.Append
(Ctdt_Obj
);
187 Args
.Append
(To_String
(Linker
.Partial_Obj
));
189 Args
.Append
(To_String
(Linker
.Dest_Object
));