| .TH MACH-FILE 3 |
| .SH NAME |
| crackhdr, uncrackhdr, mapfile, unmapfile, mapproc, unmapproc, detachproc, ctlproc, |
| procnotes \- machine-independent access to exectuable files and running processes |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .br |
| .B #include <mach.h> |
| .PP |
| .ft B |
| .ta \w'\fBxxxxxx'u +\w'xxxxxx'u |
| int crackhdr(int fd, Fhdr *hdr) |
| .br |
| void uncrackhdr(Fhdr *hdr) |
| .PP |
| .ft B |
| int mapfile(Fhdr *hdr, ulong base, Map *map, Regs **regs) |
| .br |
| void unmapfile(Fhdr *hdr, Map *map) |
| .br |
| int mapproc(int pid, Map *map, Regs **regs) |
| .br |
| void unmapproc(Map *map) |
| .br |
| int detachproc(int pid) |
| .br |
| int ctlproc(int pid, char *msg) |
| .br |
| int procnotes(int pid, char ***notes) |
| .SH DESCRIPTION |
| These functions parse executable files and |
| provide access to those files and to running processes. |
| .PP |
| .I Crackhdr |
| opens and parses the named executable file. |
| The returned data structure |
| .I hdr |
| is initialized with a machine-independent description |
| of the header information. The following fields are the |
| most commonly used: |
| .TP |
| .B mach |
| a pointer to the |
| .B Mach |
| structure for the target architecture |
| .TP |
| .B mname |
| the name of the target architecture |
| .TP |
| .B fname |
| a description of the kind of file |
| (e.g., executable, core dump) |
| .TP |
| .B aname |
| a description of the application binary interface |
| this file uses; typically it is the name of an operating system |
| .PD |
| If the global variable |
| .I mach |
| is nil, |
| .I crackhdr |
| points it to the same |
| .B Mach |
| structure. |
| .PP |
| .I Mapfile |
| adds the segments found in |
| .I hdr |
| to |
| .IR map . |
| If |
| .I hdr |
| is an executable file, there are typically three segments: |
| .IR text , |
| .IR data , |
| and a zero-backed |
| .IR bss . |
| If |
| .I hdr |
| is a dynamic shared library, its segments are relocated by |
| .I base |
| before being mapping. |
| .PP |
| If |
| .I hdr |
| is a core file, there is one segment named |
| .I core |
| for each contiguous section of memory recorded in the core file. |
| There are often quite a few of these, as most operating systems |
| omit clean memory pages when writing core files |
| (Mac OS X is the only exception among the supported systems). |
| Because core files have such holes, it is typically necessary to |
| construct the core map by calling |
| .I mapfile |
| on the executable and then calling it again on the core file. |
| Newly-added segments are mapped on top of existing segments, |
| so this arrangement will use the core file for the segments it contains |
| but fall back to the executable for the rest. |
| .PP |
| .I Unmapfile |
| removes the mappings in |
| .I map |
| corresponding to |
| .IR hdr . |
| .PP |
| .I Mapproc |
| attaches to a running program and adds its segments to the given map. |
| It adds one segment for each contiguous section of |
| mapped memory. |
| On systems where this information cannot be determined, it adds |
| a single segment covering the entire address space. |
| Accessing areas of this segment that are actually not mapped |
| in the process address space will cause the get/put routines to return errors. |
| .PP |
| .I Unmapproc |
| removes the mappings in |
| .I map |
| corresponding to |
| .IR pid . |
| .I Detachproc |
| detaches from all previously attached processes. |
| .PP |
| .I Ctlproc |
| manipulates the process with id |
| .I pid |
| according to the message |
| .IR msg . |
| Valid messages include: |
| .TP |
| .B kill |
| terminate the process |
| .TP |
| .B startstop |
| start the process and wait for it to stop |
| .TP |
| .B sysstop |
| arrange for the process to stop at its next system call, |
| start the process, and then wait for it to stop |
| .TP |
| .B waitstop |
| wait for the process to stop |
| .TP |
| .B start |
| start the process |
| .PD |
| .PP |
| .I Procnotes |
| fills |
| .BI * notes |
| with a pointer to an array of strings |
| representing pending notes waiting |
| for the process. |
| (On Unix, these notes are textual descriptions |
| of any pending signals.) |
| .I Procnotes |
| returns the number of pending notes. |
| The memory at |
| .BI * notes |
| should be freed via |
| .I free |
| (see |
| .IR malloc (3)) |
| when no longer needed. |
| .SH SOURCE |
| .B \*9/src/libmach |
| .SH "SEE ALSO" |
| .IR mach (3), |
| .IR mach-map (3) |