ksymoops.h
上传用户:hxtd_72
上传日期:2007-06-06
资源大小:64k
文件大小:7k
源码类别:

驱动编程

开发平台:

C/C++

  1. /*
  2. ksymoops.h.
  3. Copyright Keith Owens <kaos@ocs.com.au>.
  4. Released under the GNU Public Licence, Version 2.
  5. */
  6. #include <bfd.h>
  7. #include <sys/types.h>
  8. #include <regex.h>
  9. #include <stdio.h>
  10. #define FATAL(format, args...) 
  11.     do { 
  12. printf("Fatal Error (%s): " format "n", procname, args); 
  13. exit(2); 
  14.        } while(0)
  15. #define ERROR(format, args...) 
  16.     do { 
  17. printf("Error (%s): " format "n", procname, args); 
  18. ++errors; 
  19.        } while(0)
  20. #define WARNING(format, args...) 
  21.     do { 
  22.  printf("Warning (%s): " format "n", procname, args); 
  23.  ++warnings; 
  24.        } while(0)
  25. #define WARNING_S(format, args...) 
  26.     do { 
  27.  printf("Warning (%s): " format, procname, args); 
  28.  ++warnings; 
  29.        } while(0)
  30. #define WARNING_M(format, args...) 
  31.     do { 
  32.  printf(format, args); 
  33.        } while(0)
  34. #define WARNING_E(format, args...) 
  35.     do { 
  36.  printf(format "n", args); 
  37.        } while(0)
  38. #define DEBUG(level, format, args...) 
  39.     do { 
  40. if(debug >= level) { 
  41.     printf("DEBUG (%s): " format "n", procname, args); 
  42.        } while(0)
  43. #define DEBUG_S(level, format, args...) 
  44.     do { 
  45. if(debug >= level) { 
  46.     printf("DEBUG (%s): " format, procname, args); 
  47.        } while(0)
  48. #define DEBUG_E(level, format, args...) 
  49.     do { 
  50. if(debug >= level) { 
  51.     printf(format "n", args); 
  52.        } while(0)
  53. /* Not all compilers/libraries define __unn so create my own.  */
  54. typedef unsigned char U8;
  55. typedef unsigned short U16;
  56. typedef unsigned int U32;
  57. typedef unsigned long long U64;
  58. /* Assume worst case for an address - 64 bits. */
  59. typedef U64 addr_t;
  60. extern char *prefix;
  61. extern char *path_nm; /* env KSYMOOPS_NM */
  62. extern char *path_find; /* env KSYMOOPS_FIND */
  63. extern char *path_objdump; /* env KSYMOOPS_OBJDUMP */
  64. extern int debug;
  65. extern int errors;
  66. extern int warnings;
  67. extern addr_t truncate_mask;
  68. typedef struct symbol SYMBOL;
  69. struct symbol {
  70. char *name; /* name of symbol */
  71. char type; /* type of symbol from nm/System.map */
  72. char keep; /* keep this symbol in merged map? */
  73. addr_t address; /* address in kernel */
  74. char *module;           /* module name (if any) */
  75. };
  76. /* Header for symbols from one particular source */
  77. typedef struct symbol_set SYMBOL_SET;
  78. struct symbol_set {
  79. char *source; /* where the symbols came from */
  80. int used; /* number of symbols used */
  81. int alloc; /* number of symbols allocated */
  82. SYMBOL *symbol; /* dynamic array of symbols */
  83. SYMBOL_SET *related; /* any related symbol set */
  84. const char *object; /* name of related object */
  85. time_t mtime; /* modification time */
  86. };
  87. extern SYMBOL_SET   ss_vmlinux;
  88. extern SYMBOL_SET   ss_ksyms_base;
  89. extern SYMBOL_SET **ss_ksyms_module;
  90. extern int          ss_ksyms_modules;
  91. extern int          ss_ksyms_modules_known_objects;
  92. extern SYMBOL_SET   ss_lsmod;
  93. extern SYMBOL_SET **ss_object;
  94. extern int          ss_objects;
  95. extern SYMBOL_SET   ss_system_map;
  96. extern SYMBOL_SET   ss_merged; /* merged map with info from all sources */
  97. extern SYMBOL_SET   ss_Version; /* Version_ numbers where available */
  98. /* Regular expression stuff */
  99. extern regex_t     re_nm;
  100. extern regmatch_t *re_nm_pmatch;
  101. extern regex_t     re_bracketed_address;
  102. extern regmatch_t *re_bracketed_address_pmatch;
  103. extern regex_t     re_revbracketed_address;
  104. extern regmatch_t *re_revbracketed_address_pmatch;
  105. extern regex_t     re_unbracketed_address;
  106. extern regmatch_t *re_unbracketed_address_pmatch;
  107. /* Bracketed address: optional '[', required '<', at least 4 hex characters,
  108.  * required '>', optional ']', optional spaces.
  109.  */
  110. #define BRACKETED_ADDRESS "\[*<([0-9a-fA-F]{4,})>\]* *"
  111. /* Reverse bracketed address: required '<', required '[', at least 4
  112.  * hex characters, required ']', required '>', optional spaces.
  113.  */
  114. #define REVBRACKETED_ADDRESS "<\[([0-9a-fA-F]{4,})\]> *"
  115. #define UNBRACKETED_ADDRESS "([0-9a-fA-F]{4,}) *"
  116. /* The main set of options, save passing long sets of parameters around. */
  117. struct options {
  118. char *vmlinux;
  119. char **object;
  120. int objects;
  121. char *ksyms;
  122. char *lsmod;
  123. char *system_map;
  124. char *save_system_map;
  125. char **filename;
  126. int filecount;
  127. int short_lines;
  128. int endianess;
  129. int hex;
  130. int one_shot;
  131. int ignore_insmod_path;
  132. int ignore_insmod_all;
  133. int truncate;
  134. const char *target;
  135. const char *architecture;
  136. char **adhoc_addresses;
  137. int address_bits; /* not an option, derived from architecture */
  138. int vli; /* not an option, derived from eip line */
  139. };
  140. typedef struct options OPTIONS;
  141. /* ksymoops.c */
  142. extern void read_symbol_sources(const OPTIONS *options);
  143. /* io.c */
  144. extern int regular_file(const char *file, const char *msg);
  145. extern FILE *fopen_local(const char *file, const char *mode, const char *msg);
  146. extern void fclose_local(FILE *f, const char *msg);
  147. extern char *fgets_local(char **line, int *size, FILE *f, const char *msg);
  148. extern int fwrite_local(void const *ptr, size_t size, size_t nmemb,
  149. FILE *stream, const char *msg);
  150. extern FILE *popen_local(const char *cmd, const char *msg);
  151. extern void pclose_local(FILE *f, const char *msg);
  152. /* ksyms.c */
  153. extern void read_ksyms(const OPTIONS *options);
  154. extern void map_ksyms_to_modules(void);
  155. extern void read_lsmod(const OPTIONS *options);
  156. extern void compare_ksyms_lsmod(void);
  157. extern void add_ksyms(const char *, char, const char *, const char *, const OPTIONS *options);
  158. /* misc.c */
  159. extern void malloc_error(const char *msg);
  160. extern const char *format_address(addr_t address, const OPTIONS *options);
  161. extern char *find_fullpath(const char *program);
  162. extern U64 hexstring(const char *hex);
  163. /* map.c */
  164. extern void read_system_map(const OPTIONS *options);
  165. extern void merge_maps(const OPTIONS *options);
  166. extern void compare_maps(const SYMBOL_SET *ss1, const SYMBOL_SET *ss2,
  167.  int precedence);
  168. /* object.c */
  169. extern SYMBOL_SET *adjust_object_offsets(SYMBOL_SET *ss);
  170. extern void read_vmlinux(const OPTIONS *options);
  171. extern void expand_objects(const OPTIONS *options);
  172. extern void read_object(const char *object, int i);
  173. /* oops.c */
  174. extern int Oops_read(OPTIONS *options);
  175. /* re.c */
  176. extern void re_compile(regex_t *preg, const char *regex, int cflags,
  177.        regmatch_t **pmatch);
  178. extern void re_compile_common(void);
  179. extern void re_strings(regex_t *preg, const char *text, regmatch_t *pmatch,
  180.        char ***string);
  181. extern void re_strings_free(const regex_t *preg, char ***string);
  182. extern void re_string_check(int need, int available, const char *msg);
  183. #define RE_COMPILE(preg,regex,cflags,pmatch) 
  184.     if(!(preg)->re_nsub) re_compile(preg, regex, cflags, pmatch);
  185. /* symbol.c */
  186. extern void ss_init(SYMBOL_SET *ss, const char *msg);
  187. extern void ss_free(SYMBOL_SET *ss);
  188. extern void ss_init_common(void);
  189. extern SYMBOL *find_symbol_name(const SYMBOL_SET *ss, const char *symbol,
  190. int *start);
  191. extern int add_symbol_n(SYMBOL_SET *ss, const addr_t address,
  192. const char type, const char keep, const char *symbol);
  193. extern int add_symbol(SYMBOL_SET *ss, const char *address, const char type,
  194.       const char keep, const char *symbol);
  195. extern char *map_address(const SYMBOL_SET *ss, const addr_t address,
  196.  const OPTIONS *options);
  197. extern void ss_sort_atn(SYMBOL_SET *ss);
  198. extern void ss_sort_na(SYMBOL_SET *ss);
  199. extern SYMBOL_SET *ss_copy(const SYMBOL_SET *ss);
  200. extern void add_Version(const char *version, const char *source);
  201. extern void extract_Version(SYMBOL_SET *ss);
  202. extern void compare_Version(void);
  203. /* modutils interface */
  204. #define MODUTILS_PREFIX "__insmod_"