This is rld_state.h in view mode; [Download] [Up]
/* * To allow the debugger to debug programs that used rld on themselves without * having the having the programs create a debug file information is maintained * in the rld package for the debugger. This information is two static data * items and a static routine. The information that is maintained is the state * of the loaded sets are currently loaded into the program. The number of * object files and their names that make up each set and the resulting address * they were loaded at is maintained for each set. The static data symbol * rld_loaded_state points to an array of rld_loaded_state structures that * contains the above information. The static data symbol rld_nloaded_states * contains the count of these structures. When the loaded state is changed * the static routine rld_loaded_state_changed() is called. * * This is the only information in the rld package the debugger is allowed to * use. The debugger sets a break point on the routine rld_loaded_state_changed * when it is triped on then it can inspect the rld_loaded_state. Then using * the rld package and the program it is debugging as a base file then it can * create the symbols for the loaded sets by doing rld_loads for each set. * The debugger uses an undocumented feature of rld_load (intended only for it's * use) which is to used the interger value of 1 (RLD_DEBUG_OUTPUT_FILENAME) * for the output_filename which causes the symbols to be created and left in * memory and not written to a file. * * When the debugger attaches to a running process there is a window of time * where the process could be doing an rld operation and the state in not * correct. The window is shorted to it's minimal time by changing the value * of rld_nloaded_states so that that number of states can be safely accessed. * There are still small windows where problems can occur. */ struct rld_loaded_state { char **object_filenames; /* pointer to an array of file names loaded */ unsigned long /* in this set */ nobject_filenames; /* number of file names loaded in this set */ struct mach_header /* The address the set was link edited at */ *header_addr; }; /* * static unsigned long rld_nloaded_states = 0; * static struct rld_loaded_state *rld_loaded_state = NULL; * * static void rld_loaded_state_changed(void); */ #define RLD_NLOADED_STATES "rld_nloaded_states" #define RLD_LOADED_STATE "rld_loaded_state" #define RLD_LOADED_STATE_CHANGED "rld_loaded_state_changed" #define RLD_DEBUG_OUTPUT_FILENAME ((char *)1) /* * moninitrld() can be defined in the librld.o library module if it is used or * defined as a common in gcrt0.o if the librld.o library module is not used. * The library module is passed monaddition() to call when a rld_load() is done * and returns a pointer to the routine to get the rld loaded state so it can * be written in to the gmon.out file. */ extern void (*moninitrld( void (* monaddition)(char *lowpc, char *highpc))) (struct rld_loaded_state **rld_loaded_state, unsigned long *rld_nloaded_states);
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.