123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- .TH SYMBOL 2
- .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)
|