1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
/**************************** cmdline.h ***********************************
* Author: Agner Fog
* Date created: 2006-07-25
* Last modified: 2006-07-25
* Project: objconv
* Module: cmdline.h
* Description:
* Header file for command line interpreter cmdline.cpp
*
* Copyright 2006-2008 GNU General Public License http://www.gnu.org/licenses
*****************************************************************************/
#ifndef CMDLINE_H
#define CMDLINE_H
/************************** Define constants ******************************/
// Max number of response files on command line
#define MAX_COMMAND_FILES 10
// Constants for output file type
#define CMDL_OUTPUT_DUMP 0x80 // No output file, just dump contents
#define CMDL_OUTPUT_ELF FILETYPE_ELF // ELF file
#define CMDL_OUTPUT_PE FILETYPE_COFF // MS-COFF/PE file
#define CMDL_OUTPUT_OMF FILETYPE_OMF // OMF file
#define CMDL_OUTPUT_MACHO FILETYPE_MACHO_LE // Mach-O file, little endian
#define CMDL_OUTPUT_MASM FILETYPE_ASM // Disassembly
// Constants for subtypes
#define SUBTYPE_MASM 0 // Disassembly MASM/TASM
#define SUBTYPE_NASM 1 // Disassembly NASM/YASM
#define SUBTYPE_GASM 2 // Disassembly GAS(Intel)
// Constants for verbose or silent console output
#define CMDL_VERBOSE_NO 0 // Silent. No console output if no errors or warnings
#define CMDL_VERBOSE_YES 1 // Output messages about file names and types
#define CMDL_VERBOSE_DIAGNOSTICS 2 // Output more messages
// Constants for dump options
#define DUMP_NONE 0x0000 // Dump nothing
#define DUMP_FILEHDR 0x0001 // Dump file header
#define DUMP_SECTHDR 0x0002 // Dump section headers
#define DUMP_SYMTAB 0x0010 // Dump symbol table
#define DUMP_RELTAB 0x0020 // Dump relocation table
#define DUMP_STRINGTB 0x0040 // Dump string table
#define DUMP_COMMENT 0x0080 // Dump comment records
// Constants for stripping or converting debug information from file
#define CMDL_DEBUG_DEFAULT 0 // Remove if output is different format
#define CMDL_DEBUG_STRIP 1 // Remove debugging information from file
#define CMDL_DEBUG_PRESERVE 2 // Leave debugging information unchanged
#define CMDL_DEBUG_LINNUM 4 // Convert line number information (not supported)
#define CMDL_DEBUG_SYMBOLS 8 // Convert symbol information (not supported)
// Constants for stripping exception handler information from file
#define CMDL_EXCEPTION_DEFAULT 0 // Remove if output is different format
#define CMDL_EXCEPTION_STRIP 1 // Remove exception handler information from file
#define CMDL_EXCEPTION_PRESERVE 2 // Leave exception handler information unchanged
// Constants for adding/removing leading underscores from symbol names
#define CMDL_UNDERSCORE_NOCHANGE 0 // Don't add or remove underscores
#define CMDL_UNDERSCORE_CHANGE 1 // Change underscores to default for target
#define CMDL_UNDERSCORE_REMOVE 2 // Remove underscores from symbol names
#define CMDL_UNDERSCORE_ADD 3 // Add underscores to symbol names
#define CMDL_KEEP_ALIAS 0x100 // Keep old name as alias
// Constants for replacing leading dot with underscore or vice versa in section names
#define CMDL_SECTIONDOT_NOCHANGE 0 // Don't change section names
#define CMDL_SECTIONDOT_CHANGE 1 // Change leading character in section names to default for target
#define CMDL_SECTIONDOT_U2DOT 2 // Change underscore to dot in section names
#define CMDL_SECTIONDOT_DOT2U 3 // Change dot to underscore in unknown section names
// Constants for library options
#define CMDL_LIBRARY_DEFAULT 0 // No option specified
#define CMDL_LIBRARY_CONVERT 1 // Convert or modify library
#define CMDL_LIBRARY_ADDMEMBER 2 // Add object file to library
#define CMDL_LIBRARY_EXTRACTMEM 0x100 // Extract specified object file(s) from library
#define CMDL_LIBRARY_EXTRACTALL 0x110 // Extract all object files from library
// Constants for file input/output options
#define CMDL_FILE_INPUT 1 // Input file required
#define CMDL_FILE_IN_IF_EXISTS 2 // Read input file if it exists
#define CMDL_FILE_OUTPUT 0x10 // Write output file required
#define CMDL_FILE_IN_OUT_SAME 0x20 // Input and output files may have the same name
#define MAXSYMBOLLENGTH 1024 // Maximum length of symbols for changing underscore or dot
// Constants for symbol type as input to CCommandLineInterpreter::SymbolChange()
#define SYMT_OTHER 0 // File name or unknown symbol type
#define SYMT_SECTION 1 // Segment or section name
#define SYMT_LOCAL 2 // Local symbol (not imported or exported)
#define SYMT_PUBLIC 3 // Public or weak symbol (exported)
#define SYMT_EXTERNAL 4 // External symbol (imported)
#define SYMT_LIBRARYMEMBER 0x1000 // Name of library member
// Constants for symbol change action as defined in SSymbolChange::Action
// and output from CCommandLineInterpreter::SymbolChange()
#define SYMA_NOCHANGE 0 // Do nothing
#define SYMA_MAKE_WEAK 1 // Make symbol weak
#define SYMA_MAKE_LOCAL 2 // Make symbol local
#define SYMA_CHANGE_NAME 0x10 // Change name of symbol
#define SYMA_CHANGE_PREFIX 0x11 // Change beginning of symbol name
#define SYMA_CHANGE_SUFFIX 0x12 // Change end of symbol name
#define SYMA_ALIAS 0x100 // Make alias of public symbol and keep old name, must be combined
// with SYMA_CHANGE_NAME, SYMA_CHANGE_PREFIX or SYMA_CHANGE_SUFFIX
#define SYMA_ADD_MEMBER 0x1001 // Add member to library
#define SYMA_DELETE_MEMBER 0x1002 // Remove member from library
#define SYMA_EXTRACT_MEMBER 0x1004 // Extract member from library
// Structure for specifying desired change of a specific symbol
struct SSymbolChange {
char * Name1; // Symbol name to look for
char * Name2; // Replace with this name
int Action; // Action to take on symbol
int Done; // Count how many times this has been done
};
// Class for interpreting command line
class CCommandLineInterpreter {
public:
CCommandLineInterpreter(); // Default constructor
~CCommandLineInterpreter(); // Destructor
void ReadCommandLine(int argc, char * argv[]); // Read and interpret command line
int SymbolChange(char const * oldname, char const ** newname, int symtype); // Check if symbol has to be changed
int SymbolIsInList(char const * name); // Check if symbol is in SymbolList
int SymbolChangesRequested(); // Any kind of symbol change requested on command line
void ReportStatistics(); // Report statistics about name changes etc.
void CountDebugRemoved(); // Increment CountDebugSectionsRemoved
void CountExceptionRemoved(); // Increment CountExceptionSectionsRemoved
void CountSymbolsHidden(); // Increment CountUnusedSymbolsHidden
SSymbolChange const * GetMemberToAdd(); // Get names of object files to add to library
void CheckExtractSuccess(); // Check if library members to extract were found
void CheckSymbolModifySuccess(); // Check if symbols to modify were found
char * InputFile; // Input file name
char * OutputFile; // Output file name
int InputType; // Input file type (detected from file)
int OutputType; // Output type (file type or dump)
int SubType; // Subtype of output type. Assembly language dialect or library type
int MemberType; // File type of library members
int DesiredWordSize; // Desired word size for output file
uint32_t Verbose; // How much diagnostics to print on screen
uint32_t DumpOptions; // Options for dumping file
uint32_t DebugInfo; // Strip or convert debug info
uint32_t ExeptionInfo; // Strip or preserve exception handler info and other incompatible info
uint32_t Underscore; // Add/remove underscores in symbol names
uint32_t SegmentDot; // Change underscore/dot in beginning of segment names
uint32_t LibraryOptions; // Options for manipulating library
uint32_t LibrarySubtype; // Options for manipulating library
uint32_t FileOptions; // Options for input and output files
uint32_t ImageBase; // Specified image base
int ShowHelp; // Help screen printed
protected:
int libmode; // -lib option has been encountered
void ReadCommandItem(char *); // Read one option from command line
void ReadCommandFile(char *); // Read commands from file
void InterpretFileName(char *); // Interpret input or output filename from command line
void InterpretCommandOption(char *); // Interpret one option from command line
void InterpretOutputTypeOption(char *); // Interpret output type option from command line
void InterpretVerboseOption(char *); // Interpret silent/verbose option from command line
void InterpretDumpOption(char *); // Interpret dump option from command line
void InterpretDebugInfoOption(char *); // Interpret debug info option from command line
void InterpretExceptionInfoOption(char*); // Interpret exception handler info option from command line
void InterpretErrorOption(char *); // Interpret error option from command line
void InterpretSymbolNameChangeOption(char *); // Interpret various options for changing symbol names
void InterpretLibraryOption(char *); // Interpret options for manipulating library/archive files
void InterpretImagebaseOption(char *); // Interpret image base option
void AddObjectToLibrary(char * filename, char * membername); // Add object file to library
void Help(); // Print help message
CArrayBuf<CFileBuffer> ResponseFiles; // Array of up to 10 response file buffers
int NumBuffers; // Number of response file buffers
int SymbolChangeEntries; // Number of entries in SymbolList, except library entries
CMemoryBuffer SymbolList; // List of symbol names to change. Contains entries of type SSymbolChange
CMemoryBuffer MemberNames; // Buffer containing truncated member names
uint32_t MemberNamesAllocated; // Size of buffer in MemberNames
uint32_t CurrentSymbol; // Pointer into SymbolList
// Statistics counters
int CountUnderscoreConversions; // Count number of times symbol leading underscores are changed
int CountSectionDotConversions; // Count number of times leading character is changed on section names
int CountSymbolNameChanges; // Count number of times symbol names are changed at specific command
int CountSymbolNameAliases; // Count number of times symbol names are aliased at specific command or underscore command
int CountSymbolsWeakened; // Count number of times symbol names are made weak at specific command
int CountSymbolsMadeLocal; // Count number of times symbol names are made local at specific command
int CountUnusedSymbolsHidden; // Count number of times unused symbols are hidden
int CountDebugSectionsRemoved; // Count number of debug sections removed
int CountExceptionSectionsRemoved; // Count number of exception handler sections removed
};
extern CCommandLineInterpreter cmd; // Command line interpreter
#endif // #ifndef CMDLINE_H
|