.TH MACH-SYMBOL 3
.SH NAME
symopen, symclose, findhdr, indexsym, lookupsym, findsym,
findexsym, flookupsym, ffindsym,
lookuplsym, indexlsym, findlsym,
symoff, pc2file, file2pc, line2pc, fnbound, fileline,
pc2line \- symbol table access functions
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.br
.B #include <mach.h>
.PP
.ta \w'\fBxxxxxxxx'u +\w'\fBxxxxxx'u
.ft B
int	symopen(Fhdr *hdr)
.br
void	symclose(Fhdr *hdr)
.br
Fhdr	*findhdr(char *name)
.br
extern	Fhdr*	fhdrlist;
.PP
.ft B
int	indexsym(uint n, Symbol *s)
.br
int	lookupsym(char *fn, char *var, Symbol *s)
.br
int	findsym(Loc loc, uint class, Symbol *s)
.PP
.ft B
int	findexsym(Fhdr *hdr, uint n, Symbol *s)
.br
Symbol	*flookupsym(Fhdr *hdr, char *name)
.br
Symbol	*ffindsym(Fhdr *hdr, Loc loc, uint class)
.PP
.ft B
int	indexlsym(Symbol *s1, uint n, Symbol *s2)
.br
int	lookuplsym(Symbol *s1, char *name, Symbol *s2)
.br
int	findlsym(Symbol *s1, Loc loc, Symbol *s2)
.PP
.ft B
int	symoff(char *a, uint n, ulong addr, uint class)
.PP
.ft B
int	pc2file(ulong pc, char *file, uint n, ulong *line)
.br
int	pc2line(ulong pc, ulong *line)
.br
int	fileline(ulong pc, char *buf, uint n)
.br
int	file2pc(char *file, ulong line, ulong *pc)
.br
int	line2pc(ulong basepc, ulong line, ulong *pc)
.br
int	fnbound(ulong pc, ulong bounds[2])
.SH DESCRIPTION
These functions provide machine-independent access to the
symbol table of an executable file or executing process.
.IR Mach (3),
.IR mach-file (3),
and
.IR mach-map (3)
describe additional library functions for
accessing executable files and executing processes.
.PP
.IR Symopen
uses the data in the 
.B Fhdr
structure filled by
.I crackhdr
(see
.IR mach-file (3))
to initialize in-memory structures used to access the symbol
tables contained in the file.
.IR Symclose
frees the structures.
The rest of the functions described here access a composite
symbol table made up of all currently open tables.
.PP
The set of all currently open 
.BR Fhdr s
is maintained as a linked list starting at
.I fhdrlist 
(chained via 
.BR Fhdr.next ).
.PP
.I Findhdr
searches the currently open
.BR Fhdr s
for one whose file name ends with the path
.I name
(that is,
.B libc.so
matches
.B /usr/lib/libc.so
but not
.BR mylibc.so ).
.PP
The
.B Symbol
data structure:
.IP
.RS
.ft B
.nf
typedef struct Symbol Symbol;
struct Symbol
{
	char	*name;
	Loc	loc;
	Loc	hiloc;
	char	class;
	char	type;
	\fI...\fP
};
.fi
.RE
.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:
.RS
.TP
.B T
text segment symbol
.TP
.B t
static text segment symbol
.TP
.B D
data segment symbol
.TP
.B d
static data segment symbol
.TP
.B B
bss segment symbol
.TP
.B b
static bss segment symbol
.TP
.B a
automatic (local) variable symbol
.TP
.B p
function parameter symbol
.TP
.B U
undefined symbol
.RE
.PD
.LP
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 Indexsym
stores information for the
.I n th
symbol into
.IR s .
The symbols are ordered by increasing address.
.PP
.I Lookupsym
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 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
.IR Findexsym ,
.IR flookupsym ,
and
.I ffindsym
are similar to
.IR indexsym ,
.IR lookupsym ,
and
.IR findsym ,
but operate only on the symbols from
.IR hdr .
.I Flookupsym
and
.I ffindsym
return pointers to data stored in the
.IR hdr ,
which must not be modified or freed.
.PP
.IR Indexlsym ,
.IR lookuplsym ,
and
.I findlsym
are similar to
.IR indexsym ,
.IR lookupsym ,
and
.IR findsym ,
but operate on the smaller symbol table of parameters and
variables local to the function represented by symbol
.IR s1 .
.PP
.I Indexlsym
writes symbol information for the 
.IR n th
local symbol of function
.I s1
to 
.IR s2 .
Function parameters appear first in the ordering, followed by local symbols.
.PP
.I Lookuplsym
writes symbol information for the symbol named
.I name
in function
.I s1
to
.IR s2 .
.PP
.I Findlsym
searches for a symbol local to the function
.I s1
whose location is exactly
.IR loc ,
writing its symbol information to
.IR s2 .
.I Loc
is almost always an indirection through a frame pointer register;
the details vary from architecture to architecture.
.PP
.I Symoff
converts a location to a symbol reference. 
The string containing that reference is of the form
`name+offset', where `name' is the name of the
nearest symbol with an address less than or equal to the
target address, and `offset' is the hexadecimal offset beyond
that symbol.  If `offset' is zero, only the name of the
symbol is printed.
If no symbol is found within 4096 bytes of the address, the address
is formatted as a hexadecimal address.
.I Buf
is the address of a buffer of
.I n
bytes to receive the formatted string.
.I Addr
is the address to be converted.
.I Type
is the type code of the search space:
.BR CTEXT ,
.BR CDATA ,
or 
.BR CANY .
.I Symoff
returns the length of the formatted string contained in
.IR buf .
.PP
.I Pc2file
searches the symbol table to find the file and line number
corresponding to the instruction at program counter
.IR pc .
.I File
is the address of a buffer of
.I n
bytes to receive the file name.
.I Line
receives the line number.
.PP
.I Pc2line
is like
.I pc2file
but neglects to return information about the source file.
.PP
.I Fileline
is also like
.IR pc2file ,
but returns the file and line number in the
.IR n -byte
text buffer
.IR buf ,
formatted as
`file:line'.
.PP
.I File2pc
performs the opposite mapping:
it stores in
.I pc
a text address associated with
line
.I line
in file
.IR file .
.PP
.I Line2pc
is similar: it converts a line number to an
instruction address, storing it in
.IR pc .
Since a line number does not uniquely identify an
instruction (e.g., every source file has line 1),
.I basepc
specifies a text address from which
the search begins.
Usually this is the address of the first function in the
file of interest.
.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 first address beyond the end of the target function.
.PP
All functions return 0 on success and \-1 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 \*9/src/libmach
.SH "SEE ALSO"
.IR mach (3),
.IR mach-file (3),
.IR mach-map (3)
