srcanamdw/appdep/src/appdep_getters.cpp
author noe\swadi
Sat, 09 Jan 2010 10:04:12 +0530
changeset 0 509e4801c378
permissions -rw-r--r--
1. Copyrights changed to EPL 2. Feature updates mentioned in release notes.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     1
/*
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     3
* All rights reserved.
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     4
* This component and the accompanying materials are made available
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     6
* which accompanies this distribution, and is available
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     8
*
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
     9
* Initial Contributors:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    11
*
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    12
* Contributors:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    13
*
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    14
* Description:  Utility functions for getting data via 3rd party tools
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    15
*
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    16
*/
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    17
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    18
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    19
#include "appdep.hpp"
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    20
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    21
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    22
// Note that in C/C++ code \ has been replaced with \\ and " with \".
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    23
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    24
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    25
void GetImportTableWithPetran(const string& petran_location, binary_info& b_info)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    26
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    27
    vector<dependency> deps;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    28
    vector<string> tempVector;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    29
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    30
    // init defaults
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    31
    b_info.binary_format = UNKNOWN;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    32
    b_info.uid1 = UNKNOWN;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    33
    b_info.uid2 = UNKNOWN;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    34
    b_info.uid3 = UNKNOWN;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    35
    b_info.secureid = NOT_VALID;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    36
    b_info.vendorid = NOT_VALID;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    37
    b_info.capabilities = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    38
    b_info.min_heap_size = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    39
    b_info.max_heap_size = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    40
    b_info.stack_size = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    41
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    42
    // execute petran
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    43
    string cmd;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    44
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    45
    if (_cl_use_gcce || _cl_use_rvct)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    46
        cmd = petran_location + " -dump hi \"" + b_info.directory + b_info.filename + "\" " + CERR_TO_NULL;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    47
    else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    48
        cmd = petran_location + " \"" + b_info.directory + b_info.filename + "\" " + CERR_TO_NULL;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    49
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    50
    //cerr << cmd << endl;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    51
    ExecuteCommand(cmd, tempVector);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    52
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    53
    // get binary format, assuming it's the first line which begings with EPOC
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    54
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    55
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    56
        boost::regex re("^(EPOC.+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    57
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    58
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    59
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    60
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    61
            TrimAll(ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    62
            b_info.binary_format = ms1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    63
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    64
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    65
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    66
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    67
    // get uids
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    68
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    69
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    70
        boost::regex re("^Uids:\\s+(\\S+)\\s+(\\S+)\\s+(\\S+).+");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    71
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    72
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    73
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    74
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    75
            string ms2(matches[2].first, matches[2].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    76
            string ms3(matches[3].first, matches[3].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    77
            b_info.uid1 = "0x"+ms1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    78
            b_info.uid2 = "0x"+ms2;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    79
            b_info.uid3 = "0x"+ms3;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    80
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    81
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    82
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    83
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    84
    // get secure id
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    85
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    86
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    87
        boost::regex re("^Secure\\sID:\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    88
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    89
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    90
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    91
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    92
            b_info.secureid = "0x"+ms1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    93
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    94
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    95
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    96
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    97
    // get vendor id
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    98
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
    99
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   100
        boost::regex re("^Vendor\\sID:\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   101
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   102
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   103
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   104
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   105
            b_info.vendorid = "0x"+ms1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   106
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   107
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   108
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   109
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   110
    // get capabilities
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   111
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   112
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   113
        boost::regex re("^Capabilities:\\s+\\S+\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   114
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   115
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   116
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   117
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   118
            b_info.capabilities = Str2Int("0x"+ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   119
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   120
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   121
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   122
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   123
    // get min heap size
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   124
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   125
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   126
        boost::regex re("^Min\\sHeap\\sSize:\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   127
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   128
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   129
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   130
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   131
            b_info.min_heap_size = Str2Int("0x"+ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   132
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   133
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   134
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   135
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   136
    // get max heap size
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   137
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   138
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   139
        boost::regex re("^Max\\sHeap\\sSize:\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   140
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   141
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   142
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   143
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   144
            b_info.max_heap_size = Str2Int("0x"+ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   145
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   146
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   147
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   148
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   149
    // get stack size
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   150
    for (unsigned int j=0; j<tempVector.size() && j<100; j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   151
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   152
        boost::regex re("^Stack\\sSize:\\s+(\\S+)");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   153
        boost::cmatch matches;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   154
        if (boost::regex_match(tempVector.at(j).c_str(), matches, re))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   155
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   156
            string ms1(matches[1].first, matches[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   157
            b_info.stack_size = Str2Int("0x"+ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   158
            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   159
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   160
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   161
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   162
    // finally get the dependency information
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   163
    for (unsigned int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   164
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   165
        // first find where the import table begins, example:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   166
        // Offset of import address table (relative to code section): 00005660
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   167
        if (tempVector.at(j).find("Offset of import", 0) != string::npos)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   168
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   169
            // continue looping
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   170
            while (j<tempVector.size()-1)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   171
            {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   172
                j++;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   173
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   174
                // now find denpendency entry, examples:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   175
                // 68 imports from euser{000a0000}[100039e5].dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   176
                // 1 imports from COMMONENGINE[100058fe].DLL
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   177
                // 3 imports from drtrvct2_2{000a0000}.dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   178
                // 27 imports from libdbus-utils{000a0000}[20010154].dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   179
                boost::regex re1("^(\\d+)\\simports\\sfrom\\s([\\w\\-]+)\\S*(\\.\\w+).*");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   180
                boost::cmatch matches1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   181
                if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   182
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   183
                    // match found
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   184
                    string ms1(matches1[1].first, matches1[1].second); // number in the beginning
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   185
                    string ms2(matches1[2].first, matches1[2].second); // first part of filename
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   186
                    string ms3(matches1[3].first, matches1[3].second); // extension of filename
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   187
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   188
                    unsigned int number_of_imports = Str2Int(ms1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   189
                    vector<import> imps; // imports
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   190
                    string filename = ms2+ms3;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   191
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   192
                    // get position of the filename in import libaries
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   193
                    int lib_pos = -1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   194
                    for (unsigned int x=0; x<_all_import_library_infos.size(); x++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   195
                    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   196
                        if (StringICmpFileNamesWithoutExtension(_all_import_library_infos.at(x).filename, filename) == 0)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   197
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   198
                            lib_pos = x;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   199
                            break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   200
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   201
                    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   202
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   203
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   204
                    // read ordinal numbers
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   205
                    for (unsigned int k=0; k<number_of_imports; k++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   206
                    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   207
                        j++;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   208
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   209
                        import imp;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   210
                        imp.is_vtable = false;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   211
                        imp.vtable_offset = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   212
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   213
                        string ordinal_data = tempVector.at(j);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   214
                        TrimAll(ordinal_data);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   215
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   216
                        // check if it's virtual data
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   217
                        string::size_type pos = ordinal_data.find(" offset by", 0);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   218
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   219
                        if (pos == string::npos)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   220
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   221
                            // regular entry, just get the ordinal number
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   222
                            imp.funcpos = Str2Int(ordinal_data);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   223
                            imp.is_vtable = false;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   224
                            imp.vtable_offset = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   225
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   226
                        else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   227
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   228
                            // this is a virtual table entry
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   229
                            imp.funcpos = Str2Int(ordinal_data.substr(0, pos));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   230
                            imp.is_vtable = true;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   231
                            imp.vtable_offset = Str2Int(ordinal_data.substr(pos+11, ordinal_data.length()-pos-1));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   232
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   233
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   234
                        // get the function name
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   235
                        if (lib_pos >= 0)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   236
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   237
                            if (imp.funcpos-1 < _all_import_library_infos.at(lib_pos).symbol_table.size())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   238
                                imp.funcname = _all_import_library_infos.at(lib_pos).symbol_table.at(imp.funcpos-1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   239
                            else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   240
                                imp.funcname = "BC break: This ordinal position is not in the import library!";
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   241
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   242
                        else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   243
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   244
                            imp.funcname = "Import library not found!";
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   245
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   246
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   247
                        // Checking for possible duplicate imported function ordinals.
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   248
                        import compare[] = { imp };
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   249
                        vector<import>::iterator it = find_first_of(imps.begin(), imps.end(), compare, compare+1, ImportFunctionsHasSameOrdinal);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   250
                        if(it == imps.end())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   251
                        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   252
                            // No duplicate detected. Appending ordinal data to the array.
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   253
                            imps.push_back(imp);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   254
                        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   255
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   256
                    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   257
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   258
                    // append to the vector
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   259
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   260
                    dependency dep;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   261
                    dep.filename = filename;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   262
                    dep.imports = imps;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   263
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   264
                    deps.push_back( dep );
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   265
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   266
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   267
            }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   268
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   269
            break; //for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   270
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   271
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   272
    } // for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   273
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   274
    // store the dependencies array
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   275
    b_info.dependencies = deps;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   276
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   277
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   278
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   279
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   280
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   281
bool ImportFunctionsHasSameOrdinal(import imp1, import imp2)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   282
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   283
    return (imp1.funcpos == imp2.funcpos);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   284
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   285
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   286
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   287
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   288
void GetSymbolTableWithNM(const string& nm_location, const string& lib_directory, const string& lib_name, vector<string>& symbol_table)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   289
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   290
    symbol_table.clear();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   291
    vector<string> tempVector;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   292
    vector<ordinal> ordinals;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   293
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   294
    // execute nm
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   295
    string cmd = nm_location + " --demangle \"" + lib_directory + lib_name + "\"";
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   296
    ExecuteCommand(cmd, tempVector);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   297
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   298
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   299
    // parse the results of the command
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   300
    for (unsigned int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   301
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   302
        // first check if we have found the beginning of a block
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   303
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   304
        boost::cmatch matches1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   305
        boost::cmatch matches2;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   306
        boost::cmatch matches3;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   307
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   308
        bool match1 = false;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   309
        bool match2 = false;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   310
        bool match3 = false;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   311
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   312
        // Symbian OS 6.1 LIB file, example: ds00001.o:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   313
        boost::regex re1("^ds(\\d+)\\.o\\:");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   314
        match1 = boost::regex_match(tempVector.at(j).c_str(), matches1, re1);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   315
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   316
        if (!match1)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   317
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   318
            // Symbian OS 7.x-8.x LIB file, example: C:/DOCUME~1/mattlait/LOCALS~1/Temp/1/d1000s_00001.o:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   319
            boost::regex re2("^\\S*s_(\\d+)\\.o\\:");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   320
            match2 = boost::regex_match(tempVector.at(j).c_str(), matches2, re2);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   321
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   322
            if (!match2)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   323
            {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   324
                // Symbian OS 9.x LIB file, example: AGENTDIALOG{000a0000}-14.o:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   325
                boost::regex re3("^\\S*\\{000a0000\\}-(\\d+)\\.o\\:");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   326
                match3 = boost::regex_match(tempVector.at(j).c_str(), matches3, re3);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   327
            }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   328
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   329
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   330
        if (match1 || match2 || match3)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   331
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   332
            // now get the ordinal number
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   333
            string ordNum;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   334
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   335
            if (match1)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   336
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   337
                string ms(matches1[1].first, matches1[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   338
                ordNum = ms;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   339
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   340
            else if (match2)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   341
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   342
                string ms(matches2[1].first, matches2[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   343
                ordNum = ms;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   344
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   345
            else if (match3)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   346
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   347
                string ms(matches3[1].first, matches3[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   348
                ordNum = ms;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   349
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   350
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   351
            // now start looking for the line with the export name
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   352
            // eg: 00000000 T CUserActivityManager::RunL(void)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   353
            while (j<tempVector.size()-1)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   354
            {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   355
                j++;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   356
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   357
                boost::regex re4("^\\d+\\sT\\s(.*)$");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   358
                boost::cmatch matches4;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   359
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   360
                if (boost::regex_match(tempVector.at(j).c_str(), matches4, re4))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   361
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   362
                    // now we have a full entry
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   363
                    string ms(matches4[1].first, matches4[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   364
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   365
                    // append to the ordinal list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   366
                    ordinals.push_back(ordinal(Str2Int(ordNum), ms));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   367
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   368
                    break;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   369
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   370
            }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   371
        } // (match1 || match2)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   372
    } // for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   373
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   374
    // convert the ordinal list into a symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   375
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_directory+lib_name);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   376
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   377
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   378
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   379
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   380
void GetSymbolTableWithReadelf(const string& readelf_location, const string& cfilt_location, const string& lib_directory, const string& lib_name, vector<string>& symbol_table)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   381
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   382
    symbol_table.clear();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   383
    vector<string> tempVector;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   384
    vector<ordinal> ordinals;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   385
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   386
    // execute readelf
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   387
    // note: 2>NUL is used here to redirect standard error output to NULL since readelf seems to output lots of unwanted warning messages
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   388
    string cmd = readelf_location + " -s -W \"" + lib_directory + lib_name + "\" " + CERR_TO_NULL;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   389
    ExecuteCommand(cmd, tempVector);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   390
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   391
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   392
    // parse the results of the command
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   393
    for (unsigned int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   394
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   395
        boost::cmatch matches1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   396
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   397
        // example:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   398
        //     1: 00000000     4 NOTYPE  GLOBAL DEFAULT    1 _ZN13CSpdiaControl10DrawShadowER9CWindowGcRK5TSize@@SpdCtrl{000a0000}[10005986].dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   399
        boost::regex re1("^\\s*(\\d+)\\:.+GLOBAL.+\\d+\\s+(.*)\\@\\@.*");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   400
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   401
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   402
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   403
            // match found
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   404
            string ms1(matches1[1].first, matches1[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   405
            string ms2(matches1[2].first, matches1[2].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   406
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   407
            // append to the ordinal list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   408
            ordinals.push_back(ordinal(Str2Int(ms1), ms2));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   409
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   410
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   411
    } // for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   412
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   413
    // convert the ordinal list into a symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   414
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_directory+lib_name);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   415
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   416
    // finally demangle all function names since it's not done in this case automatically
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   417
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   418
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   419
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   420
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   421
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   422
void GetSymbolTableWithArmar(const string& armar_location, const string& cfilt_location, const string& lib_directory, const string& lib_name, vector<string>& symbol_table)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   423
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   424
    symbol_table.clear();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   425
    vector<string> tempVector;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   426
    vector<ordinal> ordinals;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   427
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   428
    // execute armar
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   429
    string cmd = armar_location + " --zs \"" + lib_directory + lib_name + "\"";
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   430
    ExecuteCommand(cmd, tempVector);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   431
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   432
    // parse the results of the command
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   433
    for (unsigned int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   434
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   435
        // find the entries, example:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   436
        // _ZN13TAgnWeeklyRptC1Ev from AGNMODEL{000a0000}-187.o at offset 158366
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   437
        boost::regex re1("(\\S*)\\s+from\\s.*-(\\d+)\\.o.*");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   438
        boost::cmatch matches1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   439
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   440
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   441
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   442
            // match found
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   443
            string ms1(matches1[2].first, matches1[2].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   444
            string ms2(matches1[1].first, matches1[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   445
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   446
            // append to the ordinal list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   447
            ordinals.push_back(ordinal(Str2Int(ms1), ms2));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   448
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   449
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   450
    } // for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   451
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   452
    // convert the ordinal list into a symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   453
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_directory+lib_name);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   454
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   455
    // finally demangle all function names since it's not done in this case automatically
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   456
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   457
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   458
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   459
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   460
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   461
void GetSymbolTableWithFromelf(const string& fromelf_location, const string& cfilt_location, const string& lib_directory, const string& lib_name, vector<string>& symbol_table)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   462
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   463
    symbol_table.clear();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   464
    vector<string> tempVector;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   465
    vector<ordinal> ordinals;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   466
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   467
    // execute fromelf
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   468
    string cmd = fromelf_location + " -s \"" + lib_directory + lib_name + "\"";
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   469
    ExecuteCommand(cmd, tempVector);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   470
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   471
    // parse the results of the command
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   472
    for (unsigned int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   473
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   474
        // first find the start of the symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   475
        // ** Section #5 '.version' (SHT_GNU_versym)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   476
        boost::regex re1("^.*(SHT_GNU_versym).*");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   477
        boost::cmatch matches1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   478
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   479
        if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   480
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   481
            //int previous_ordinal = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   482
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   483
            while (j<tempVector.size()-1)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   484
            {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   485
                j++;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   486
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   487
                // now find the entries, examples:
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   488
                //         7   _ZNK17CPbkContactEngine9FsSessionEv           2 PbkEng{000a0000}[101f4cce].dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   489
                //         8   _ZN17CPbkContactEngine19CreateEmptyContactLEv
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   490
                //                                                           2 PbkEng{000a0000}[101f4cce].dll
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   491
                // notice that line can be spread to two lines so make sure we don't accidentally get a wrong line
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   492
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   493
                // first parse out any unwanted lines
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   494
                boost::regex re2("^\\s*\\d+\\s+\\S+\\.\\w+$");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   495
                boost::cmatch matches2;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   496
                if (boost::regex_match(tempVector.at(j).c_str(), matches2, re2))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   497
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   498
                    continue;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   499
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   500
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   501
                // now it should be the wanted line
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   502
                boost::regex re3("^\\s*(\\d+)\\s*(\\S*).*");
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   503
                boost::cmatch matches3;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   504
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   505
                if (boost::regex_match(tempVector.at(j).c_str(), matches3, re3))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   506
                {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   507
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   508
                    // match found
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   509
                    string ms1(matches3[1].first, matches3[1].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   510
                    string ms2(matches3[2].first, matches3[2].second);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   511
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   512
                    // append to the ordinal list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   513
                    ordinals.push_back(ordinal(Str2Int(ms1), ms2));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   514
                }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   515
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   516
            } //while (j<tempVector.size())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   517
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   518
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   519
        } //if (boost::regex_match(tempVector.at(j).c_str(), matches1, re1))
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   520
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   521
    } // for (int j=0; j<tempVector.size(); j++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   522
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   523
    // convert the ordinal list into a symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   524
    ConvertOrdinalListIntoSymbolTable(ordinals, symbol_table, lib_directory+lib_name);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   525
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   526
    // finally demangle all function names since it's not done in this case automatically
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   527
    DemangleOrdinalsInSymbolTable(cfilt_location, symbol_table);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   528
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   529
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   530
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   531
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   532
void ConvertOrdinalListIntoSymbolTable(const vector<ordinal>& ordinals, vector<string>& symbol_table, const string& lib_path)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   533
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   534
    // remove any invalid ordinals from the list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   535
    vector<ordinal> ordinalVectorCopy;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   536
    ordinalVectorCopy.reserve(ordinals.size());
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   537
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   538
    for (unsigned int i=0; i<ordinals.size(); i++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   539
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   540
        if (ordinals.at(i).funcpos <= 0 && ordinals.at(i).funcpos > 32000)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   541
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   542
            cerr << "Error: Invalid ordinal " << ordinals.at(i).funcname << " @ " << Int2Str(ordinals.at(i).funcpos) << endl;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   543
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   544
        else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   545
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   546
            ordinalVectorCopy.push_back(ordinals.at(i));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   547
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   548
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   549
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   550
    // sort the ordinal list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   551
    sort(ordinalVectorCopy.begin(), ordinalVectorCopy.end(), OrdinalCompare);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   552
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   553
    // now check that there are no missing ordinals in the list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   554
    unsigned int previous_ordnumber = 0;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   555
    unsigned int current_ordnumber = 1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   556
    for (unsigned int i=0; i<ordinalVectorCopy.size(); i++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   557
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   558
        // get the current ordinal number
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   559
        current_ordnumber = ordinalVectorCopy.at(i).funcpos;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   560
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   561
        // the current ordinal number obviously should be one bigger than the previous one
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   562
        if ( current_ordnumber != previous_ordnumber+1 )
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   563
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   564
            // append a dummy ordinal to the list
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   565
            ordinalVectorCopy.insert(ordinalVectorCopy.begin()+i, ordinal(i+1, "UnknownOrdinal-"+Int2Str(i+1)));
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   566
            current_ordnumber = i+1;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   567
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   568
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   569
        // remember the previous ordinal number
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   570
        previous_ordnumber = current_ordnumber;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   571
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   572
        // if the ordinal list is corrupted, it may lead to an infinite loop
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   573
        if (i>25000)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   574
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   575
            cerr << endl << "Something went horribly wrong when trying to parse " << lib_path << ". Aborting." << endl;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   576
            exit(10);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   577
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   578
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   579
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   580
    // finally copy data from the ordinal list to the symbol table
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   581
    if (symbol_table.size() < ordinalVectorCopy.size())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   582
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   583
        symbol_table.reserve(ordinalVectorCopy.size());
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   584
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   585
    for (unsigned int i=0; i<ordinalVectorCopy.size(); i++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   586
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   587
        symbol_table.push_back( ordinalVectorCopy.at(i).funcname );
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   588
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   589
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   590
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   591
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   592
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   593
void DemangleOrdinalsInSymbolTable(const string& cfilt_location, vector<string>& symbol_table)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   594
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   595
    ofstream f(_tempfile_location.c_str(), ios::trunc);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   596
    if (f.is_open())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   597
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   598
        // create a temp file which contain all the function names
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   599
        for (unsigned int k=0; k<symbol_table.size(); k++)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   600
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   601
            f << symbol_table.at(k) << endl;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   602
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   603
        f.close();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   604
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   605
        // execute cfilt
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   606
        vector<string> cfilt_result_set;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   607
        string cmd = cfilt_location + " < " + _tempfile_location;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   608
        ExecuteCommand(cmd, cfilt_result_set);
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   609
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   610
        // check that all functions exist and then replace the symbol table with demangled functions
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   611
        if (cfilt_result_set.size() == symbol_table.size())
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   612
        {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   613
            symbol_table = cfilt_result_set;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   614
        }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   615
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   616
    else
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   617
    {
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   618
        f.close();
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   619
    }
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   620
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   621
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   622
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   623
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   624
bool OrdinalCompare(const ordinal& left, const ordinal& right)
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   625
{
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   626
    return left.funcpos < right.funcpos;
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   627
}
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   628
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   629
// ----------------------------------------------------------------------------------------------------------
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   630
509e4801c378 1. Copyrights changed to EPL
noe\swadi
parents:
diff changeset
   631