| .TH SYMBOL 3 |
| .SH NAME |
| syminit, getsym, symbase, pc2sp, pc2line, textseg, line2addr, lookup, findlocal, |
| getauto, findsym, localsym, globalsym, textsym, file2pc, fileelem, filesym, |
| fileline, fnbound \- symbol table access functions |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .br |
| .B #include <bio.h> |
| .br |
| .B #include <mach.h> |
| .PP |
| .ta \w'\fLmachines 'u |
| .B |
| int syminit(int fd, Fhdr *fp) |
| .PP |
| .B |
| Sym *getsym(int index) |
| .PP |
| .B |
| Sym *symbase(long *nsyms) |
| .PP |
| .B |
| int fileelem(Sym **fp, uchar *encname, char *buf, int n) |
| .PP |
| .B |
| int filesym(int index, char *buf, int n) |
| .PP |
| .B |
| long pc2sp(ulong pc) |
| .PP |
| .B |
| long pc2line(ulong pc) |
| .PP |
| .B |
| void textseg(ulong base, Fhdr *fp) |
| .PP |
| .B |
| long line2addr(ulong line, ulong basepc) |
| .PP |
| .B |
| int lookup(char *fn, char *var, Symbol *s) |
| .PP |
| .B |
| int findlocal(Symbol *s1, char *name, Symbol *s2) |
| .PP |
| .B |
| int getauto(Symbol *s1, int off, int class, Symbol *s2) |
| .PP |
| .B |
| int findsym(long addr, int class, Symbol *s) |
| .PP |
| .B |
| int localsym(Symbol *s, int index) |
| .PP |
| .B |
| int globalsym(Symbol *s, int index) |
| .PP |
| .B |
| int textsym(Symbol *s, int index) |
| .PP |
| .B |
| long file2pc(char *file, ulong line) |
| .PP |
| .B |
| int fileline(char *str, int n, ulong addr) |
| .PP |
| .B |
| int fnbound(long addr, ulong *bounds) |
| .SH DESCRIPTION |
| These functions provide machine-independent access to the |
| symbol table of an executable file or executing process. |
| The latter is accessible by opening the device |
| .B /proc/\fIpid\fP/text |
| as described in |
| .IR proc (3). |
| .IR Mach (2) |
| and |
| .IR object (2) |
| describe additional library functions |
| for processing executable and object files. |
| .PP |
| .IR Syminit , |
| .IR getsym , |
| .IR symbase , |
| .IR fileelem , |
| .IR pc2sp , |
| .IR pc2line , |
| and |
| .I line2addr |
| process the symbol table contained in an executable file |
| or the |
| .B text |
| image of an executing program. |
| The symbol table is stored internally as an array of |
| .B Sym |
| data structures as defined in |
| .IR a.out (6). |
| .PP |
| .I Syminit |
| uses the data in the |
| .B Fhdr |
| structure filled by |
| .I crackhdr |
| (see |
| .IR mach (2)) |
| to read the raw symbol tables from the open file descriptor |
| .IR fd . |
| It returns the count of the number of symbols |
| or \-1 if an error occurs. |
| .PP |
| .I Getsym |
| returns the address of the |
| .IR i th |
| .B Sym |
| structure or zero if |
| .I index |
| is out of range. |
| .PP |
| .I Symbase |
| returns the address of the first |
| .B Sym |
| structure in the symbol table. The number of |
| entries in the symbol table is returned in |
| .IR nsyms . |
| .PP |
| .I Fileelem |
| converts a file name, encoded as described in |
| .IR a.out (6), |
| to a character string. |
| .I Fp |
| is the base of |
| an array of pointers to file path components ordered by path index. |
| .I Encname |
| is the address of an array of encoded |
| file path components in the form of a |
| .B z |
| symbol table entry. |
| .I Buf |
| and |
| .I n |
| specify the |
| address of a receiving character buffer and its length. |
| .I Fileelem |
| returns the length of the null-terminated string |
| that is at most |
| .IR n \-1 |
| bytes long. |
| .PP |
| .I Filesym |
| is a higher-level interface to |
| .IR fileelem . |
| It fills |
| .I buf |
| with the name of the |
| .IR i th |
| file and returns the length of the null-terminated string |
| that is at most |
| .IR n \-1 |
| bytes long. |
| File names are retrieved in no particular order, although |
| the order of retrieval does not vary from one pass to the next. |
| A zero is returned when |
| .I index |
| is too large or too small or an error occurs during file name |
| conversion. |
| .PP |
| .I 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 approach only applies |
| to the 68020 architecture; other architectures |
| use a fixed stack frame offset by a constant contained |
| in a dummy local variable (called |
| .BR .frame ) |
| in the symbol table. |
| .PP |
| .I Pc2line |
| returns the line number of the statement associated |
| with the instruction address |
| .IR pc . |
| The |
| line number is the absolute line number in the |
| source file as seen by the compiler after pre-processing; the |
| original line number in the source file may be derived from this |
| value using the history stacks contained in the symbol table. |
| .PP |
| .I Pc2sp |
| and |
| .I pc2line |
| must know the start and end addresses of the text segment |
| for proper operation. These values are calculated from the |
| file header by function |
| .IR syminit . |
| If the text segment address is changed, the application |
| program must invoke |
| .I textseg |
| to recalculate the boundaries of the segment. |
| .I Base |
| is the new base address of the text segment and |
| .I fp |
| points to the |
| .I Fhdr |
| data structure filled by |
| .IR crackhdr . |
| .PP |
| .I 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 instruction location (e.g., every source file has line 1), |
| a second argument specifies a text address |
| from which the search begins. Usually this |
| is the address of the first function in the file of interest. |
| .PP |
| .IR Pc2sp , |
| .IR pc2line , |
| and |
| .I line2addr |
| return \-1 in the case of an error. |
| .PP |
| .IR Lookup , |
| .IR findlocal , |
| .IR getauto , |
| .IR findsym , |
| .IR localsym , |
| .IR globalsym , |
| .IR textsym , |
| .IR file2pc , |
| and |
| .I 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 symbol |
| table data. |
| .I Syminit |
| must be called |
| prior to using these functions. |
| The |
| .B Symbol |
| data structure: |
| .IP |
| .EX |
| typedef struct { |
| void *handle; /* private */ |
| struct { |
| char *name; |
| long value; |
| char type; |
| char class; |
| }; |
| } Symbol; |
| .EE |
| .LP |
| describes a symbol table entry. |
| The |
| .B value |
| field contains the offset of the symbol within its |
| address space: global variables relative to the beginning |
| of the data segment, text beyond the start of the text |
| segment, and automatic variables and parameters relative |
| to the stack frame. The |
| .B type |
| field contains the type of the symbol as defined in |
| .IR a.out (6). |
| The |
| .B class |
| field assigns the symbol to a general class; |
| .BR CTEXT , |
| .BR CDATA , |
| .BR CAUTO , |
| and |
| .B CPARAM |
| are the most popular. |
| .PP |
| .I Lookup |
| fills a |
| .B Symbol |
| structure with symbol table information. 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 |
| .I fn |
| and |
| .I var |
| 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 |
| .I var |
| is |
| zero, the text symbol table is searched for function |
| .IR fn . |
| If only |
| .I fn |
| is zero, the global variable table |
| is searched for |
| .IR var . |
| .PP |
| .I Findlocal |
| fills |
| .I s2 |
| with the symbol table data of the automatic variable |
| or parameter matching |
| .IR name . |
| .I S1 |
| is a |
| .B Symbol |
| data structure describing a function or a local variable; |
| the latter resolves to its owning function. |
| .PP |
| .I Getauto |
| searches the local symbols associated with function |
| .I s1 |
| for an automatic variable or parameter located at stack |
| offset |
| .IR off . |
| .I Class |
| selects the class of |
| variable: |
| .B CAUTO |
| or |
| .BR CPARAM . |
| .I S2 |
| is the address of a |
| .B Symbol |
| data structure to receive the symbol table information |
| of the desired symbol. |
| .PP |
| .I Findsym |
| returns the symbol table entry of type |
| .I class |
| stored near |
| .IR addr . |
| The selected symbol is a global variable or function |
| with address nearest to and less than or equal to |
| .IR addr . |
| Class specification |
| .B CDATA |
| searches only the global variable symbol table; class |
| .B CTEXT |
| limits the search to the text symbol table. |
| Class specification |
| .B CANY |
| searches the text table first, then the global table. |
| .PP |
| .I Localsym |
| returns the |
| .IR i th |
| local variable in the function |
| associated with |
| .IR s . |
| .I S |
| may reference a function or a local variable; the latter |
| resolves to its owning function. |
| If the |
| .IR i th |
| local symbol exists, |
| .I s |
| is filled with the data describing it. |
| .PP |
| .I Globalsym |
| loads |
| .I s |
| with the symbol table information of the |
| .IR i th |
| global variable. |
| .PP |
| .I Textsym |
| loads |
| .I s |
| with the symbol table information of the |
| .IR i th |
| text symbol. The text symbols are ordered |
| by increasing address. |
| .PP |
| .I File2pc |
| returns a text address associated with |
| .I line |
| in file |
| .IR file , |
| or -1 on an error. |
| .PP |
| .I Fileline |
| converts text address |
| .I addr |
| to its equivalent |
| line number in a source file. The result, |
| a null terminated character string of |
| the form |
| .LR file:line , |
| is placed in buffer |
| .I str |
| of |
| .I n |
| bytes. |
| .PP |
| .I Fnbound |
| returns the start and end addresses of the function containing |
| the text address supplied as the first argument. The second |
| argument is an array of two unsigned longs; |
| .I fnbound |
| places the bounding addresses of the function in the first |
| and second elements of this array. The start address is the |
| address of the first instruction of the function; the end |
| address is the address of the start of the next function |
| in memory, so it is beyond the end of the target function. |
| .I Fnbound |
| returns 1 if the address is within a text function, or zero |
| if the address selects no function. |
| .PP |
| Functions |
| .I file2pc |
| and |
| .I fileline |
| may produce inaccurate results when applied to |
| optimized code. |
| .PP |
| Unless otherwise specified, all functions return 1 |
| on success, or 0 on error. When an error occurs, |
| a message describing it is stored in the system |
| error buffer where it is available via |
| .IR errstr . |
| .SH SOURCE |
| .B /sys/src/libmach |
| .SH "SEE ALSO" |
| .IR mach (2), |
| .IR object (2), |
| .IR errstr (2), |
| .IR proc (3), |
| .IR a.out (6) |