package goo
found 325346 0.155-2
tag 325346 + upstream confirmed help
retitle 325346 goo: 64-bit binaries segfault on startup
thanks
I'm aware that goo has outstanding 64-bit cleanliness issues, and even
have a 64-bit machine on which I can investigate them. Unfortunately,
though, I have limited free time for Debian work, and they aren't as
easy to fix as I'd hoped -- even with the attached patch, which
address all the suspicious-looking warnings I noticed (as well as some
others that were merely adding a lot of noise to the logs), I still
get segfaults on startup.
I will try to find time to investigate more fully, but can't guarantee
that I'll get a chance any time soon, so I'm tagging this bug "help"
in hopes that someone with more time will take pity on me. ;-)
Anyway, here's the patch, which I didn't bother folding into my
released packages because it proved insufficient.
Index: c/g2c/goo/%system.c
===================================================================
--- c/g2c/goo/%system.c (revision 31)
+++ c/g2c/goo/%system.c (working copy)
@@ -6,8 +6,10 @@
#include <sys/stat.h>
#if !defined(_MSC_VER)
+#include <sys/wait.h>
#include <unistd.h>
#endif
+#include <ctype.h>
#include <errno.h>
extern P Yfab_sym;
Index: c/g2c/time/%threads.c
===================================================================
--- c/g2c/time/%threads.c (revision 31)
+++ c/g2c/time/%threads.c (working copy)
@@ -38,7 +38,7 @@
}
P YtimeSthreadsYPthread_join (P thread) {
- return (P)GC_pthread_join(thread);
+ return (P)GC_pthread_join((pthread_t)thread, NULL);
}
P YtimeSthreadsYPthread_priority (P thread) {
Index: c/grt.c
===================================================================
--- c/grt.c (revision 31)
+++ c/grt.c (working copy)
@@ -244,7 +244,7 @@
unsigned long env_nallocd = 0;
-INLINE P ENVFAB (int n) {
+INLINE P ENVFAB (PINT n) {
unsigned long snallocd = nallocd;
ENV env = allocate(sizeof(ENV_DATA) + ((n - 1) * sizeof(P)));
env_nallocd += nallocd - snallocd;
@@ -252,7 +252,7 @@
return env;
}
-P YPvm_fun_env_fab (P n) { return ENVFAB((int)n); }
+P YPvm_fun_env_fab (P n) { return ENVFAB((PINT)n); }
P FABENV (int size, ...) {
int i;
@@ -538,11 +538,11 @@
}
switch (t) {
case int_tag:
- printf("%d", untag(adr)); return;
+ printf("%ld", untag(adr)); return;
case chr_tag:
- printf("%c", untag(adr)); return;
+ printf("%c", (char)untag(adr)); return;
case loc_tag:
- printf("&0x%lx", tag((P)untag(adr), 0)); return;
+ printf("&%#lx", tag((P)untag(adr), 0)); return;
default:
break;
}
@@ -640,16 +640,16 @@
printf("]");
}
*/
- printf(" 0x%lx)", adr);
+ printf(" %p)", adr);
} else if (strcmp(typename, "<gen>") == 0) {
printf("(GEN ");
print_kind((P)YPmet_name(adr), 0, depth+1);
print_kind(FUNSPECS(adr), 0, depth + 1);
- printf(" 0x%lx)", adr);
+ printf(" %p)", adr);
} else if (strcmp(typename, "<file-out-port>") == 0) {
- printf("(OUT-PORT 0x%lx)", adr);
+ printf("(OUT-PORT %p)", adr);
} else if (strcmp(typename, "<file-in-port>") == 0) {
- printf("(IN-PORT 0x%lx)", adr);
+ printf("(IN-PORT %p)", adr);
} else {
int i;
P c = YPobject_class(adr);
@@ -664,7 +664,7 @@
printf("..."); break;
}
}
- printf(" 0x%lx)", adr);
+ printf(" %p)", adr);
}} else {
printf("<>");
}
@@ -679,7 +679,7 @@
printf("NUL");
else {
char* typename = type(adr);
- printf("0x%lx", adr);
+ printf("%p", adr);
if (typename)
printf(" ISA %s", typename);
}
@@ -717,7 +717,7 @@
if (metp) {
int j;
ENV env = (ENV)YPprop_elt(adr, (P)FUNENVOFFSET);
- printf("ENV SIZE %d\n", env->size);
+ printf("ENV SIZE %ld\n", env->size);
for (j = 0; j < env->size; j++, i++)
desprop(i, ENVGET(env, j));
}
@@ -814,7 +814,7 @@
}
P YevalSg2cYPprint_cpu_usage(char *message) {
- return;
+ return Ynil;
/*
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
@@ -989,14 +989,14 @@
#endif
#define MAX_DYNVARS 256
-int dynvar_key = 0;
+PINT dynvar_key = 0;
// NO LOCK NEEDED BECAUSE DDV OCCURS ON ONE THREAD ONLY
// TODO: PROPAGATE NEW VAR VALS TO EXISTING THREADS
// TODO: EXTEND WHEN OVERFLOW
P DYNFAB(P v) {
- int* key = (int*)v;
+ T* key = (T*)v;
*key = dynvar_key++;
if (dynvar_key > MAX_DYNVARS)
XXCALL1(1, Yerror, YPsb("TOO MANY DYNAMIC VARIABLES."));
Index: c/grt.h
===================================================================
--- c/grt.h (revision 31)
+++ c/grt.h (working copy)
@@ -4,6 +4,7 @@
#define IN_GRT
#if !defined(_MSC_VER)
#include "config.h"
+#include <unistd.h>
#else
#undef PINT
#define NOGDI
@@ -16,13 +17,18 @@
#include <time.h>
#include <stdarg.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
#include <math.h>
+#if 0 /* This is unnecessary, and can actually backfire inasmuch as
+ gc_pthread_redirects.h is an internal header that expects
+ gc_config_macros.h to have been included. */
#ifdef HAVE_POSIX_THREAD
#include <pthread.h>
#include <gc/gc_pthread_redirects.h>
#endif
+#endif
#if defined(_MSC_VER)
#define INLINE
@@ -46,6 +52,12 @@
#define IMPORTEXPORT
#endif
+#ifdef __GNUC__
+#define POSSIBLY_UNUSED __attribute((unused))
+#else
+#define POSSIBLY_UNUSED
+#endif
+
/* LOW LEVEL */
typedef FILE* PPORT;
@@ -369,7 +381,13 @@
#define YPset_regs(x) (regs = (REGS)(x))
#define REG(x) (regs->x)
-#define CREG(x) (REGSCREF()->x)
+STATIC_NOT_GRT_C INLINE REGS CREG_helper(REGS* pregs) {
+ if (!*pregs) {
+ *pregs = REGSREF();
+ }
+ return *pregs;
+}
+#define CREG(x) (CREG_helper(®s)->x)
#define REGSET(x, v) (regs->x = (v))
#define MAX_STACK_SIZE 70000
@@ -468,7 +486,7 @@
*/
#define FUNREG() *(REG(sp)-1)
-#define LINK_STACK() P Pfun = FUNREG(); P Pnext_methods = REG(next_methods); *REG(sp) = REG(fp); REGSET(fp, REG(sp)); REGSET(sp, REG(sp)+1);
+#define LINK_STACK() P Pfun POSSIBLY_UNUSED = FUNREG(); P Pnext_methods POSSIBLY_UNUSED = REG(next_methods); *REG(sp) = REG(fp); REGSET(fp, REG(sp)); REGSET(sp, REG(sp)+1);
#define UNLINK_STACK() {REGSET(sp, REG(fp)); REGSET(fp, *REG(sp)); }
#define YPunlink_stack() (0);UNLINK_STACK()
#define ARGLEN() (REG(fp)[-2])
@@ -907,4 +925,142 @@
IMPORTEXPORT extern P YPlit (P n);
+/* Various other functions that had sometimes been used without being
+ declared; since these generally return P, prototypes are crucial
+ when sizeof(P) != sizeof(int). */
+
+/* From boot.c: */
+extern P YOadd (P,P);
+extern P YOadd_new (P,P);
+extern P YOlen (P);
+extern P YOpair (P,P);
+extern P YOsingleton_isaQ (P,P);
+extern P YOtail_setter (P,P);
+extern P YPallocate_stack (P);
+extern P YPclass (P,P,P,P,P,P,P,P,P,P,P,P);
+extern P YPclass_ancestors_setter (P,P);
+extern P YPclass_children_setter (P,P);
+extern P YPclass_direct_props_setter (P,P);
+extern P YPclass_forward_setter (P,P);
+extern P YPclass_gens_setter (P,P);
+extern P YPclass_id_setter (P,P);
+extern P YPclass_mets_setter (P,P);
+extern P YPclass_prop_len_setter (P,P);
+extern P YPclass_props_setter (P,P);
+extern P YPclass_row_setter (P,P);
+extern P YPdo_stack_frames (P fun);
+extern P YPfb (P);
+extern P YPfu (P);
+extern P YPfun_cache_setter (P,P);
+extern P YPgen_cache (P,P,P,P,P);
+extern P YPgen_cache_arg_pos_setter (P,P);
+extern P YPgen_cache_classes_setter (P,P);
+extern P YPgen_cache_singletons_setter (P,P);
+extern P YPgen_code_setter (P,P);
+extern P YPgen_mets_setter (P,P);
+extern P YPhead_setter (P,P);
+extern P YPiu (P);
+extern P YPmet_env_setter (P,P);
+extern P YPopts_tup (P,P,P);
+extern P YPpatch_early_generics ();
+extern P YPrep (P,P);
+extern P YPsingleton (P);
+extern P YPstr (P,P);
+extern P YPtag (P,P);
+extern P YPtag_into (P,P);
+extern P YPtail_setter (P,P);
+extern P YPtup (P,P);
+extern P YPuntag (P);
+extern P YPuntag_into (P);
+
+/* From grt.c: */
+extern P YPunexec(P name);
+extern P YevalSg2cYPprint_cpu_usage(char *message);
+extern P allocate (unsigned long size);
+extern P allocate_atomic (unsigned long size);
+
+/* From g2c/goo/%math.c: */
+extern P FLOINT (PFLO x);
+extern P YgooSmathYPfA(P x, P y);
+extern P YgooSmathYPfE(P x, P y);
+extern P YgooSmathYPfL(P x, P y);
+extern P YgooSmathYPfS(P x, P y);
+extern P YgooSmathYPfT(P x, P y);
+extern P YgooSmathYPf_(P x, P y);
+extern P YgooSmathYPfacos(P x);
+extern P YgooSmathYPfasin(P x);
+extern P YgooSmathYPfatan(P x);
+extern P YgooSmathYPfatan2(P y, P x);
+extern P YgooSmathYPfcos(P x);
+extern P YgooSmathYPfcosh(P x);
+extern P YgooSmathYPfi2f(P x);
+extern P YgooSmathYPflo_bits (P x);
+extern P YgooSmathYPflog(P x);
+extern P YgooSmathYPfpow(P x, P n);
+extern P YgooSmathYPfsin(P x);
+extern P YgooSmathYPfsinh(P x);
+extern P YgooSmathYPfsqrt(P x);
+extern P YgooSmathYPft(P x);
+extern P YgooSmathYPftan(P x);
+extern P YgooSmathYPftanh(P x);
+
+/* From g2c/goo/%system.c: */
+extern P YgooSsystemYPcompile (P cfile, P sofile, P incs, P libs);
+extern P YgooSsystemYPcreate_directory (P name);
+extern P YgooSsystemYPfile_existsQ (P name);
+extern P YgooSsystemYPfile_mtime (P name);
+extern P YgooSsystemYPfile_type (P name);
+extern P YgooSsystemYPload(P name);
+extern P YgooSsystemYPos_name ();
+extern P YgooSsystemYPos_val (P name);
+extern P YgooSsystemYPos_val_setter (P value, P name);
+extern P YgooSsystemYPtime ();
+
+/* From g2c/goo/fun.c: */
+extern P YgooSfunYprop_bound_atQ (P,P);
+extern P YgooSfunYprop_value_at (P,P);
+extern P YgooSfunYprop_value_at_setter (P,P,P);
+
+/* From g2c/goo/io/%port.c: */
+extern P YgooSioSportYPclose_in_port (P s);
+extern P YgooSioSportYPclose_out_port (P s);
+extern PPORT YgooSioSportYPcurrent_in_port (void);
+extern PPORT YgooSioSportYPcurrent_out_port (void);
+extern P YgooSioSportYPforce_out (P s);
+extern P YgooSioSportYPget (P s);
+extern P YgooSioSportYPnewline (P s);
+extern P YgooSioSportYPopen_in_file (P name);
+extern P YgooSioSportYPopen_out_file (P name);
+extern P YgooSioSportYPpeek (P s);
+extern P YgooSioSportYPput (P s, P x);
+extern P YgooSioSportYPputs (P s, P x);
+extern P YgooSioSportYPreadyQ (P s);
+
+/* From g2c/time/%event.c: */
+extern P YtimeSeventYPevent_broadcast (P handle);
+extern P YtimeSeventYPevent_create (P name);
+extern P YtimeSeventYPevent_reset (P handle);
+extern P YtimeSeventYPevent_signal (P handle);
+extern P YtimeSeventYPevent_wait (P event, P lock);
+extern P YtimeSeventYPevent_wait_timed (P event, P lock, P timeout);
+
+/* From g2c/time/%lock.c: */
+extern P YtimeSlockYPlock_create (P name);
+extern P YtimeSlockYPlock_destroy (P handle);
+extern P YtimeSlockYPlock_lock (P handle);
+extern P YtimeSlockYPlock_try_lock (P handle);
+extern P YtimeSlockYPlock_unlock (P handle);
+
+/* From g2c/time/%threads.c: */
+extern P YtimeSthreadsYPthread_create (P function);
+extern P YtimeSthreadsYPthread_current ();
+extern P YtimeSthreadsYPthread_detach ();
+extern P YtimeSthreadsYPthread_goo_thread ();
+extern P YtimeSthreadsYPthread_goo_thread_setter (P value);
+extern P YtimeSthreadsYPthread_join (P thread);
+extern P YtimeSthreadsYPthread_priority (P thread);
+extern P YtimeSthreadsYPthread_priority_setter (P x, P thread);
+extern P YtimeSthreadsYPthread_sleep (P secs);
+extern P YtimeSthreadsYPthread_yield ();
+
#endif
Index: debian/rules
===================================================================
--- debian/rules (revision 31)
+++ debian/rules (working copy)
@@ -3,6 +3,8 @@
include /usr/share/cdbs/1/class/autotools.mk
include /usr/share/cdbs/1/rules/debhelper.mk
+CFLAGS += -D_GNU_SOURCE
+
ifeq ($(shell dpkg-architecture -qDEB_BUILD_ARCH),hppa)
CFLAGS += -ffunction-sections
endif
@@ -13,6 +15,8 @@
DEB_CONFIGURE_EXTRA_FLAGS = --without-threads
else
DEB_CONFIGURE_EXTRA_FLAGS = --with-threads
+ # Configure probably ought to define these, but doesn't. :-/
+ CFLAGS += -D_REENTRANT -DGC_THREADS
endif
DEB_INSTALL_CHANGELOGS_ALL = txt/changes.txt
--
Aaron M. Ucko, KB1CJC (amu at alum.mit.edu, ucko at debian.org)
Finger [EMAIL PROTECTED] (NOT a valid e-mail address) for more info.