kolibrios/programs/develop/objconv/cmdline.h

191 lines
13 KiB
C
Raw Normal View History

/**************************** 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_YASM 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 SymbolBinSearch(char const * name, int nsym, int * found);
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 Verbose; // How much diagnostics to print on screen
uint32 DumpOptions; // Options for dumping file
uint32 DebugInfo; // Strip or convert debug info
uint32 ExeptionInfo; // Strip or preserve exception handler info and other incompatible info
uint32 Underscore; // Add/remove underscores in symbol names
uint32 SegmentDot; // Change underscore/dot in beginning of segment names
uint32 LibraryOptions; // Options for manipulating library
uint32 LibrarySubtype; // Options for manipulating library
uint32 FileOptions; // Options for input and output files
uint32 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. Kept in sorted order
CMemoryBuffer PrefixSuffixList; // List of prefix/suffix to change. Contains entries of type SSymbolChange
CMemoryBuffer MemberNames; // Buffer containing truncated member names
uint32 MemberNamesAllocated; // Size of buffer in MemberNames
uint32 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