apicompatanamdw/compatanalysercmd/libraryanalyser/src/la_getters.cpp
author shrivatsa
Mon, 27 Sep 2010 14:51:17 +0530
changeset 12 a0eee409ff14
parent 3 ebe3f8f03b59
permissions -rw-r--r--
Updates to CompatibilityAnalyser - The Tool should now work with Symbian^4 - Some minor bug fixes related to Qt headers in the Symbian Platform
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     1
/*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     3
* All rights reserved.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     4
* This component and the accompanying materials are made available
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     6
* which accompanies this distribution, and is available
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     8
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
     9
* Initial Contributors:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    11
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    12
* Contributors:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    13
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    14
* Description:  Utility functions for getting data via 3rd party tools
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    15
*
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    16
*/
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    17
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    18
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    19
#include "la.hpp"
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    20
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    21
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    22
// TIP: Use The Regex Coach (http://weitz.de/regex-coach/) to check that the regular expressions are working correctly
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    23
// Note that in C/C++ code \ has been replaced with \\ and " with \".
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    24
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    25
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    26
void GetSymbolTableWithNM(const string& nm_location, const string& lib_name, vector<string>& symbol_table)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    27
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    28
    symbol_table.clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    29
    vector<string> tempVector;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    30
    vector<ordinal> ordinals;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    31
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    32
    // execute nm
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    33
    string cmd = nm_location + " --demangle \"" + lib_name + "\"";
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    34
    ExecuteCommand(cmd, tempVector);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    35
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    36
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    37
    // parse the results of the command
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    38
    for (unsigned int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    39
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    40
        // first check if we have found the beginning of a block
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    41
 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    42
        boost::cmatch matches1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    43
        boost::cmatch matches2;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    44
        boost::cmatch matches3;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    45
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    46
        bool match1 = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    47
        bool match2 = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    48
        bool match3 = false;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    49
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    50
        // Symbian OS 6.1 LIB file, example: ds00001.o:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    51
        boost::regex re1("^ds(\\d+)\\.o\\:");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    52
        match1 = boost::regex_match(tempVector.at(j).c_str(), matches1, re1);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    53
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    54
        if (!match1)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    55
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    56
            // Symbian OS 7.x-8.x LIB file, example: C:/DOCUME~1/mattlait/LOCALS~1/Temp/1/d1000s_00001.o:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    57
            boost::regex re2("^\\S*s_(\\d+)\\.o\\:");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    58
            match2 = boost::regex_match(tempVector.at(j).c_str(), matches2, re2);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    59
            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    60
            if (!match2)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    61
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    62
                // Symbian OS 9.x LIB file, example: AGENTDIALOG{000a0000}-14.o:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    63
                boost::regex re3("^\\S*\\{000a0000\\}-(\\d+)\\.o\\:");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    64
                match3 = boost::regex_match(tempVector.at(j).c_str(), matches3, re3);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    65
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    66
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    67
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    68
        if (match1 || match2 || match3)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    69
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    70
            // now get the ordinal number
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    71
            string ordNum;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    72
            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    73
            if (match1)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    74
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    75
                string ms(matches1[1].first, matches1[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    76
                ordNum = ms;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    77
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    78
            else if (match2)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    79
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    80
                string ms(matches2[1].first, matches2[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    81
                ordNum = ms;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    82
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    83
            else if (match3)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    84
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    85
                string ms(matches3[1].first, matches3[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    86
                ordNum = ms;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    87
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    88
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    89
            // now start looking for the line with the export name
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    90
            // eg: 00000000 T CUserActivityManager::RunL(void)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    91
            while (j<tempVector.size()-1)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    92
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    93
                j++;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    94
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    95
                boost::regex re4("^\\d+\\sT\\s(.*)$");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    96
                boost::cmatch matches4;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    97
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    98
                if (boost::regex_match(tempVector.at(j).c_str(), matches4, re4))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
    99
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   100
                    // now we have a full entry
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   101
                    string ms(matches4[1].first, matches4[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   102
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   103
                    // append to the ordinal list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   104
                    ordinals.push_back(ordinal(Str2Int(ordNum), ms));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   105
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   106
                    break;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   107
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   108
            }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   109
        } // (match1 || match2)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   110
    } // for (int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   111
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   112
    // convert the ordinal list into a symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   113
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_name); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   114
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   115
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   116
    //for (int k=0; k<symbol_table.size(); k++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   117
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   118
    //    cerr << symbol_table.at(k) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   119
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   120
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   121
    //if (symbol_table.size() == 0)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   122
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   123
    //    cerr << "Warning: No ordinals in " << lib_directory << lib_name << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   124
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   125
  
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   126
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   127
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   128
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   129
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   130
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   131
void GetSymbolTableWithReadelf(const string& readelf_location, const string& cfilt_location, const string& lib_name, vector<string>& symbol_table)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   132
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   133
    symbol_table.clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   134
    vector<string> tempVector;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   135
    vector<ordinal> ordinals;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   136
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   137
    // execute readelf
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   138
    // note: 2>NUL is used here to redirect standard error output to NULL since readelf seems to output lots of unwanted warning messages
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   139
    string cmd = readelf_location + " -s -W \"" + lib_name + "\" " + CERR_TO_NULL;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   140
    ExecuteCommand(cmd, tempVector);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   141
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   142
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   143
    // parse the results of the command
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   144
    for (unsigned int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   145
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   146
        boost::cmatch matches1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   147
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   148
        // example:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   149
        //     1: 00000000     4 NOTYPE  GLOBAL DEFAULT    1 _ZN13CSpdiaControl10DrawShadowER9CWindowGcRK5TSize@@SpdCtrl{000a0000}[10005986].dll
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   150
        boost::regex re1("^\\s*(\\d+)\\:.+GLOBAL.+\\d+\\s+(.*)\\@\\@.*");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   151
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   152
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   153
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   154
            // match found
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   155
            string ms1(matches1[1].first, matches1[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   156
            string ms2(matches1[2].first, matches1[2].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   157
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   158
            // append to the ordinal list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   159
            ordinals.push_back(ordinal(Str2Int(ms1), ms2));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   160
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   161
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   162
    } // for (int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   163
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   164
    // convert the ordinal list into a symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   165
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_name); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   166
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   167
    // finally demangle all function names since it's not done in this case automatically
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   168
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   169
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   170
    //for (int k=0; k<symbol_table.size(); k++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   171
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   172
    //    cerr << symbol_table.at(k) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   173
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   174
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   175
    //if (symbol_table.size() == 0)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   176
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   177
    //    cerr << "Warning: No ordinals in " << lib_directory << lib_name << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   178
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   179
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   180
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   181
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   182
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   183
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   184
void GetSymbolTableWithArmar(const string& armar_location, const string& cfilt_location, const string& lib_name, vector<string>& symbol_table)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   185
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   186
    symbol_table.clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   187
    vector<string> tempVector;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   188
    vector<ordinal> ordinals;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   189
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   190
    // execute armar
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   191
    string cmd = armar_location + " --zs \"" + lib_name + "\"";
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   192
    ExecuteCommand(cmd, tempVector);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   193
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   194
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   195
    // parse the results of the command
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   196
    for (unsigned int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   197
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   198
        // find the entries, example:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   199
        // _ZN13TAgnWeeklyRptC1Ev from AGNMODEL{000a0000}-187.o at offset 158366
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   200
        boost::regex re1("(\\S*)\\s+from\\s.*-(\\d+)\\.o.*");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   201
        boost::cmatch matches1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   202
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   203
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   204
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   205
            // match found
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   206
            string ms1(matches1[2].first, matches1[2].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   207
            string ms2(matches1[1].first, matches1[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   208
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   209
            // append to the ordinal list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   210
            ordinals.push_back(ordinal(Str2Int(ms1), ms2));            
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   211
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   212
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   213
    } // for (int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   214
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   215
    // convert the ordinal list into a symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   216
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_name); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   217
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   218
    // finally demangle all function names since it's not done in this case automatically
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   219
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   220
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   221
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   222
    //for (int k=0; k<symbol_table.size(); k++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   223
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   224
    //    cerr << symbol_table.at(k) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   225
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   226
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   227
    //if (symbol_table.size() == 0)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   228
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   229
    //    cerr << "Warning: No ordinals in " << lib_directory << lib_name << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   230
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   231
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   232
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   233
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   234
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   235
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   236
void GetSymbolTableWithFromelf(const string& fromelf_location, const string& cfilt_location, const string& lib_name, vector<string>& symbol_table)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   237
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   238
    symbol_table.clear();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   239
    vector<string> tempVector;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   240
    vector<ordinal> ordinals;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   241
    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   242
    // execute fromelf
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   243
    string cmd = fromelf_location + " -s \"" + lib_name + "\"";
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   244
    ExecuteCommand(cmd, tempVector);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   245
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   246
    // parse the results of the command
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   247
    for (unsigned int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   248
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   249
        // first find the start of the symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   250
        // ** Section #5 '.version' (SHT_GNU_versym)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   251
        boost::regex re1("^.*(SHT_GNU_versym).*");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   252
        boost::cmatch matches1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   253
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   254
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   255
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   256
            //int previous_ordinal = 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   257
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   258
            while (j<tempVector.size()-1)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   259
            {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   260
                j++;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   261
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   262
                //cout << tempVector.at(j) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   263
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   264
                // now find the entries, examples:
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   265
                //         7   _ZNK17CPbkContactEngine9FsSessionEv           2 PbkEng{000a0000}[101f4cce].dll
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   266
                //         8   _ZN17CPbkContactEngine19CreateEmptyContactLEv
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   267
                //                                                           2 PbkEng{000a0000}[101f4cce].dll
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   268
                // notice that line can be spread to two lines so make sure we don't accidentally get a wrong line
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   269
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   270
                // first parse out any unwanted lines
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   271
                boost::regex re2("^\\s*\\d+\\s+\\S+\\.\\w+$");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   272
                boost::cmatch matches2;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   273
                if (boost::regex_match(tempVector.at(j).c_str(), matches2, re2))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   274
                {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   275
                    //cout << "skipping" << endl;    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   276
                    continue;                
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   277
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   278
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   279
                // now it should be the wanted line
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   280
                boost::regex re3("^\\s*(\\d+)\\s*(\\S*).*");
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   281
                boost::cmatch matches3;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   282
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   283
                if (boost::regex_match(tempVector.at(j).c_str(), matches3, re3))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   284
                {    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   285
                    // cout << tempVector.at(j) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   286
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   287
                    // match found
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   288
                    string ms1(matches3[1].first, matches3[1].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   289
                    string ms2(matches3[2].first, matches3[2].second);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   290
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   291
                    // append to the ordinal list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   292
                    ordinals.push_back(ordinal(Str2Int(ms1), ms2));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   293
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   294
                    //cout << "match " << ms1 << " " << ms2 << endl;    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   295
                    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   296
                    // with fromelf, all entries are in order
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   297
                    // check that we don't miss any ordinals
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   298
                    //if (previous_ordinal + 1 != Str2Int(ms1))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   299
                    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   300
                    //    cerr << endl << "Aborting because of Fromelf ordinal order check error in " << lib_directory << lib_name << " in line:" << endl << tempVector.at(j) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   301
                    //    exit(11);    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   302
                    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   303
                    //previous_ordinal = Str2Int(ms1);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   304
                }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   305
3
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   306
				//break from the loop before section6 begins this chage is introduced for rvct4
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   307
				boost::regex re4("^.*(SHT_STRTAB).*");
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   308
				boost::cmatch matches1;
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   309
				if (boost::regex_match(tempVector.at(j).c_str(), matches3, re4))
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   310
                {
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   311
					break;
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   312
                }
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   313
            
ebe3f8f03b59 Compatibility Analyser updated to version 2.8.4. Support for Qt code analysis added.
noe\swadi
parents: 0
diff changeset
   314
0
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   315
            } //while (j<tempVector.size())
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   316
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   317
      
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   318
        } //if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   319
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   320
    } // for (int j=0; j<tempVector.size(); j++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   321
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   322
    // convert the ordinal list into a symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   323
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_name); 
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   324
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   325
    // finally demangle all function names since it's not done in this case automatically
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   326
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   327
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   328
    //for (int k=0; k<symbol_table.size(); k++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   329
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   330
    //    cerr << symbol_table.at(k) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   331
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   332
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   333
    //if (symbol_table.size() == 0)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   334
    //{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   335
    //    cerr << "Warning: No ordinals in " << lib_directory << lib_name << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   336
    //}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   337
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   338
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   339
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   340
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   341
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   342
void ConvertOrdinalListIntoSymbolTable(const vector<ordinal>& ordinals, vector<string>& symbol_table, const string& lib_path)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   343
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   344
    // remove any invalid ordinals from the list    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   345
    vector<ordinal> ordinalVectorCopy;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   346
    ordinalVectorCopy.reserve(ordinals.size());
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   347
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   348
    for (unsigned int i=0; i<ordinals.size(); i++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   349
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   350
        if (ordinals.at(i).funcpos <= 0 && ordinals.at(i).funcpos > 32000)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   351
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   352
            cerr << "Error: Invalid ordinal " << ordinals.at(i).funcname << " @ " << Int2Str(ordinals.at(i).funcpos) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   353
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   354
        else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   355
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   356
            ordinalVectorCopy.push_back(ordinals.at(i));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   357
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   358
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   359
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   360
    // sort the ordinal list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   361
    sort(ordinalVectorCopy.begin(), ordinalVectorCopy.end(), OrdinalCompare);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   362
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   363
    // now check that there are no missing ordinals in the list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   364
    unsigned int previous_ordnumber = 0;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   365
    unsigned int current_ordnumber = 1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   366
    for (unsigned int i=0; i<ordinalVectorCopy.size(); i++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   367
    {      
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   368
        // get the current ordinal number
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   369
        current_ordnumber = ordinalVectorCopy.at(i).funcpos;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   370
        //cout << "CurOrdNum: " << Int2Str(current_ordnumber) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   371
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   372
        // the current ordinal number obviously should be one bigger than the previous one
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   373
        if ( current_ordnumber != previous_ordnumber+1 )
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   374
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   375
            // append a dummy ordinal to the list
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   376
            ordinalVectorCopy.insert(ordinalVectorCopy.begin()+i, ordinal(i+1, "UnknownOrdinal-"+Int2Str(i+1)));
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   377
            current_ordnumber = i+1;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   378
            //cout << "Appended a dummy ordinal at pos " << Int2Str(i+1) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   379
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   380
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   381
        // remember the previous ordinal number
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   382
        previous_ordnumber = current_ordnumber;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   383
        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   384
        // if the ordinal list is corrupted, it may lead to an infinite loop
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   385
        if (i>25000)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   386
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   387
            cerr << endl << "Something went horribly wrong when trying to parse " << lib_path << ". Aborting." << endl;           
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   388
            exit(10);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   389
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   390
    }    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   391
   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   392
    // finally copy data from the ordinal list to the symbol table
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   393
    if (symbol_table.size() < ordinalVectorCopy.size())
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   394
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   395
        symbol_table.reserve(ordinalVectorCopy.size());
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   396
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   397
    for (unsigned int i=0; i<ordinalVectorCopy.size(); i++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   398
    {      
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   399
        symbol_table.push_back( ordinalVectorCopy.at(i).funcname );
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   400
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   401
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   402
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   403
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   404
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   405
void DemangleOrdinalsInSymbolTable(const string& cfilt_location, vector<string>& symbol_table)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   406
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   407
    ofstream f(_tempfile_location.c_str(), ios::trunc);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   408
    if (f.is_open())
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   409
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   410
        // create a temp file which contain all the function names
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   411
        for (unsigned int k=0; k<symbol_table.size(); k++)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   412
        {   
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   413
            f << symbol_table.at(k) << endl;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   414
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   415
        f.close();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   416
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   417
        // execute cfilt
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   418
        vector<string> cfilt_result_set;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   419
        string tempfile_loc = _tempfile_location;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   420
        InsertQuotesToFilePath(tempfile_loc);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   421
        string cmd = cfilt_location + " < " + tempfile_loc;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   422
        ExecuteCommand(cmd, cfilt_result_set);
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   423
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   424
        // check that all functions exist and then replace the symbol table with demangled functions        
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   425
        if (cfilt_result_set.size() == symbol_table.size())
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   426
        {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   427
            symbol_table = cfilt_result_set;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   428
        }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   429
    }
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   430
    else
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   431
    {
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   432
        f.close();
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   433
    }    
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   434
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   435
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   436
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   437
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   438
bool OrdinalCompare(const ordinal& left, const ordinal& right)
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   439
{
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   440
    return left.funcpos < right.funcpos;
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   441
}
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   442
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   443
// ----------------------------------------------------------------------------------------------------------
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   444
638b9c697799 1. Licenses updated to EPL.
noe\swadi
parents:
diff changeset
   445