--- klogd.c | 4 ++-- ksym.c | 55 +++++++++++++++++++++++++++++++++++++++---------------- ksym_mod.c | 11 +++++------ ksyms.h | 11 +++++++---- 4 files changed, 53 insertions(+), 28 deletions(-) --- klogd.c +++ klogd.c 2022-10-13 08:49:17.755515718 +0000 @@ -874,7 +874,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; @@ -899,7 +899,7 @@ static void LogLine(char *ptr, int len) break; } - delta = sprintf( sym_start, "%s+0x%x/0x%02x]", + delta = sprintf( sym_start, "%s+%zl/%zu]", symbol, sym.offset, sym.size ); space = sym_space + delta; --- ksym.c +++ ksym.c 2022-10-13 09:00:17.403732468 +0000 @@ -164,7 +164,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 *); @@ -198,7 +198,7 @@ extern int InitKsyms(mapfile) auto int version = 0; - auto unsigned long int address; + auto uintptr_t address; auto FILE *sym_file; @@ -250,16 +250,24 @@ extern int InitKsyms(mapfile) */ while ( !feof(sym_file) ) { - if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym) - != 3 ) +#if __WORDSIZE == 64 + if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym) != 3 ) +#else + if ( fscanf(sym_file, "%x %c %511s\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 ) { @@ -534,7 +542,7 @@ static int CheckMapVersion(fname) { int version; FILE *sym_file; - auto unsigned long int address; + auto uintptr_t address; auto char type, sym[512]; @@ -549,16 +557,24 @@ static int CheckMapVersion(fname) version = 0; while ( !feof(sym_file) && (version == 0) ) { - if ( fscanf(sym_file, "%lx %c %511s\n", &address, \ - &type, sym) != 3 ) +#if __WORDSIZE == 64 + if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym) != 3 ) +#else + if ( fscanf(sym_file, "%x %c %511s\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); } @@ -596,7 +612,7 @@ static int CheckMapVersion(fname) * Purpose: This function is responsible for adding a symbol name * and its address to the symbol table. * - * Arguments: (unsigned long) address, (char *) symbol + * Arguments: (uintptr_t) address, (char *) symbol * * Return: int * @@ -606,7 +622,7 @@ static int CheckMapVersion(fname) static int AddSymbol(address, symbol) - unsigned long address; + uintptr_t address; char *symbol; @@ -652,7 +668,7 @@ static int AddSymbol(address, symbol) char * LookupSymbol(value, sym) - unsigned long value; + uintptr_t value; struct symbol *sym; @@ -774,7 +790,7 @@ extern char * ExpandKadds(line, el) *symbol; char num[15]; - auto unsigned long int value; + auto uintptr_t value; auto struct symbol sym; @@ -858,7 +874,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+%zl/%zu)", symbol, sym.offset, sym.size); else elp += sprintf(elp, " (%s)", symbol); } @@ -867,7 +883,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+%zl/%zu)", symbol, sym.offset, sym.size); else elp += sprintf(elp, " (%s)", symbol); } @@ -878,7 +894,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+%zl/%zu)", symbol, sym.offset, sym.size); else elp += sprintf(elp, " (%s)", symbol); } @@ -914,17 +930,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, %zx/%zu\n", \ sl+1, value, \ (sym.size==0) ? symbol+1 : symbol, \ sym.offset, sym.size); +#else + fprintf(stderr, "Symbol: %s = %x = %s, %zx/%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, "+0x%x/0x%02x", sym.offset, sym.size); + elp += sprintf(elp, "+%zx/%zu", sym.offset, sym.size); } strncat(elp, kp, value); elp += value; --- ksym_mod.c +++ ksym_mod.c 2022-10-13 10:53:51.690149032 +0000 @@ -116,12 +116,11 @@ #include #include #include "module.h" -#if !defined(__GLIBC__) -#include -#endif /* __GLIBC__ */ #include #include -#include +#include +#include +/* #include */ #include "klogd.h" #include "ksyms.h" @@ -465,7 +464,7 @@ static int AddSymbol(line) * Purpose: Find the symbol which is related to the given address from * a kernel module. * - * Arguments: (long int) value, (struct symbol *) sym + * Arguments: (uintptr_t) value, (struct symbol *) sym * * value:-> The address to be located. * @@ -481,7 +480,7 @@ static int AddSymbol(line) extern char * LookupModuleSymbol(value, sym) - unsigned long value; + uintptr_t value; struct symbol *sym; --- ksyms.h +++ ksyms.h 2022-10-13 08:44:58.028153542 +0000 @@ -20,16 +20,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#include + /* 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 *);