--- klogd.c
+++ klogd.c	2003-09-09 14:15:47.000000000 +0000
@@ -879,7 +879,7 @@ static void LogLine(char *ptr, int len)
            {
 	       auto int sym_space;
 
-	       unsigned long value;
+	       uintptr_t value;
 	       auto struct symbol sym;
 	       auto char *symbol;
 
@@ -904,7 +904,7 @@ static void LogLine(char *ptr, int len)
                   break;
                }
 
-               delta = sprintf( sym_start, "%s+%d/%d]",
+               delta = sprintf( sym_start, "%s+%llu/%zu]",
                                 symbol, sym.offset, sym.size );
 
                space = sym_space + delta;
--- ksym.c
+++ ksym.c	2003-09-09 14:15:47.000000000 +0000
@@ -122,7 +122,7 @@
 /* Variables static to this module. */
 struct sym_table
 {
-	unsigned long value;
+	uintptr_t value;
 	char *name;
 };
 
@@ -151,7 +151,7 @@ extern int debugging;
 
 /* Function prototypes. */
 static char * FindSymbolFile(void);
-static int AddSymbol(unsigned long, char*);
+static int AddSymbol(uintptr_t, char*);
 static void FreeSymbols(void);
 static int CheckVersion(char *);
 static int CheckMapVersion(char *);
@@ -185,7 +185,7 @@ extern int InitKsyms(mapfile)
 
 	auto int version = 0;
 
-	auto unsigned long int address;
+	auto uintptr_t address;
 
 	auto FILE *sym_file;
 
@@ -237,16 +237,24 @@ extern int InitKsyms(mapfile)
 	 */
 	while ( !feof(sym_file) )
 	{
-		if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym)
-		    != 3 )
+#if __WORDSIZE == 64
+		if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym) != 3 )
+#else
+		if ( fscanf(sym_file, "%x %c %s\n", &address, &type, sym) != 3 )
+#endif
 		{
 			Syslog(LOG_ERR, "Error in symbol table input (#1).");
 			fclose(sym_file);
 			return(0);
 		}
 		if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
 			fprintf(stderr, "Address: %lx, Type: %c, Symbol: %s\n",
 				address, type, sym);
+#else
+			fprintf(stderr, "Address: %x, Type: %c, Symbol: %s\n",
+				address, type, sym);
+#endif
 
 		if ( AddSymbol(address, sym) == 0 )
 		{
@@ -521,7 +529,7 @@ static int CheckMapVersion(fname)
 {
 	int	version;
 	FILE	*sym_file;
-	auto unsigned long int address;
+	auto uintptr_t address;
 	auto char	type,
 			sym[512];
 
@@ -536,16 +544,24 @@ static int CheckMapVersion(fname)
 		version = 0;
 		while ( !feof(sym_file) && (version == 0) )
 		{
-			if ( fscanf(sym_file, "%lx %c %s\n", &address, \
-				    &type, sym) != 3 )
+#if __WORDSIZE == 64
+			if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym) != 3 )
+#else
+			if ( fscanf(sym_file, "%x %c %s\n", &address, &type, sym) != 3 )
+#endif
 			{
 				Syslog(LOG_ERR, "Error in symbol table input (#2).");
 				fclose(sym_file);
 				return(0);
 			}
 			if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
 				fprintf(stderr, "Address: %lx, Type: %c, " \
 				    "Symbol: %s\n", address, type, sym);
+#else
+				fprintf(stderr, "Address: %x, Type: %c, " \
+				    "Symbol: %s\n", address, type, sym);
+#endif
 
 			version = CheckVersion(sym);
 		}
@@ -583,7 +599,7 @@ static int CheckMapVersion(fname)
  * Purpose:	This function is responsible for adding a symbol name
  *		and its address to the symbol table.
  *
- * Arguements:	(unsigned long) address, (char *) symbol
+ * Arguements:	(uintptr_t) address, (char *) symbol
  *
  * Return:	int
  *
@@ -593,7 +609,7 @@ static int CheckMapVersion(fname)
 
 static int AddSymbol(address, symbol)
 
-	unsigned long address;
+	uintptr_t address;
 	
 	char *symbol;
 	
@@ -639,7 +655,7 @@ static int AddSymbol(address, symbol)
 
 char * LookupSymbol(value, sym)
 
-	unsigned long value;
+	uintptr_t value;
 
 	struct symbol *sym;
 	
@@ -739,7 +755,7 @@ extern char * ExpandKadds(line, el)
 			*symbol;
 
 	char num[15];
-	auto unsigned long int value;
+	auto uintptr_t value;
 
 	auto struct symbol sym;
 
@@ -821,7 +837,7 @@ extern char * ExpandKadds(line, el)
 					value = strtol(kp2, (char **) 0, 16);
 					if ( (symbol = LookupSymbol(value, &sym)) ) {
 						if (sym.size)
-							elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+							elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
 						else
 							elp += sprintf(elp, " (%s)", symbol);
 					}
@@ -830,7 +846,7 @@ extern char * ExpandKadds(line, el)
 					value = strtol(kp3, (char **) 0, 16);
 					if ( (symbol = LookupSymbol(value, &sym)) ) {
 						if (sym.size)
-							elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+							elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
 						else
 							elp += sprintf(elp, " (%s)", symbol);
 					}
@@ -841,7 +857,7 @@ extern char * ExpandKadds(line, el)
 					value = strtol(kp2, (char **) 0, 16);
 					if ( (symbol = LookupSymbol(value, &sym)) ) {
 						if (sym.size)
-							elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+							elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
 						else
 							elp += sprintf(elp, " (%s)", symbol);
 					}
@@ -877,17 +893,24 @@ extern char * ExpandKadds(line, el)
 		strcat(elp, symbol);
 		elp += strlen(symbol);
 		if ( debugging )
-			fprintf(stderr, "Symbol: %s = %lx = %s, %x/%d\n", \
+#if __WORDSIZE == 64
+			fprintf(stderr, "Symbol: %s = %lx = %s, %llx/%zu\n", \
 				sl+1, value, \
 				(sym.size==0) ? symbol+1 : symbol, \
 				sym.offset, sym.size);
+#else
+			fprintf(stderr, "Symbol: %s = %x = %s, %llx/%zu\n", \
+				sl+1, value, \
+				(sym.size==0) ? symbol+1 : symbol, \
+				sym.offset, sym.size);
+#endif
 
 		value = 2;
 		if ( sym.size != 0 )
 		{
 			--value;
 			++kp;
-			elp += sprintf(elp, "+%x/%d", sym.offset, sym.size);
+			elp += sprintf(elp, "+%llx/%zu", sym.offset, sym.size);
 		}
 		strncat(elp, kp, value);
 		elp += value;
--- ksym_mod.c
+++ ksym_mod.c	2003-09-09 16:51:08.000000000 +0000
@@ -89,43 +89,101 @@
 #include <errno.h>
 #include <sys/fcntl.h>
 #include <sys/stat.h>
-#if !defined(__GLIBC__)
-#include <linux/time.h>
-#include <linux/module.h>
-#else /* __GLIBC__ */
-#include <linux/module.h>
-extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
-extern int get_kernel_syms __P ((struct kernel_sym *__table));
-#endif /* __GLIBC__ */
 #include <stdarg.h>
 #include <paths.h>
-#include <linux/version.h>
+#include <asm/atomic.h>
+#include <limits.h>
+/* #include <linux/version.h> */
 
 #include "klogd.h"
 #include "ksyms.h"
 
+/* Used by get_kernel_syms, which is obsolete.  */
+struct kernel_sym
+{
+	uintptr_t value;
+	char name[60];			/* should have been 64-sizeof(long); oh well */
+};
+
+extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
+extern int get_kernel_syms __P ((struct kernel_sym *__table));
+
+static inline __off64_t seek64(int fd, uintptr_t address)
+{
+	__off64_t off = (__off64_t)address;
+	__off64_t ret = (__off64_t)-1;
+
+	if (off < 0) {
+		__off64_t rel;
+		if (lseek64(fd, LONG_MAX, SEEK_SET) != LONG_MAX && errno)
+			goto err;
+		rel = (__off64_t)(address - LONG_MAX);
+		if ((ret = lseek64(fd, rel, SEEK_CUR)) != off && errno)
+			goto err;
+		ret = -ret;  /* Relative to LONG_MAX */
+	} else
+		ret = lseek64(fd, off, SEEK_SET);
+err:
+        return ret;
+}
 
-#if !defined(__GLIBC__)
-/*
- * The following bit uses some kernel/library magic to product what
- * looks like a function call to user level code.  This function is
- * actually a system call in disguise.  The purpose of the getsyms
- * call is to return a current copy of the in-kernel symbol table.
- */
-#define __LIBRARY__
-#include <linux/unistd.h>
-#define __NR_getsyms __NR_get_kernel_syms
-_syscall1(int, getsyms, struct kernel_sym *, syms);
-#undef __LIBRARY__
-extern int getsyms(struct kernel_sym *);
-#else /* __GLIBC__ */
 #define getsyms get_kernel_syms
-#endif /* __GLIBC__ */
+
+struct module
+{
+        size_t size_of_struct;   /* == sizeof(module) */
+        struct module *next;
+        const char *name;
+        size_t size;
+
+        union
+        {
+                atomic_t usecount;
+                long pad;
+        } uc;                           /* Needs to keep its size - so says rth */
+
+        unsigned long flags;            /* AUTOCLEAN et al */
+
+        unsigned nsyms;
+        unsigned ndeps;
+
+        struct module_symbol *syms;
+        struct module_ref *deps;
+        struct module_ref *refs;
+        int (*init)(void);
+        void (*cleanup)(void);
+        const struct exception_table_entry *ex_table_start;
+        const struct exception_table_entry *ex_table_end;
+#ifdef __alpha__
+        unsigned long gp;
+#endif
+        /* Members past this point are extensions to the basic
+           module support and are optional.  Use mod_member_present()
+           to examine them.  */
+        const struct module_persist *persist_start;
+        const struct module_persist *persist_end;
+        int (*can_unload)(void);
+        int runsize;                    /* In modutils, not currently used */
+        const char *kallsyms_start;     /* All symbols for kernel debugging */
+        const char *kallsyms_end;
+        const char *archdata_start;     /* arch specific data for module */
+        const char *archdata_end;
+        const char *kernel_data;        /* Reserved for kernel internal use */
+};
+
+struct module_info
+{
+        uintptr_t addr;
+        size_t    size;
+        unsigned long flags;
+        long usecount;
+};
+
 
 /* Variables static to this module. */
 struct sym_table
 {
-	unsigned long value;
+	uintptr_t value;
 	char *name;
 };
 
@@ -136,9 +194,7 @@ struct Module
 
 	char *name;
 	struct module module;
-#if LINUX_VERSION_CODE >= 0x20112
 	struct module_info module_info;
-#endif
 };
 
 static int num_modules = 0;
@@ -155,8 +211,8 @@ extern int debugging;
 
 /* Function prototypes. */
 static void FreeModules(void);
-static int AddSymbol(struct Module *mp, unsigned long, char *);
-static int AddModule(unsigned long, char *);
+static int AddSymbol(struct Module *mp, uintptr_t, char *);
+static int AddModule(uintptr_t, char *);
 static int symsort(const void *, const void *);
 
 
@@ -344,7 +400,7 @@ static void FreeModules()
  * Purpose:	This function is responsible for adding a module to
  *		the list of currently loaded modules.
  *
- * Arguements:	(unsigned long) address, (char *) symbol
+ * Arguements:	(uintptr_t) address, (char *) symbol
  *
  *		address:->	The address of the module.
  *
@@ -355,7 +411,7 @@ static void FreeModules()
 
 static int AddModule(address, symbol)
 
-     unsigned long address;
+     uintptr_t address;
 
      char *symbol;
 
@@ -403,10 +459,14 @@ static int AddModule(address, symbol)
 			Syslog(LOG_WARNING, "Error opening /dev/kmem\n");
 			return(0);
 		}
-		if ( lseek64(memfd, address, SEEK_SET) < 0 )
+		if ( seek64(memfd, address) < 0 )
 		{
 			Syslog(LOG_WARNING, "Error seeking in /dev/kmem\n");
+#if __WORDSIZE == 64
+			Syslog(LOG_WARNING, "Symbol %s, value %16lx\n", symbol, address);
+#else
 			Syslog(LOG_WARNING, "Symbol %s, value %08x\n", symbol, address);
+#endif
 			return(0);
 		}
 		if ( read(memfd, \
@@ -450,7 +510,7 @@ static int AddModule(address, symbol)
  * Purpose:	This function is responsible for adding a symbol name
  *		and its address to the symbol table.
  *
- * Arguements:	(struct Module *) mp, (unsigned long) address, (char *) symbol
+ * Arguements:	(struct Module *) mp, (uintptr_t) address, (char *) symbol
  *
  *		mp:->	A pointer to the module which the symbol is
  *			to be added to.
@@ -469,7 +529,7 @@ static int AddSymbol(mp, address, symbol
 
 	struct Module *mp;     
 
-	unsigned long address;
+	uintptr_t address;
 	
 	char *symbol;
 	
@@ -508,7 +568,7 @@ static int AddSymbol(mp, address, symbol
  * Purpose:	Find the symbol which is related to the given address from
  *		a kernel module.
  *
- * Arguements:	(long int) value, (struct symbol *) sym
+ * Arguements:	(uintptr_t) value, (struct symbol *) sym
  *
  *		value:->	The address to be located.
  * 
@@ -524,7 +584,7 @@ static int AddSymbol(mp, address, symbol
 
 extern char * LookupModuleSymbol(value, sym)
 
-	unsigned long value;
+	uintptr_t value;
 
 	struct symbol *sym;
 	
@@ -574,15 +634,9 @@ extern char * LookupModuleSymbol(value,
 		 * If it is in this range we can at least return the
 		 * name of the module.
 		 */
-#if LINUX_VERSION_CODE < 0x20112
-		if ( (void *) value >= mp->module.addr &&
-		     (void *) value <= (mp->module.addr + \
-					mp->module.size * 4096) )
-#else
 		if ( value >= mp->module_info.addr &&
 		     value <= (mp->module_info.addr + \
-					mp->module.size * 4096) )
-#endif
+					mp->module.size * getpagesize()) )
 		{
 			/*
 			 * A special case needs to be checked for.  The above
@@ -601,13 +655,8 @@ extern char * LookupModuleSymbol(value,
 			if ( mp->num_syms > 0 )
 			{
 				last = &mp->sym_array[mp->num_syms - 1];
-#if LINUX_VERSION_CODE < 0x20112
-				sym->size = (int) mp->module.addr + \
-					(mp->module.size * 4096) - value;
-#else
 				sym->size = (int) mp->module_info.addr + \
-					(mp->module.size * 4096) - value;
-#endif
+					(mp->module.size * getpagesize()) - value;
 				sym->offset = value - last->value;
 				return(last->name);
 			}
@@ -617,12 +666,8 @@ extern char * LookupModuleSymbol(value,
 			 * Return the module name and the offset of the
 			 * faulting address in the module.
 			 */
-			sym->size = mp->module.size * 4096;
-#if LINUX_VERSION_CODE < 0x20112
-			sym->offset = (void *) value - mp->module.addr;
-#else
+			sym->size = mp->module.size * getpagesize();
 			sym->offset = value - mp->module_info.addr;
-#endif
 			return(mp->name);
 		}
 	}
--- ksyms.h
+++ ksyms.h	2003-09-09 14:15:47.000000000 +0000
@@ -20,16 +20,19 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <sys/types.h>
+#include <stdint.h>
+
 /* Variables, structures and type definitions static to this module. */
 
 struct symbol
 {
 	char *name;
-	int size;
-	int offset;
+	size_t size;
+	__off64_t offset;
 };
 
 
 /* Function prototypes. */
-extern char * LookupSymbol(unsigned long, struct symbol *);
-extern char * LookupModuleSymbol(unsigned long int, struct symbol *);
+extern char * LookupSymbol(uintptr_t, struct symbol *);
+extern char * LookupModuleSymbol(uintptr_t, struct symbol *);