Hi again,
We found a problem in sial. Because sial.c does not include defs.h, for
all used functions like "ulong symbol_value(char *)", that do not have a
prototype, the compiler assumes that the return value is int. Therefore
we get wrong results.
A comment in sial.c says:
// some stuff from crash's defs.h, file which cannot be included here.
// Hate to do this but this is a quick port..
// If anyone cares to work on the include and defs structure to make
// this work cleanly...
If you compile sial with "-Wall" you get:
gcc -g -I.. -Ilibsial -I../gdb-6.1/bfd -I../gdb-6.1/include
-I../gdb-6.1/gdb -I../gdb-6.1/gdb/config -nostartfiles -shared -rdynamic
-o sial.so sial.c -fPIC -DS390X -Wall -Llibsial -lsial
sial.c: In function 'apigetmem':
sial.c:96: warning: implicit declaration of function 'readmem'
sial.c: In function 'apigetval':
sial.c:424: warning: implicit declaration of function 'symbol_exists'
sial.c:425: warning: implicit declaration of function 'symbol_value'
sial.c: In function 'apigetdefs':
sial.c:572: warning: implicit declaration of function 'sial_addneg'
sial.c: In function 'edit_cmd':
sial.c:676: warning: implicit declaration of function 'cmd_usage'
sial.c: In function 'rm_sial_cmd':
sial.c:842: warning: unused variable 'end'
sial.c: At top level:
sial.c:917: warning: return type defaults to 'int'
sial.c: In function '_init':
sial.c:1013: warning: implicit declaration of function
'register_extension'
To solve the problem, we could either define an small official API
include file for crash extensions (crash.h?), make defs.h include-able
or just do the quick and ugly fix that declares the missing functions in
sial.c.
Michael
The following is the fix for solution (3):
---
extensions/sial.c | 7 +++++++
1 file changed, 7 insertions(+)
Index: crash-4.0-8.9/extensions/sial.c
===================================================================
--- crash-4.0-8.9.orig/extensions/sial.c
+++ crash-4.0-8.9/extensions/sial.c
@@ -84,6 +84,13 @@ struct command_table_entry {
extern FILE *fp;
extern char *crash_global_cmd();
+typedef unsigned long long int ulonglong;
+extern int readmem(ulonglong, int, void *, long, char *, ulong);
+extern int symbol_exists(char *);
+extern ulong symbol_value(char *);
+extern void cmd_usage(char *, int);
+extern void register_extension(struct command_table_entry *);
+
//
/////////////////////////////////////////////////////////////////////////
/*