1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- S Y M B O L S . P R O C E S S I N G --
9 -- Copyright (C) 2004-2007, Free Software Foundation, Inc. --
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 ------------------------------------------------------------------------------
26 -- This is the VMS/IA64 version of this package
28 with Ada.IO_Exceptions;
30 with Ada.Unchecked_Deallocation;
33 package body Processing is
35 type String_Array is array (Positive range <>) of String_Access;
36 type Strings_Ptr is access String_Array;
39 new Ada.Unchecked_Deallocation (String_Array, Strings_Ptr);
41 type Section_Header is record
49 type Section_Header_Array is array (Natural range <>) of Section_Header;
50 type Section_Header_Ptr is access Section_Header_Array;
53 new Ada.Unchecked_Deallocation (Section_Header_Array, Section_Header_Ptr);
60 (Object_File : String;
61 Success : out Boolean)
67 Str : String (1 .. 1000) := (others => ' ');
70 Strings : Strings_Ptr;
82 Symtab_Index : Natural := 0;
83 String_Table_Index : Natural := 0;
93 Section_Headers : Section_Header_Ptr;
95 Offset : Natural := 0;
98 procedure Get_Byte (B : out Byte);
99 procedure Get_Half (H : out Integer);
100 procedure Get_Word (W : out Integer);
102 -- All the above require comments ???
108 procedure Get_Byte (B : out Byte) is
110 Byte_IO.Read (File, B);
111 Offset := Offset + 1;
118 procedure Get_Half (H : out Integer) is
121 Get_Byte (C1); Get_Byte (C2);
123 Integer'(Character'Pos (C2)) * 256 + Integer'(Character'Pos (C1));
130 procedure Get_Word (W : out Integer) is
133 Get_Half (H1); Get_Half (H2);
134 W := H2 * 256 * 256 + H1;
144 Byte_IO.Reset (File);
147 -- Start of processing for Process
150 -- Open the object file with Byte_IO. Return with Success = False if
154 Open (File, In_File, Object_File);
158 ("*** Unable to open object file """ & Object_File & """");
163 -- Assume that the object file has a correct format
167 -- Skip ELF identification
169 while Offset < 16 loop
199 -- Skip upper half of Shoff
221 Get_Half (Shentsize);
225 Section_Headers := new Section_Header_Array (0 .. Shnum - 1);
227 -- Go to Section Headers
229 while Offset < Shoff loop
233 -- Reset Symtab_Index
237 for J in Section_Headers'Range loop
239 -- Get the data for each Section Header
244 for K in 1 .. 16 loop
256 while (Offset - Shoff) mod Shentsize /= 0 loop
260 -- If this is the Symbol Table Section Header, record its index
266 Section_Headers (J) := (Shname, Shtype, Shoffset, Shsize, Shlink);
269 if Symtab_Index = 0 then
275 Section_Headers (Symtab_Index).Shoffset +
276 Section_Headers (Symtab_Index).Shsize;
278 String_Table_Index := Section_Headers (Symtab_Index).Shlink;
280 new String_Array (1 .. Section_Headers (String_Table_Index).Shsize);
282 -- Go get the String Table section for the Symbol Table
286 while Offset < Section_Headers (String_Table_Index).Shoffset loop
292 Get_Byte (B); -- zero
294 while Offset < Section_Headers (String_Table_Index).Shsize loop
299 if B /= ASCII.NUL then
300 Str_Last := Str_Last + 1;
304 Strings (Offset - Str_Last - 1) :=
305 new String'(Str (1 .. Str_Last));
311 -- Go get the Symbol Table
315 while Offset < Section_Headers (Symtab_Index).Shoffset loop
319 while Offset < End_Symtab loop
328 Sttype := Integer'(Character'Pos (Stinfo)) mod 16;
329 Stbind := Integer'(Character'Pos (Stinfo)) / 16;
331 if (Sttype = 1 or else Sttype = 2)
333 and then Stshndx /= 0
335 -- Check if this is a symbol from a generic body
339 for J in Strings (Stname)'First .. Strings (Stname)'Last - 2 loop
340 if Strings (Stname) (J) = 'G'
341 and then Strings (Stname) (J + 1) = 'P'
342 and then Strings (Stname) (J + 2) in '0' .. '9'
351 S_Data : Symbol_Data;
353 S_Data.Name := new String'(Strings (Stname).all);
362 -- Put the new symbol in the table
364 Symbol_Table.Append (Complete_Symbols, S_Data);
370 -- The object file has been processed, close it
374 -- Free the allocated memory
376 Free (Section_Headers);
378 for J in Strings'Range loop
379 if Strings (J) /= null then
387 -- For any exception, output an error message, close the object file
388 -- and return with Success = False.
390 when Ada.IO_Exceptions.End_Error =>
394 Put_Line ("unexpected exception raised while processing """
395 & Object_File & """");
396 Put_Line (Exception_Information (X));