first call from libxmi/xmi/init.c:changed():
[...]
(gdb) p ((struct xxmi_priv*) ((((xmipriv *)(vis->extlist[2].priv)))->priv))->getapi
$27 = (ggifunc_getapi *) 0x4001c968 <GGI_X_getapi>
(gdb) s
GGI_X_getapi (vis=0x81b1fa8, num=1, apiname=0xbfffe2b0 "display-x-xmi",
arguments=0xbfffdeb0 "") at ../../../libggi/display/X/mode.inc:314
314 *arguments = '\0';
(gdb) s
315 switch (num) {
(gdb) cont
Continuing.
second call from libxmi/xmi/init.c:changed():
[...]
Breakpoint 5, ggiGetAPI (vis=0x81b1fa8, num=2, apiname=0xbfffe2b0 "generic-stubs-xmi",
arguments=0xbfffdeb0 "") at ../../libggi/ggi/stubs.c:60
60 return vis->opdisplay->getapi(vis, num, apiname, arguments);
(gdb) s
XMI_X_getapi (vis=0x81b1fa8, num=2, apiname=0xbfffe2b0 "generic-stubs-xmi",
arguments=0xbfffdeb0 "") at ../../../libxmi/display/X/mode.inc:39
39 xmipriv *priv = LIBGGI_XMIEXT(vis);
(gdb)
42 XMIDPRINT_CORE("XMI_X_getapi(%p, %i, %s, %s) is called\n",
(gdb)
55 if (XXMI_PRIV(vis)->getapi != NULL) {
(gdb)
56 rc = XXMI_PRIV(vis)->getapi(vis, num, apiname, arguments);
(gdb) p ((struct xxmi_priv*) ((((xmipriv *)(vis->extlist[2].priv)))->priv))->getapi
$28 = (ggifunc_getapi *) 0x40236008 <__morecore+40>
(gdb) s
0x40236008 in __morecore () from /lib/libc.so.6
(gdb) s
Single stepping until exit from function __morecore,
which has no line number information.
Program received signal SIGSEGV, Segmentation fault.
0x40236010 in __morecore () from /lib/libc.so.6
(gdb)
apparently the first time:
((struct xxmi_priv*) ((((xmipriv *)(vis->extlist[2].priv)))->priv))->getapi =
GGI_X_getapi()
and the second time
((struct xxmi_priv*) ((((xmipriv *)(vis->extlist[2].priv)))->priv))->getapi =
__morecore()
so 'extlist' gets overwritten somewhere.
btw.: I guess in libggi/ggi/init.c:ggiExtensionUnregister()
there should be something like numextensions-- ?? (but that
doesn't solve the above problem). It just prevents the
extension list (== extension id) from growing.
--
Johannes