diff -crB crash-6.0.5/help.c crash-6.0.5-modified/help.c *** crash-6.0.5/help.c 2012-03-23 15:45:06.000000000 +0000 --- crash-6.0.5-modified/help.c 2012-04-24 06:16:09.696368523 +0100 *************** *** 4035,4041 **** char *help_mod[] = { "mod", "module information and loading of symbols and debugging data", ! "-s module [objfile] | -d module | -S [directory] | -D | -r | -R | -o | -g", " With no arguments, this command displays basic information of the currently", " installed modules, consisting of the module address, name, size, the", " object file name (if known), and whether the module was compiled with", --- 4035,4041 ---- char *help_mod[] = { "mod", "module information and loading of symbols and debugging data", ! "-s module [objfile] | -d module | -S [directory] | -D | -r | -R | -o | -g\n\t| -t", " With no arguments, this command displays basic information of the currently", " installed modules, consisting of the module address, name, size, the", " object file name (if known), and whether the module was compiled with", *************** *** 4092,4097 **** --- 4092,4100 ---- " -g When used with -s or -S, add a module object's section", " start and end addresses to its symbol list.", " -o Load module symbols with old mechanism.", + " -t Similar to -S but modules are searched for relative", + " to the real path of the namelist instead of in", + " standard locations.", " ", " After symbolic and debugging data have been loaded, backtraces and text", " disassembly will be displayed appropriately. Depending upon the processor", diff -crB crash-6.0.5/kernel.c crash-6.0.5-modified/kernel.c *** crash-6.0.5/kernel.c 2012-03-23 15:45:06.000000000 +0000 --- crash-6.0.5-modified/kernel.c 2012-04-24 05:58:24.303368253 +0100 *************** *** 3077,3088 **** --- 3077,3090 ---- #define DELETE_ALL_MODULE_SYMBOLS (5) #define REMOTE_MODULE_SAVE_MSG (6) #define REINIT_MODULES (7) + #define LOAD_ALL_MODULE_SYMBOLS_RELATIVE (8) void cmd_mod(void) { int c, ctmp; char *p, *objfile, *modref, *tree, *symlink; + char *name=NULL, *tmpname; ulong flag, address; char buf[BUFSIZE]; *************** *** 3151,3157 **** address = 0; flag = LIST_MODULE_HDR; ! while ((c = getopt(argcnt, args, "Rd:Ds:So")) != EOF) { switch(c) { case 'R': --- 3153,3159 ---- address = 0; flag = LIST_MODULE_HDR; ! while ((c = getopt(argcnt, args, "Rd:Ds:Sot")) != EOF) { switch(c) { case 'R': *************** *** 3221,3226 **** --- 3223,3234 ---- else cmd_usage(pc->curcmd, SYNOPSIS); break; + case 't': + if (flag) + cmd_usage(pc->curcmd, SYNOPSIS); + else + flag = LOAD_ALL_MODULE_SYMBOLS_RELATIVE; + break; default: argerrs++; *************** *** 3296,3301 **** --- 3304,3330 ---- break; + case LOAD_ALL_MODULE_SYMBOLS_RELATIVE: + if ((name=realpath(pc->namelist, NULL))==NULL) { + error(FATAL, "realpath returned null\n"); + cmd_usage(pc->curcmd, SYNOPSIS); + } + if (CRASHDEBUG(3)) { + fprintf(fp, "REL namelist: %s\n", pc->namelist); + fprintf(fp, "REL realpath: %s\n", name); + } + if ((tmpname=strstr(name, "/usr/lib/debug"))==NULL) { + error(INFO, "Cannot find \"/usr/lib/debug\" in real" + " path (%s) to namelist (%s)\n", name, pc->namelist); + cmd_usage(pc->curcmd, SYNOPSIS); + } + tmpname[strlen("/usr/lib/debug")+1]=0; + if (CRASHDEBUG(3)) + fprintf(fp, "REL short path: %s\n", name); + tree=name; + flag=LOAD_ALL_MODULE_SYMBOLS; + break; + default: break; } *************** *** 3310,3315 **** --- 3339,3345 ---- if (symlink) FREEBUF(symlink); + if (name) free(name); } int