File: cmdline.h

package info (click to toggle)
objconv 2.56%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,300 kB
  • sloc: cpp: 27,039; makefile: 4; sh: 2
file content (188 lines) | stat: -rw-r--r-- 12,748 bytes parent folder | download | duplicates (2)
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