1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_soltools.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include <string.h> 32*cdf0e10cSrcweir #include <direct.h> 33*cdf0e10cSrcweir #include <stdio.h> 34*cdf0e10cSrcweir #include <stdlib.h> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include "ldump.hxx" 37*cdf0e10cSrcweir #include "hashtbl.hxx" 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir #define MAXSYM 65536 40*cdf0e10cSrcweir #define MAXBASE 98304 41*cdf0e10cSrcweir #define MAX_MAN 4096 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir int bFilter = 0; 44*cdf0e10cSrcweir int bLdump3 = 0; 45*cdf0e10cSrcweir int bUseDirectives = 0; 46*cdf0e10cSrcweir int bVerbose = 0; 47*cdf0e10cSrcweir int bExportByName = 0; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir class ExportSet : public HashTable 50*cdf0e10cSrcweir { 51*cdf0e10cSrcweir public: 52*cdf0e10cSrcweir ExportSet 53*cdf0e10cSrcweir ( 54*cdf0e10cSrcweir unsigned long lSize, 55*cdf0e10cSrcweir double dMaxLoadFactor = HashTable::m_defMaxLoadFactor, 56*cdf0e10cSrcweir double dGrowFactor = HashTable::m_defDefGrowFactor 57*cdf0e10cSrcweir ) 58*cdf0e10cSrcweir : HashTable(lSize,false,dMaxLoadFactor,dGrowFactor) {} 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir virtual ~ExportSet() {} 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir LibExport * Find (char * const& Key) const 63*cdf0e10cSrcweir { return (LibExport *) HashTable::Find((char *) Key); } 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir bool Insert (char * const& Key, LibExport * Object) 66*cdf0e10cSrcweir { return HashTable::Insert((char *) Key, (void*) Object); } 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir LibExport * Delete (char * const&Key) 69*cdf0e10cSrcweir { return (LibExport *) HashTable::Delete ((char *) Key); } 70*cdf0e10cSrcweir }; 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir LibDump::LibDump( char *cFileName, int bExportByName ) 73*cdf0e10cSrcweir : cBName( NULL ), 74*cdf0e10cSrcweir cAPrefix( NULL ), 75*cdf0e10cSrcweir cLibName( NULL ), 76*cdf0e10cSrcweir cFilterName( NULL ), 77*cdf0e10cSrcweir cModName( NULL ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir fprintf( stderr, "LIB-NT File Dumper v4.00 (C) 2000 Sun Microsystems, Inc.\n\n" ); 80*cdf0e10cSrcweir fprintf( stderr, "%s ", cFileName ); 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir bExportName = bExportByName; 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir unsigned long nSlots = 0xfffff; 85*cdf0e10cSrcweir pBaseTab = new ExportSet( nSlots ); 86*cdf0e10cSrcweir pIndexTab = new ExportSet( nSlots ); 87*cdf0e10cSrcweir pFilterLines = new char * [MAXFILT]; 88*cdf0e10cSrcweir CheckLibrary(cFileName); 89*cdf0e10cSrcweir bBase = 0; 90*cdf0e10cSrcweir bAll = false; 91*cdf0e10cSrcweir nDefStart = 0; 92*cdf0e10cSrcweir nBaseLines = 0; 93*cdf0e10cSrcweir nFilterLines = 0; 94*cdf0e10cSrcweir bDef = true; 95*cdf0e10cSrcweir cAPrefix = new char[ 1 ]; 96*cdf0e10cSrcweir cAPrefix[ 0 ] = 0; 97*cdf0e10cSrcweir if (!bExportName) 98*cdf0e10cSrcweir CheckDataBase(); 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir bool LibDump::Dump() 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir FILE *pList; 104*cdf0e10cSrcweir char aBuf[MAX_MAN]; 105*cdf0e10cSrcweir int nLen; 106*cdf0e10cSrcweir char aName[MAX_MAN]; 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir pList = fopen( cLibName, "rb"); 109*cdf0e10cSrcweir if (!pList) 110*cdf0e10cSrcweir DumpError(10); 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir // forget about offset when working on linker directives 113*cdf0e10cSrcweir if ( !bUseDirectives ) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir // calculating offset for name section 116*cdf0e10cSrcweir unsigned char TmpBuffer[4]; 117*cdf0e10cSrcweir fread( TmpBuffer, 1, 4, pList); 118*cdf0e10cSrcweir // anzahl bigendian mal laenge + ueberspringen der naechsten laengenangabe 119*cdf0e10cSrcweir unsigned long nOffSet = (unsigned long) ( TmpBuffer[2] * 256 + TmpBuffer[3] ) * 4 + 4; 120*cdf0e10cSrcweir fseek( pList, (long) nOffSet, 0); 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir char aTmpBuf[4096]; 124*cdf0e10cSrcweir // reading file containing symbols 125*cdf0e10cSrcweir while( !feof( pList ) ) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir int i = 0; 128*cdf0e10cSrcweir if ( !bUseDirectives ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir // symbol komplett einlesen 131*cdf0e10cSrcweir for (;;) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir int c = fgetc( pList ); 134*cdf0e10cSrcweir if ( c == '\0' ) 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir break; 137*cdf0e10cSrcweir } 138*cdf0e10cSrcweir if ( ((c >= 33) && (c <= 126)) && ( c!=40 && c!=41) ) 139*cdf0e10cSrcweir aBuf[i] = static_cast< char >(c); 140*cdf0e10cSrcweir else 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir aBuf[0] = '\0'; 143*cdf0e10cSrcweir break; 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir i++; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir // Namen found 148*cdf0e10cSrcweir aBuf[i] = '\0'; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir else 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir fgets( aTmpBuf, 4096, pList ); 153*cdf0e10cSrcweir char * pEnd = 0; 154*cdf0e10cSrcweir char *pFound = 0; 155*cdf0e10cSrcweir aBuf[0] = '\0'; 156*cdf0e10cSrcweir pFound = strchr( aTmpBuf, 'E' ); 157*cdf0e10cSrcweir while ( pFound ) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir if ( strncmp( "EXPORT:", pFound, 7) == 0 ) 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir pFound += 7; 162*cdf0e10cSrcweir pEnd = strchr( pFound, ','); 163*cdf0e10cSrcweir if ( pEnd ) 164*cdf0e10cSrcweir *pEnd = '\0'; 165*cdf0e10cSrcweir strncpy( aBuf, pFound, strlen( pFound)); 166*cdf0e10cSrcweir aBuf[ strlen( pFound) ] = '\0'; 167*cdf0e10cSrcweir // fprintf( stderr, "\n--- %s\n", aBuf); 168*cdf0e10cSrcweir break; 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir else 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir pFound++; 173*cdf0e10cSrcweir pFound = strchr( pFound, 'E' ); 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir } 176*cdf0e10cSrcweir } 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir if ((aBuf[0] =='?') || !strncmp(aBuf, "__CT",4)) 179*cdf0e10cSrcweir { 180*cdf0e10cSrcweir nLen = (int) strlen(aBuf); 181*cdf0e10cSrcweir memset( aName, 0, sizeof( aName ) ); 182*cdf0e10cSrcweir int nName = 0; 183*cdf0e10cSrcweir for( i = 0; i < nLen; i++ ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir if ( (aBuf[i] != '\n') && (aBuf[i] != '\r') ) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir aName[nName] = aBuf[i]; 188*cdf0e10cSrcweir nName++; 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir // und raus damit 192*cdf0e10cSrcweir PrintSym( aName, bExportByName ); 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir else if ( bAll == true ) 195*cdf0e10cSrcweir { 196*cdf0e10cSrcweir int nPreLen = (int) strlen( cAPrefix ); 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir nLen = (int) strlen(aBuf); 199*cdf0e10cSrcweir memset( aName, 0, sizeof( aName ) ); 200*cdf0e10cSrcweir int nName = 0; 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir for( i = 0; i < nLen; i++ ) 203*cdf0e10cSrcweir { 204*cdf0e10cSrcweir if ( (aBuf[i] != '\n') && (aBuf[i] != '\r') ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir aName[nName] = aBuf[i]; 207*cdf0e10cSrcweir nName++; 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir } 210*cdf0e10cSrcweir //fprintf( stderr, "Gefundenen Prefix : %s %d \n", aTmpBuf, nPreLen ); 211*cdf0e10cSrcweir // den ersten _ raus 212*cdf0e10cSrcweir nLen = (int) strlen(aName); 213*cdf0e10cSrcweir if (aName[0] == '_') 214*cdf0e10cSrcweir strcpy( aBuf , &aName[1] ); 215*cdf0e10cSrcweir strncpy ( aTmpBuf, aBuf, (size_t) nPreLen ); 216*cdf0e10cSrcweir aTmpBuf[nPreLen] = '\0'; 217*cdf0e10cSrcweir if ( !strcmp( aTmpBuf, cAPrefix )) 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir if ( bLdump3 ) { 220*cdf0e10cSrcweir int nChar = '@'; 221*cdf0e10cSrcweir char *pNeu = strchr( aBuf, nChar ); 222*cdf0e10cSrcweir int nPos = pNeu - aBuf + 1; 223*cdf0e10cSrcweir if ( nPos > 0 ) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir char aOldBuf[MAX_MAN]; 226*cdf0e10cSrcweir strcpy( aOldBuf, aBuf ); 227*cdf0e10cSrcweir char pChar[MAX_MAN]; 228*cdf0e10cSrcweir strncpy( pChar, aBuf, (size_t) (nPos -1) ); 229*cdf0e10cSrcweir pChar[nPos-1] = '\0'; 230*cdf0e10cSrcweir strcpy( aBuf, pChar ); 231*cdf0e10cSrcweir strcat( aBuf, "=" ); 232*cdf0e10cSrcweir strcat( aBuf, aOldBuf ); 233*cdf0e10cSrcweir strcpy( pChar, "" ); 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir // und raus damit 237*cdf0e10cSrcweir PrintSym( aBuf, true ); 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir fclose(pList); 242*cdf0e10cSrcweir return true; 243*cdf0e10cSrcweir } 244*cdf0e10cSrcweir 245*cdf0e10cSrcweir bool LibDump::ReadFilter( char * cFilterName ) 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir FILE* pfFilter = 0; 248*cdf0e10cSrcweir char aBuf[MAX_MAN]; 249*cdf0e10cSrcweir char* pStr; 250*cdf0e10cSrcweir int nLen; 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir pfFilter = fopen( cFilterName, "r" ); 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir if ( !pfFilter ) 255*cdf0e10cSrcweir { 256*cdf0e10cSrcweir ::bFilter = 0; 257*cdf0e10cSrcweir DumpError( 500 ); 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir while( fgets( aBuf, MAX_MAN, pfFilter ) != 0 ) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir nLen = (int) strlen(aBuf); 263*cdf0e10cSrcweir pStr = new char[(unsigned int) nLen]; 264*cdf0e10cSrcweir if ( !pStr ) 265*cdf0e10cSrcweir DumpError( 98 ); 266*cdf0e10cSrcweir memcpy( pStr, aBuf, (unsigned int) nLen ); 267*cdf0e10cSrcweir if ( *(pStr+nLen-1) == '\n' ) 268*cdf0e10cSrcweir *(pStr+nLen-1) = '\0'; 269*cdf0e10cSrcweir pFilterLines[nFilterLines] = pStr; 270*cdf0e10cSrcweir nFilterLines++; 271*cdf0e10cSrcweir if ( nFilterLines >= MAXFILT ) 272*cdf0e10cSrcweir DumpError( 510 ); 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir fclose( pfFilter ); 276*cdf0e10cSrcweir return true; 277*cdf0e10cSrcweir } 278*cdf0e10cSrcweir 279*cdf0e10cSrcweir bool LibDump::PrintSym(char *pName, bool bName ) 280*cdf0e10cSrcweir { 281*cdf0e10cSrcweir LibExport *pData; 282*cdf0e10cSrcweir 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir // Filter auswerten 285*cdf0e10cSrcweir if ( Filter( pName ) ) 286*cdf0e10cSrcweir { 287*cdf0e10cSrcweir if ( strlen( pName ) > 3 ) 288*cdf0e10cSrcweir { 289*cdf0e10cSrcweir if ( bDef ) 290*cdf0e10cSrcweir { 291*cdf0e10cSrcweir if (!bBase) 292*cdf0e10cSrcweir if (bExportName) { 293*cdf0e10cSrcweir fprintf( stdout, "\t%s\n", pName ); 294*cdf0e10cSrcweir } else { 295*cdf0e10cSrcweir fprintf( stdout, "\t%s\t\t@%lu\n", pName, nDefStart ); 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir else 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir pData = pBaseTab->Find( pName ); 300*cdf0e10cSrcweir if ( pData ) 301*cdf0e10cSrcweir { 302*cdf0e10cSrcweir pData->bExport = true; 303*cdf0e10cSrcweir if ( bName ) 304*cdf0e10cSrcweir pData->bByName = true; 305*cdf0e10cSrcweir else 306*cdf0e10cSrcweir pData->bByName = false; 307*cdf0e10cSrcweir if ( bVerbose ) 308*cdf0e10cSrcweir fprintf(stderr,"."); 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir else 311*cdf0e10cSrcweir { 312*cdf0e10cSrcweir // neuen Export eintragen 313*cdf0e10cSrcweir pData = new LibExport; 314*cdf0e10cSrcweir pData->cExportName = new char[ strlen( pName ) + 1 ]; 315*cdf0e10cSrcweir strcpy( pData->cExportName, pName ); 316*cdf0e10cSrcweir pData->nOrdinal = nBaseLines++; 317*cdf0e10cSrcweir pData->bExport = true; 318*cdf0e10cSrcweir if ( bName ) 319*cdf0e10cSrcweir pData->bByName = true; 320*cdf0e10cSrcweir else 321*cdf0e10cSrcweir pData->bByName = false; 322*cdf0e10cSrcweir pBaseTab->Insert( pData->cExportName, pData ); 323*cdf0e10cSrcweir char *cBuffer = new char[ 30 ]; 324*cdf0e10cSrcweir sprintf( cBuffer, "%lu", pData->nOrdinal ); 325*cdf0e10cSrcweir pIndexTab->Insert( cBuffer, pData ); 326*cdf0e10cSrcweir delete [] cBuffer; 327*cdf0e10cSrcweir if ( bVerbose ) 328*cdf0e10cSrcweir fprintf(stderr,"n"); 329*cdf0e10cSrcweir } 330*cdf0e10cSrcweir } 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir else 333*cdf0e10cSrcweir printf( "%s\n", pName ); 334*cdf0e10cSrcweir nDefStart++; 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir } 337*cdf0e10cSrcweir return true; 338*cdf0e10cSrcweir } 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir bool LibDump::IsFromAnonymousNamespace (char *pExportName) { 341*cdf0e10cSrcweir char* pattern1 = "@?A0x"; 342*cdf0e10cSrcweir 343*cdf0e10cSrcweir if (strstr(pExportName, pattern1)) { 344*cdf0e10cSrcweir return true; 345*cdf0e10cSrcweir }; 346*cdf0e10cSrcweir return false; 347*cdf0e10cSrcweir }; 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir bool LibDump::Filter(char *pExportName) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir unsigned long i; 352*cdf0e10cSrcweir char pTest[256]; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir // filter out symbols from anonymous namespaces 355*cdf0e10cSrcweir if (IsFromAnonymousNamespace (pExportName)) 356*cdf0e10cSrcweir return false; 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir // Kein Filter gesetzt 359*cdf0e10cSrcweir if ( ::bFilter == 0 ) 360*cdf0e10cSrcweir return true; 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir for ( i=0; i<nFilterLines; i++ ) 363*cdf0e10cSrcweir { 364*cdf0e10cSrcweir //Zum vergleichen mu� das Plus abgeschnitteb werden 365*cdf0e10cSrcweir if(pFilterLines[i][0] != '+') 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir if ( strstr( pExportName, pFilterLines[i])) 368*cdf0e10cSrcweir return false; 369*cdf0e10cSrcweir } 370*cdf0e10cSrcweir else 371*cdf0e10cSrcweir { 372*cdf0e10cSrcweir strcpy(pTest,&pFilterLines[i][1]); 373*cdf0e10cSrcweir if ( strstr( pExportName, pTest)) 374*cdf0e10cSrcweir return true; 375*cdf0e10cSrcweir } 376*cdf0e10cSrcweir } 377*cdf0e10cSrcweir return true; 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir bool LibDump::SetFilter(char * cFilterName) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir ReadFilter( cFilterName ); 383*cdf0e10cSrcweir return true; 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir bool LibDump::CheckLibrary(char * cName) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir delete [] cLibName; 389*cdf0e10cSrcweir cLibName = new char[ strlen( cName ) + 1 ]; 390*cdf0e10cSrcweir strcpy( cLibName, cName ); 391*cdf0e10cSrcweir return true; 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir bool LibDump::ReadDataBase() 395*cdf0e10cSrcweir { 396*cdf0e10cSrcweir FILE* pfBase = 0; 397*cdf0e10cSrcweir char aBuf[MAX_MAN]; 398*cdf0e10cSrcweir char* pStr; 399*cdf0e10cSrcweir char cBuffer[ 30 ]; 400*cdf0e10cSrcweir int nLen; 401*cdf0e10cSrcweir LibExport *pData; 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir pfBase = fopen( cBName, "r" ); 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir if ( !pfBase ) 406*cdf0e10cSrcweir { 407*cdf0e10cSrcweir bBase = 0; 408*cdf0e10cSrcweir DumpError( 600 ); 409*cdf0e10cSrcweir } 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir bool bRet = true; 412*cdf0e10cSrcweir while( fgets( aBuf, MAX_MAN, pfBase ) != 0 ) 413*cdf0e10cSrcweir { 414*cdf0e10cSrcweir nLen = (int) strlen(aBuf); 415*cdf0e10cSrcweir pStr = new char[(unsigned int) nLen]; 416*cdf0e10cSrcweir if ( !pStr ) 417*cdf0e10cSrcweir DumpError( 98 ); 418*cdf0e10cSrcweir memcpy( pStr, aBuf, (size_t) nLen ); 419*cdf0e10cSrcweir if ( *(pStr+nLen-1) == '\n' ) 420*cdf0e10cSrcweir *(pStr+nLen-1) = '\0'; 421*cdf0e10cSrcweir pData = new LibExport; 422*cdf0e10cSrcweir pData->cExportName = pStr; 423*cdf0e10cSrcweir pData->nOrdinal = nBaseLines; 424*cdf0e10cSrcweir pData->bExport=false; 425*cdf0e10cSrcweir 426*cdf0e10cSrcweir if (pBaseTab->Insert(pData->cExportName, pData ) == NULL) 427*cdf0e10cSrcweir bRet = false; 428*cdf0e10cSrcweir ltoa( (long) pData->nOrdinal, cBuffer, 10 ); 429*cdf0e10cSrcweir if (pIndexTab->Insert( cBuffer, pData ) == NULL) 430*cdf0e10cSrcweir bRet = false; 431*cdf0e10cSrcweir nBaseLines++; 432*cdf0e10cSrcweir if ( nBaseLines >= MAXBASE ) 433*cdf0e10cSrcweir DumpError( 610 ); 434*cdf0e10cSrcweir } 435*cdf0e10cSrcweir fclose( pfBase ); 436*cdf0e10cSrcweir return bRet; 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir class ExportSetIter : public HashTableIterator 440*cdf0e10cSrcweir { 441*cdf0e10cSrcweir public: 442*cdf0e10cSrcweir ExportSetIter(HashTable const& aTable) 443*cdf0e10cSrcweir : HashTableIterator(aTable) {} 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir LibExport * GetFirst() 446*cdf0e10cSrcweir { return (LibExport *)HashTableIterator::GetFirst(); } 447*cdf0e10cSrcweir LibExport * GetNext() 448*cdf0e10cSrcweir { return (LibExport *)HashTableIterator::GetNext(); } 449*cdf0e10cSrcweir LibExport * GetLast() 450*cdf0e10cSrcweir { return (LibExport *)HashTableIterator::GetLast(); } 451*cdf0e10cSrcweir LibExport * GetPrev() 452*cdf0e10cSrcweir { return (LibExport *)HashTableIterator::GetPrev(); } 453*cdf0e10cSrcweir 454*cdf0e10cSrcweir private: 455*cdf0e10cSrcweir void operator =(ExportSetIter &); // not defined 456*cdf0e10cSrcweir }; 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir bool LibDump::PrintDataBase() 459*cdf0e10cSrcweir { 460*cdf0e10cSrcweir if (bExportName) 461*cdf0e10cSrcweir return true; 462*cdf0e10cSrcweir FILE *pFp; 463*cdf0e10cSrcweir pFp = fopen (cBName,"w+"); 464*cdf0e10cSrcweir if (!pFp) 465*cdf0e10cSrcweir fprintf( stderr, "Error opening DataBase File\n" ); 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir LibExport *pData; 468*cdf0e10cSrcweir for ( unsigned long i=0; i < nBaseLines+10; i++ ) 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir char * cBuffer = new char[ 30 ]; 471*cdf0e10cSrcweir sprintf( cBuffer, "%lu", i ); 472*cdf0e10cSrcweir pData = pIndexTab->Find( cBuffer ); 473*cdf0e10cSrcweir delete [] cBuffer; 474*cdf0e10cSrcweir if ( pData ) 475*cdf0e10cSrcweir fprintf(pFp,"%s\n",pData->cExportName); 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir fclose(pFp); 478*cdf0e10cSrcweir return true; 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir bool LibDump::PrintDefFile() 482*cdf0e10cSrcweir { 483*cdf0e10cSrcweir #ifdef FAST 484*cdf0e10cSrcweir ExportSetIter aIterator( *pBaseTab ); 485*cdf0e10cSrcweir for ( LibExport *pData = aIterator.GetFirst(); pData != NULL; 486*cdf0e10cSrcweir pData = aIterator.GetNext() ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir if ( pData->bExport ) 489*cdf0e10cSrcweir { 490*cdf0e10cSrcweir if ( pData->bByName ) 491*cdf0e10cSrcweir { 492*cdf0e10cSrcweir fprintf(stdout,"\t%s\n", 493*cdf0e10cSrcweir pData->sExportName.GetBuffer()); 494*cdf0e10cSrcweir } 495*cdf0e10cSrcweir else 496*cdf0e10cSrcweir { 497*cdf0e10cSrcweir fprintf(stdout,"\t%s\t\t@%d NONAME\n", 498*cdf0e10cSrcweir pData->sExportName.GetBuffer(), pData->nOrdinal+nBegin); 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir } 502*cdf0e10cSrcweir #else 503*cdf0e10cSrcweir // sortiert nach Ordinals; 504*cdf0e10cSrcweir LibExport *pData; 505*cdf0e10cSrcweir for ( unsigned long i=0; i<nBaseLines+1; i++) 506*cdf0e10cSrcweir { 507*cdf0e10cSrcweir char * cBuffer = new char[ 30 ]; 508*cdf0e10cSrcweir sprintf( cBuffer, "%lu", i ); 509*cdf0e10cSrcweir pData = pIndexTab->Find( cBuffer ); 510*cdf0e10cSrcweir delete [] cBuffer; 511*cdf0e10cSrcweir if ( pData ) 512*cdf0e10cSrcweir if ( pData->bExport ) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir if ( pData->bByName ) 515*cdf0e10cSrcweir { 516*cdf0e10cSrcweir if ( strlen( pData->cExportName )) 517*cdf0e10cSrcweir fprintf(stdout,"\t%s\n", 518*cdf0e10cSrcweir pData->cExportName); 519*cdf0e10cSrcweir } 520*cdf0e10cSrcweir else 521*cdf0e10cSrcweir { 522*cdf0e10cSrcweir if ( strlen( pData->cExportName )) 523*cdf0e10cSrcweir fprintf(stdout,"\t%s\t\t@%d NONAME\n", 524*cdf0e10cSrcweir pData->cExportName, pData->nOrdinal+nBegin); 525*cdf0e10cSrcweir } 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir #endif 529*cdf0e10cSrcweir return true; 530*cdf0e10cSrcweir } 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir bool LibDump::CheckDataBase() 533*cdf0e10cSrcweir { 534*cdf0e10cSrcweir // existiert eine Datenbasis ? 535*cdf0e10cSrcweir if (!bBase) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir cBName = new char[ 2048 ]; 538*cdf0e10cSrcweir char *pTmp = "defs\\"; 539*cdf0e10cSrcweir 540*cdf0e10cSrcweir FILE *fp; 541*cdf0e10cSrcweir #ifdef OS2 542*cdf0e10cSrcweir _mkdir ("defs", 0777); 543*cdf0e10cSrcweir #else 544*cdf0e10cSrcweir _mkdir ("defs"); 545*cdf0e10cSrcweir #endif 546*cdf0e10cSrcweir strcpy(cBName,pTmp); 547*cdf0e10cSrcweir #ifdef OS2 548*cdf0e10cSrcweir strcat(cBName,"gcc"); 549*cdf0e10cSrcweir #else 550*cdf0e10cSrcweir strcat(cBName,getenv ("COMP_ENV")); 551*cdf0e10cSrcweir #endif 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir fp = fopen (cBName,"r"); 554*cdf0e10cSrcweir if (fp) 555*cdf0e10cSrcweir { 556*cdf0e10cSrcweir bBase = true; 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir else 559*cdf0e10cSrcweir { 560*cdf0e10cSrcweir fp = fopen (cBName,"w+"); 561*cdf0e10cSrcweir bBase = true; 562*cdf0e10cSrcweir } 563*cdf0e10cSrcweir fclose (fp); 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir // lese Datenbasis ! 566*cdf0e10cSrcweir if (bBase) 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir ReadDataBase(); 569*cdf0e10cSrcweir } 570*cdf0e10cSrcweir return true; 571*cdf0e10cSrcweir } 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir LibDump::~LibDump() 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir delete [] cBName; 576*cdf0e10cSrcweir delete [] cAPrefix; 577*cdf0e10cSrcweir // delete [] cLibName; 578*cdf0e10cSrcweir delete [] cFilterName; 579*cdf0e10cSrcweir delete [] cModName; 580*cdf0e10cSrcweir } 581*cdf0e10cSrcweir 582*cdf0e10cSrcweir void LibDump::SetCExport( char* pName ) 583*cdf0e10cSrcweir { 584*cdf0e10cSrcweir delete [] cAPrefix; 585*cdf0e10cSrcweir cAPrefix = new char[ strlen( pName ) + 1 ]; 586*cdf0e10cSrcweir strcpy( cAPrefix, pName );bAll = true; 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir 589*cdf0e10cSrcweir //****************************************************************** 590*cdf0e10cSrcweir //* Error() - Gibt Fehlermeldumg aus 591*cdf0e10cSrcweir //****************************************************************** 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir void LibDump::DumpError( unsigned long n ) 594*cdf0e10cSrcweir { 595*cdf0e10cSrcweir char *p; 596*cdf0e10cSrcweir 597*cdf0e10cSrcweir switch (n) 598*cdf0e10cSrcweir { 599*cdf0e10cSrcweir case 1: p = "Input error in library file"; break; 600*cdf0e10cSrcweir case 2: p = "Position error in library file (no THEADR set)"; break; 601*cdf0e10cSrcweir case 3: p = "Overflow of symbol table"; break; 602*cdf0e10cSrcweir #ifdef WNT 603*cdf0e10cSrcweir case 10: p = "EXP file not found"; break; 604*cdf0e10cSrcweir case 11: p = "No valid EXP file"; break; 605*cdf0e10cSrcweir #else 606*cdf0e10cSrcweir case 10: p = "Library file not found"; break; 607*cdf0e10cSrcweir case 11: p = "No valid library file"; break; 608*cdf0e10cSrcweir #endif 609*cdf0e10cSrcweir case 98: p = "Out of memory"; break; 610*cdf0e10cSrcweir case 99: p = "LDUMP [-LD3] [-D] [-N] [-A] [-E nn] [-F name] Filename[.LIB]\n" 611*cdf0e10cSrcweir "-LD3 : Supports feature set of ldump3 (default: ldump/ldump2)\n" 612*cdf0e10cSrcweir "-A : all symbols (default: only C++)\n" 613*cdf0e10cSrcweir "-E nn : gerenration of export table beginning with number nn\n" 614*cdf0e10cSrcweir "-F name: Filter file\n" 615*cdf0e10cSrcweir "-D : file contains \"dumpbin\" directives\n" 616*cdf0e10cSrcweir "-N : export by name\n" 617*cdf0e10cSrcweir "-V : be verbose\n"; break; 618*cdf0e10cSrcweir case 500: p = "Unable to open filter file\n"; break; 619*cdf0e10cSrcweir case 510: p = "Overflow of filter table\n"; break; 620*cdf0e10cSrcweir case 600: p = "Unable to open base database file\n"; break; 621*cdf0e10cSrcweir case 610: p = "Overflow in base database table\n"; break; 622*cdf0e10cSrcweir default: p = "Unspecified error"; 623*cdf0e10cSrcweir } 624*cdf0e10cSrcweir fprintf( stdout, "%s\n", p ); 625*cdf0e10cSrcweir exit (1); 626*cdf0e10cSrcweir } 627*cdf0e10cSrcweir 628*cdf0e10cSrcweir /********************************************************************* 629*cdf0e10cSrcweir Test Funktionen 630*cdf0e10cSrcweir *********************************************************************/ 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir void usage() 634*cdf0e10cSrcweir { 635*cdf0e10cSrcweir LibDump::DumpError(99); 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir #define STATE_NON 0x0000 639*cdf0e10cSrcweir #define STATE_BEGIN 0x0001 640*cdf0e10cSrcweir #define STATE_FILTER 0x0002 641*cdf0e10cSrcweir #define STATE_CEXPORT 0x0003 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir int 644*cdf0e10cSrcweir #ifdef WNT 645*cdf0e10cSrcweir __cdecl 646*cdf0e10cSrcweir #endif 647*cdf0e10cSrcweir main( int argc, char **argv ) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir char *pLibName = NULL, *pFilterName = NULL, *pCExport= NULL; 650*cdf0e10cSrcweir unsigned short nBegin=1; 651*cdf0e10cSrcweir 652*cdf0e10cSrcweir unsigned short nState = STATE_NON; 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir if ( argc == 1 ) { 655*cdf0e10cSrcweir usage(); 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir 658*cdf0e10cSrcweir for ( int i = 1; i < argc; i++ ) { 659*cdf0e10cSrcweir if (( !strcmp( argv[ i ], "-H" )) || 660*cdf0e10cSrcweir ( !strcmp( argv[ i ], "-h" )) || 661*cdf0e10cSrcweir ( !strcmp( argv[ i ], "-?" ))) 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir usage(); 664*cdf0e10cSrcweir } 665*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-LD3" )) || 666*cdf0e10cSrcweir ( !strcmp( argv[ i ], "-Ld3" )) || 667*cdf0e10cSrcweir ( !strcmp( argv[ i ], "-ld3" )) || 668*cdf0e10cSrcweir ( !strcmp( argv[ i ], "-lD3" ))) 669*cdf0e10cSrcweir { 670*cdf0e10cSrcweir if ( nState != STATE_NON ) { 671*cdf0e10cSrcweir usage(); 672*cdf0e10cSrcweir } 673*cdf0e10cSrcweir bLdump3 = 1; 674*cdf0e10cSrcweir } 675*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-E" )) || ( !strcmp( argv[ i ], "-e" ))) { 676*cdf0e10cSrcweir if ( nState != STATE_NON ) { 677*cdf0e10cSrcweir usage(); 678*cdf0e10cSrcweir } 679*cdf0e10cSrcweir nState = STATE_BEGIN; 680*cdf0e10cSrcweir } 681*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-F" )) || ( !strcmp( argv[ i ], "-f" ))) { 682*cdf0e10cSrcweir if ( nState != STATE_NON ) { 683*cdf0e10cSrcweir usage(); 684*cdf0e10cSrcweir } 685*cdf0e10cSrcweir nState = STATE_FILTER; 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-A" )) || ( !strcmp( argv[ i ], "-a" ))) { 688*cdf0e10cSrcweir if ( nState != STATE_NON ) { 689*cdf0e10cSrcweir usage(); 690*cdf0e10cSrcweir } 691*cdf0e10cSrcweir nState = STATE_CEXPORT; 692*cdf0e10cSrcweir pCExport = new char[ 1 ]; 693*cdf0e10cSrcweir pCExport[ 0 ] = 0; 694*cdf0e10cSrcweir } 695*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-D" )) || ( !strcmp( argv[ i ], "-d" ))) { 696*cdf0e10cSrcweir if ( nState != STATE_NON ) { 697*cdf0e10cSrcweir usage(); 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir bUseDirectives = 1; 700*cdf0e10cSrcweir } 701*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-N" )) || ( !strcmp( argv[ i ], "-n" ))) { 702*cdf0e10cSrcweir if ( nState != STATE_NON ) { 703*cdf0e10cSrcweir usage(); 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir bExportByName = 1; 706*cdf0e10cSrcweir } 707*cdf0e10cSrcweir else if (( !strcmp( argv[ i ], "-V" )) || ( !strcmp( argv[ i ], "-v" ))) { 708*cdf0e10cSrcweir if ( nState != STATE_NON ) { 709*cdf0e10cSrcweir usage(); 710*cdf0e10cSrcweir } 711*cdf0e10cSrcweir bVerbose = 1; 712*cdf0e10cSrcweir } 713*cdf0e10cSrcweir else { 714*cdf0e10cSrcweir switch ( nState ) { 715*cdf0e10cSrcweir case STATE_BEGIN: 716*cdf0e10cSrcweir nBegin = static_cast< unsigned short >(atoi( argv[ i ] )); 717*cdf0e10cSrcweir nState = STATE_NON; 718*cdf0e10cSrcweir break; 719*cdf0e10cSrcweir case STATE_FILTER: 720*cdf0e10cSrcweir pFilterName = new char[ strlen( argv[ i ] ) + 1 ]; 721*cdf0e10cSrcweir strcpy( pFilterName, argv[ i ] ); 722*cdf0e10cSrcweir bFilter = 1; 723*cdf0e10cSrcweir nState = STATE_NON; 724*cdf0e10cSrcweir break; 725*cdf0e10cSrcweir case STATE_CEXPORT: 726*cdf0e10cSrcweir delete [] pCExport; 727*cdf0e10cSrcweir pCExport = new char[ strlen( argv[ i ] ) + 1 ]; 728*cdf0e10cSrcweir strcpy( pCExport, argv[ i ] ); 729*cdf0e10cSrcweir nState = STATE_NON; 730*cdf0e10cSrcweir break; 731*cdf0e10cSrcweir default: 732*cdf0e10cSrcweir pLibName = new char[ strlen( argv[ i ] ) + 1 ]; 733*cdf0e10cSrcweir strcpy( pLibName, argv[ i ] ); 734*cdf0e10cSrcweir break; 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir } 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir 739*cdf0e10cSrcweir if ( !pLibName ) { 740*cdf0e10cSrcweir usage(); 741*cdf0e10cSrcweir } 742*cdf0e10cSrcweir 743*cdf0e10cSrcweir LibDump *pDump = new LibDump( pLibName, bExportByName ); 744*cdf0e10cSrcweir pDump->SetBeginExport(nBegin); 745*cdf0e10cSrcweir if ( bFilter != 0 ) 746*cdf0e10cSrcweir pDump->SetFilter( pFilterName ); 747*cdf0e10cSrcweir if ( pCExport ) 748*cdf0e10cSrcweir pDump->SetCExport( pCExport ); 749*cdf0e10cSrcweir else { 750*cdf0e10cSrcweir char *pEmpty = ""; 751*cdf0e10cSrcweir pDump->SetCExport( pEmpty ); 752*cdf0e10cSrcweir } 753*cdf0e10cSrcweir pDump->Dump(); 754*cdf0e10cSrcweir pDump->PrintDefFile(); 755*cdf0e10cSrcweir pDump->PrintDataBase(); 756*cdf0e10cSrcweir delete pDump; 757*cdf0e10cSrcweir return 0; 758*cdf0e10cSrcweir } 759