|
|
1.1 root 1: /*
2: * To allow the debugger to debug programs that used rld on themselves without
3: * having the having the programs create a debug file information is maintained
4: * in the rld package for the debugger. This information is two static data
5: * items and a static routine. The information that is maintained is the state
6: * of the loaded sets are currently loaded into the program. The number of
7: * object files and their names that make up each set and the resulting address
8: * they were loaded at is maintained for each set. The static data symbol
9: * rld_loaded_state points to an array of rld_loaded_state structures that
10: * contains the above information. The static data symbol rld_nloaded_states
11: * contains the count of these structures. When the loaded state is changed
12: * the static routine rld_loaded_state_changed() is called.
13: *
14: * This is the only information in the rld package the debugger is allowed to
15: * use. The debugger sets a break point on the routine rld_loaded_state_changed
16: * when it is triped on then it can inspect the rld_loaded_state. Then using
17: * the rld package and the program it is debugging as a base file then it can
18: * create the symbols for the loaded sets by doing rld_loads for each set.
19: * The debugger uses an undocumented feature of rld_load (intended only for it's
20: * use) which is to used the interger value of 1 (RLD_DEBUG_OUTPUT_FILENAME)
21: * for the output_filename which causes the symbols to be created and left in
22: * memory and not written to a file.
23: *
24: * When the debugger attaches to a running process there is a window of time
25: * where the process could be doing an rld operation and the state in not
26: * correct. The window is shorted to it's minimal time by changing the value
27: * of rld_nloaded_states so that that number of states can be safely accessed.
28: * There are still small windows where problems can occur.
29: */
30:
31: struct rld_loaded_state {
32: char **object_filenames; /* pointer to an array of file names loaded */
33: unsigned long /* in this set */
34: nobject_filenames; /* number of file names loaded in this set */
35: struct mach_header /* The address the set was link edited at */
36: *header_addr;
37: };
38:
39: /*
40: * static unsigned long rld_nloaded_states = 0;
41: * static struct rld_loaded_state *rld_loaded_state = NULL;
42: *
43: * static void rld_loaded_state_changed(void);
44: */
45: #define RLD_NLOADED_STATES "rld_nloaded_states"
46: #define RLD_LOADED_STATE "rld_loaded_state"
47: #define RLD_LOADED_STATE_CHANGED "rld_loaded_state_changed"
48:
49: #define RLD_DEBUG_OUTPUT_FILENAME ((char *)1)
50:
51: /*
52: * moninitrld() can be defined in the librld.o library module if it is used or
53: * defined as a common in gcrt0.o if the librld.o library module is not used.
54: * The library module is passed monaddition() to call when a rld_load() is done
55: * and returns a pointer to the routine to get the rld loaded state so it can
56: * be written in to the gmon.out file.
57: */
58: extern void (*moninitrld(
59: void (* monaddition)(char *lowpc, char *highpc)))
60: (struct rld_loaded_state **rld_loaded_state,
61: unsigned long *rld_nloaded_states);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.