MACHINES(2X) MACHINES(2X) NAME crackhdr, syminit, getsym, symbase, pc2sp, pc2line, line2addr, lookup, findlocal, getauto, findsym, localsym, globalsym, textsym, file2pc, fileelem, fileline, newmap, setmap, unusemap, freemap, loadmap, mget, mput, beswab, beswal, leswab, leswal - machine dependent library SYNOPSIS #include <mach.h> int crackhdr(int fd, Fhdr *fp) int syminit(int fd, Fhdr *fp) Sym *getsym(int index) Sym *symbase(long *nsyms) int fileelem(Sym **fp, uchar *encname, char *buf, int n) long pc2sp(ulong pc) long pc2line(ulong pc) long line2addr(ulong line, ulong basepc) int lookup(char *fn, char *var, Symbol *s) int findlocal(Symbol *s1, char *name, Symbol *s2) int getauto(Symbol *s1, int off, int class, Symbol *s2) int findsym(long addr, int class, Symbol *s) int localsym(Symbol *s, int index) int globalsym(Symbol *s, int index) int textsym(Symbol *s, int index) long file2pc(char *file, ulong line) int fileline(char *str, int n, ulong addr) Map *newmap(Map *map, int fd) int setmap(Map *map, int seg, ulong base, ulong end, ulong foffset) void unusemap(Map *map, int seg) MACHINES(2X) MACHINES(2X) Map *loadmap(Map *map, int fd, Fhdr *fp) int mget(Map *map, int seg, ulong addr, char *buf, int size) int mput(Map *map, int seg, ulong addr, char *buf, int size) ushort beswab(ushort s) long beswal(long l) ushort leswab(ushort s) long leswal(long l) DESCRIPTION The functions in this library provide machine-independent interpretation of executable and object files and executing process images. Crackhdr loads data structure fp with a machine-independent description of the header of the executable file or image associated with the open file descriptor fd. It also sets global variable mach pointing to the Mach data structure containing the machine-dependent parameters of the target architecture. Syminit, getsym, symbase, fileelem, pc2sp, pc2line, and line2addr process the symbol table contained in an exe- cutable file. The symbol table is stored internally as an array of Sym structures as defined in a.out(6). Syminit uses the Fhdr structure filled by crackhdr to load the raw symbol tables from the open file descriptor fd. It returns the count of the number of symbols in the symbol table or -1 if an error occurs. Getsym returns the address of the ith Sym structure or zero if index is out of range. Symbase returns the address of the first element of the vec- tor of Sym structures comprising the symbol table. The argument is the address of a long that is loaded with the number of entries in the symbol table. Fileelem converts a file name, encoded as described in a.out(6), to a character string. Fp is the base of an array of pointers to file path components ordered by path index. Encname is the address of an array of file path components in the form of a z symbol table entry. Buf and n specify the address of a character buffer and its length. Fileelem returns the length of the null-terminated string that is at MACHINES(2X) MACHINES(2X) most n-1 bytes long. Pc2sp returns an offset associated with a given value of the program counter. Adding this offset to the current value of the stack pointer gives the address of the current stack frame. This algorithm is only valid for the 386 and 68020 architectures; other architectures use a fixed frame acces- sible through a dummy local variable. Pc2line returns the line number of the statement associated with the instruction address pc. The line number returned is the absolute line number in the file as seen by the compiler after pre-processing; the original line number in the source file may derived from this value using the history stacks contained in the symbol table. Line2addr converts a line number to an instruction address. The first argument is the absolute line number in a file. Since a line number does not uniquely identify an instruc- tion location (every source file has line 1), a second argu- ment specifies a text address from which the search begins. Usually this is the address of the first function in the file of interest. Pc2sp, pc2line, and line2addr return -1 in the case of an error. Lookup, findlocal, getauto, findsym, localsym, globalsym, textsym, file2pc, and fileline operate on data structures riding above the raw symbol table. These data structures occupy memory and impose a startup penalty but speed retrievals and provide higher-level access to the basic sym- bol table. Syminit must be called prior to invoking these functions. The Symbol data structure: typedef struct { void *handle; /* private */ struct { char *name; long value; char type; char class; }; } Symbol; describes a symbol table entry. The value field contains the offset of the symbol within its address space: global variables relative to the beginning of the data segment, text beyond that start of the text segment, and automatic variables and parameters relative to the stack frame. The type field contains the type of the symbol as defined in a.out(6). The class field assigns the symbol to a general class; CTEXT, CDATA, CAUTO, and CPARAM are the most popular. MACHINES(2X) MACHINES(2X) Lookup fills a Symbol structure with symbol table informa- tion. Global variables and functions are represented by a single name; local variables and parameters are uniquely specified by a function and variable name pair. Arguments fnandvar contain the name of a function and variable, respectively. If both are non-zero, the symbol table is searched for a parameter or automatic variable. If only var is zero, the text symbol table is searched for function fn. If only fn is zero, the global variable table is searched for var. Findlocal fills s2 with the symbol table data of the auto- matic variable or parameter matching name. S1 is a Symbol data structure describing a function or a local variable; the latter resolves to its owning function. Getauto searches the local symbols associated with function s1 for an automatic variable or parameter located at stack offset off . Class selects the class of variable: CAUTO or CPARAM. S2 is the address of a Symbol data structure to receive the symbol table information of the desired symbol. Findsym returns the symbol table entry of type class stored near addr. The selected symbol is a global variable or func- tion with address nearest to and less than or equal to addr. Class specification CDATA searches only the global variable symbol table; class CTEXT limits the search to the text sym- bol table. Class specification CANY searches the text table first, then the global table. Localsym returns the ith local variable associated with the function indicated by s. S may reference a function or a local variable; the latter resolves to its owning function. If the ith local symbol exists, s is filled with the data describing it. Globalsym loads s with the symbol table information of the ith global variable. Textsym loads s with the symbol table information of the ith text symbol. The text symbols are ordered by increasing address. File2pc returns a text address associated with line in file file. Fileline converts text address addr to its equivalent line number in a source file. The result, a null terminated character string of the form file:line is placed in buffer str of n bytes. Up to n-1 characters are copied to the buffer. MACHINES(2X) MACHINES(2X) Functions file2pc and fileline may produce inaccurate results when applied to optimized code. A Map is a data structure used to transform an address in the logical address space of an executable to an offset in a file or executing image. Each map comprises up to four log- ical segments, named SEGDATA, SEGTEXT, SEGUBLK, and SEGREGS, that map the data, text, `u block', and register segments, respectively. A section of the physical address space may be mapped by multiple segments. A segment contains the low and high addresses of the logical address space of the seg- ment and the physical offset in the file or executing image to the base of the address space. Newmap creates a new map or recycles one currently in use. If map is zero, a new map is dynamically allocated, other- wise it is assumed to point to an existing map. The map is marked empty and attached to the open file descriptor fd. The address of the map is returned. Setmap loads segment seg of map with the segment mapping parameters. Base and end contain the lowest and highest virtual addresses mapped by the segment, respectively. Foffset contains the offset in the file or executable image to the start of the segment. Unusemap marks segment seg in map map empty. Other segments in the map remain unaffected. Loadmap uses the Fhdr data structure filled by crackhdr to initialize a map for an executable file or executing image. If map is zero, a new map is dynamically allocated; other- wise, map is initialized with the appropriate values. This function returns the address of the map if successful or zero on failure. Mget reads size bytes into buf from the file associated with map. The data is read from logical address addr in segment seg. Fput is similar except it writes to the executable file or executing image associated with map. Both functions return -1 if they are unable to calculate a physical address, 0 if the read or write operation fails, and 1 on success. The segment may be one of SEGTEXT, SEGDATA, SEGUBLK, or SEGREGS, or the special segment, SEGANY. If SEGANY is specified, the address translation is performed using the text, data, and u-block maps, in that order. Accesses to SEGDATA first attempt a translation using the data map then the u-block map. The read or write operation takes place at the address produced by the first valid translation. Beswab, and beswal convert a big-endian ushort and long MACHINES(2X) MACHINES(2X) respectively, to the target processor's native representa- tion. Leswab, and leswal perform the same conversion for a little-endian ushort and long respectively. Unless otherwise specified, all functions return 1 on suc- cess, or 0 on error. SEE ALSO a.out(6)