MACH(2) MACH(2) NAME crackhdr, machbytype, machbyname, newmap, setmap, unusemap, loadmap, findseg, get1, get2, get4, put1, put2, put4, beswab, beswal, leswab, leswal - machine-independent executable file access SYNOPSIS #include <u.h> #include <libc.h> #include <bio.h> #include <mach.h> int crackhdr(int fd, Fhdr *fp) void machbytype(int type) int machbyname(char *name) Map *newmap(Map *map, int fd, int n) int setmap(Map *map, ulong base, ulong end, ulong foffset, char *name) void unusemap(Map *map, int seg) Map *loadmap(Map *map, int fd, Fhdr *fp) int findseg(Map *map, char *name) int get1(Map *map, ulong addr, uchar *buf, int n) int get2(Map *map, ulong addr, ushort *val) int get4(Map *map, ulong addr, long *val) int put1(Map *map, ulong addr, uchar *buf, int n) int put2(Map *map, ulong addr, ushort val) int put4(Map *map, ulong addr, long val) ushort beswab(ushort val) long beswal(long val) ushort leswab(ushort val) long leswal(long val) Page 1 Plan 9 (printed 12/22/24) MACH(2) MACH(2) extern Mach mach; extern Machdata machdata; DESCRIPTION These functions provide machine-independent access to an executable file or executing process image. The latter is accessed by opening either /proc/pid/text or /proc/pid/mem as described in proc(3). Symbol(2) and object(2) describe other library functions for machine-independent access to symbol tables and object files. 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. Machbytype and machbyname select the data structures and parameter values associated with the specified architecture. The former selects the architecture based on the code stored in the field named type in the Fhdr data structure. The latter selects a processor class by name; one of 68020, mips, mipsco, sparc, sunsparc, 386, 86, or 960. These func- tions point the mach and machdata global variables to the proper Mach and Machdata data structures and load global variable asstype with the disassembler type code. A map is a data structure used to transform an address in the address space of an executable to an offset in a file or executing image. A map comprises one or more segments, each associating a range of addresses with an offset in the file or memory image. The range of one segment may not overlap the range of another segment in the map. Most maps define segments named `text' and `data' to map the instruction and initialized data sections of an executable file. When the map is associated with the memory image of an executing pro- gram, the range of the `data' segment is usually extended to include the bss, heap, and stack of the process and an addi- tional segment, named `ublock', maps the page containing the saved registers and process state information. Newmap creates a map with n segments or recycles a map cur- rently in use. If map is zero, a new map is dynamically allocated, otherwise it is assumed to point to an existing dynamically allocated map whose size is adjusted, as neces- sary. The map is associated with the open file descriptor fd and all segments are marked as unused. The address of the map is returned. A zero return indicates an allocation error. Page 2 Plan 9 (printed 12/22/24) MACH(2) MACH(2) Setmap loads the first unused segment in map with the seg- ment mapping parameters. Base and end contain the lowest and highest virtual addresses mapped by the segment. Foffset contains the offset in the executable to the start of the segment. Name is a name to be attached to the seg- ment. Unusemap marks segment number seg in map map unused. Other segments in the map remain unaffected. Loadmap uses the values in a Fhdr data structure (usually filled by crackhdr) to initialize a default map for an exe- cutable file or executing image. If map is zero, a new map with two segments is dynamically allocated; otherwise, map is initialized with the appropriate values. This function returns the address of the map if successful, zero on fail- ure. Two segments, named `text' and `data' are defined in the map; they map the instruction and initialized data sec- tions of the program described by the Fhdr structure. Get1, get2, and get4 retrieve the data stored at address addr in the program file or executable image associated with map. Get1 retrieves n bytes of data beginning at addr into buf. Get2 and get4 retrieve 16-bit and 32-bit values respec- tively, into the location pointed to by val. The value is byte-swapped if the source byte order differs from that of the current architecture. This implies that the value returned by get4 may not be the same as the four-byte sequence returned by get1 when n is four; the former may be byte-swapped, the latter is independent of source and target byte order. If the file descriptor associated with map is negative, the address itself is placed in the return loca- tion. These functions return the number of bytes read. A -1 indicates an error condition. Put1, put2, and put4 write to the file or executing image associated with map. The address is translated using the map parameters and multi-byte quantities are byte-swapped, if necessary, before they are written. Put1 transfers n bytes stored at buf; put2 and put4 write the 16-bit and 32-bit quantity contained in val, respectively. The number of bytes transferred is returned. A -1 return value indicates an error. Beswab and beswal return the ushort and long big-endian rep- resentation of val, respectively. Leswab and leswal return the little-endian representation of the ushort and long con- tained in val. SOURCE /sys/src/libmach Page 3 Plan 9 (printed 12/22/24) MACH(2) MACH(2) SEE ALSO symbol(2), object(2), errstr(2), proc(3), a.out(6) DIAGNOSTICS These routines set errstr. Page 4 Plan 9 (printed 12/22/24)