rem: read_and_parse(); if(sysmap_mmap(sm, message)) return 0;
add: if(!have_privs){ read_and_parse(); if(sysmap_mmap(sm, message)) return 0; }
context: int open_psdb_message(const char *restrict override, void (*message)(const char *, ...)) {  static const char *sysmap_paths[] = {    "/boot/System.map-%s",    "/boot/System.map",    "/lib/modules/%s/System.map",    "/usr/src/linux/System.map",    "/System.map",    NULL  };  struct stat sbuf;  struct utsname uts;  char path[128];  const char **fmt = sysmap_paths;  const char *sm;#ifdef SYSMAP_FILENAME    /* debug feature */  override = SYSMAP_FILENAME;#endif  // first allow for a user-selected System.map file  if(    (sm=override)    ||    (sm=getenv("PS_SYSMAP"))    ||    (sm=getenv("PS_SYSTEM_MAP"))  ){    read_and_parse();    if(sysmap_mmap(sm, message)) return 0;    /* failure is better than ignoring the user & using bad data */    return -1;           /* ought to return "Namelist not found." */  }  // next try the Linux 2.5.xx method  if(!stat("/proc/self/wchan", &sbuf)){    use_wchan_file = 1; // hack    return 0;  }  // finally, search for the System.map file  uname(&uts);  path[sizeof path - 1] = '\0';  do{    int did_ksyms = 0;    snprintf(path, sizeof path - 1, *fmt, uts.release);    if(!stat(path, &sbuf)){      if (did_ksyms++) read_and_parse();      if (sysmap_mmap(path, message)) return 0;    }  }while(*++fmt);  /* TODO: Without System.map, no need to keep ksyms loaded. */  return -1;}