* [RFC] Uninitialized section index internal error on Tru64 5.1
@ 2002-04-12 3:19 Joel Brobecker
2002-04-12 3:22 ` Joel Brobecker
2002-04-14 15:39 ` Elena Zannoni
0 siblings, 2 replies; 6+ messages in thread
From: Joel Brobecker @ 2002-04-12 3:19 UTC (permalink / raw)
To: gdb-patches
This follows up on a discussion started over a year ago... Lack of time
prevented me from persuing this issue. Hopefully we can make progress
quickly. The last message on this topic was sent by me, and contains
a full description of what I believe is the source of the problem:
http://sources.redhat.com/ml/gdb-patches/2001-11/msg00296.html
The following patch fixes many regressions in the testsuite:
Summary 1 2
FAIL 1644 792
PASS 4388 6990
XFAIL 59 149
XPASS 1 3
I compiled on Tru64 5.1A, using GCC.
This patch is not meant to be integrated as is, this is more a first
rough fix presented so that we can discuss more precisely which
direction to take in order to complete the work.
In particular, should the "if section-is-uninitialized then discard"
bits be always there regardless of the target? Or should we put in place
some configure test in order to execute this test only on targets were
this is needed (alpha-osf is the only one that I know of).
There is also the get_section_index function that I quickly threw in. I
suppose it should be defined in a .h file, and implemented somewhere
else than in mdebugread.c.
Cheers,
--
Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Uninitialized section index internal error on Tru64 5.1
2002-04-12 3:19 [RFC] Uninitialized section index internal error on Tru64 5.1 Joel Brobecker
@ 2002-04-12 3:22 ` Joel Brobecker
2002-04-14 15:39 ` Elena Zannoni
1 sibling, 0 replies; 6+ messages in thread
From: Joel Brobecker @ 2002-04-12 3:22 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 268 bytes --]
> The following patch fixes many regressions in the testsuite:
> Summary 1 2
> FAIL 1644 792
> PASS 4388 6990
> XFAIL 59 149
> XPASS 1 3
Sorry, the patch is attached, this time.
What a fool sometimes...
--
Joel
[-- Attachment #2: mdebugread.c.diff --]
[-- Type: text/plain, Size: 4716 bytes --]
Index: mdebugread.c
===================================================================
RCS file: /cvs/src/src/gdb/mdebugread.c,v
retrieving revision 1.24
diff -c -3 -p -r1.24 mdebugread.c
*** mdebugread.c 19 Mar 2002 19:00:03 -0000 1.24
--- mdebugread.c 12 Apr 2002 10:02:08 -0000
*************** struct symloc
*** 143,149 ****
|| (sc) == scPData \
|| (sc) == scXData)
#define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
! #define SC_IS_BSS(sc) ((sc) == scBss || (sc) == scSBss)
#define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
\f
/* Various complaints about symbol reading that don't abort the process */
--- 143,150 ----
|| (sc) == scPData \
|| (sc) == scXData)
#define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
! #define SC_IS_BSS(sc) ((sc) == scBss)
! #define SC_IS_SBSS(sc) ((sc) == scSBss)
#define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
\f
/* Various complaints about symbol reading that don't abort the process */
*************** static int found_ecoff_debugging_info;
*** 327,332 ****
--- 328,335 ----
/* Forward declarations */
+ static int get_section_index (struct objfile *, char *);
+
static int upgrade_type (int, struct type **, int, union aux_ext *,
int, char *);
*************** is_pending_symbol (FDR *fh, char *sh)
*** 637,642 ****
--- 640,657 ----
return p;
}
+ /* Return the section index for the given section name. Return -1 if
+ the section was not found. */
+ static int
+ get_section_index (struct objfile *objfile, char *section_name)
+ {
+ asection *sect = bfd_get_section_by_name (objfile->obfd, section_name);
+ if (sect)
+ return sect->index;
+ else
+ return -1;
+ }
+
/* Add a new symbol SH of type T */
static void
*************** parse_partial_symbols (struct objfile *o
*** 2425,2450 ****
--- 2440,2511 ----
ms_type = mst_bss;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
}
+ else if (SC_IS_SBSS (ext_in->asym.sc))
+ {
+ ms_type = mst_bss;
+ svalue += ANOFFSET (objfile->section_offsets,
+ get_section_index (objfile, ".sbss"));
+ }
else
ms_type = mst_abs;
break;
case stLabel:
/* Label */
+
+ /* On certain platforms, some extra label symbols can be
+ generated by the linker. One possible usage for this kind
+ of symbols is to represent the address of the begining of a
+ given section. For instance, on Tru64 5.1, the address of
+ the _ftext label is the start address of the .text section.
+
+ The storage class of these symbols is usually directly
+ related to the section to which the symbol refers. For
+ instance, on Tru64 5.1, the storage class for the _fdata
+ label is scData, refering to the .data section.
+
+ It is actually possible that the section associated to the
+ storage class of the label does not exist. On True64 5.1
+ for instance, the libm.so shared library does not contain
+ any .data section, although it contains a _fpdata label
+ which storage class is scData... Since these symbols are
+ usually useless for the debugger user anyway, we just
+ discard these symbols.
+ */
+
if (SC_IS_TEXT (ext_in->asym.sc))
{
+ if (objfile->sect_index_text == -1)
+ continue;
+
ms_type = mst_file_text;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
}
else if (SC_IS_DATA (ext_in->asym.sc))
{
+ if (objfile->sect_index_data == -1)
+ continue;
+
ms_type = mst_file_data;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
}
else if (SC_IS_BSS (ext_in->asym.sc))
{
+ if (objfile->sect_index_bss == -1)
+ continue;
+
ms_type = mst_file_bss;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
}
+ else if (SC_IS_SBSS (ext_in->asym.sc))
+ {
+ const int sbss_sect_index = get_section_index (objfile, ".sbss");
+
+ if (sbss_sect_index == -1)
+ continue;
+
+ ms_type = mst_file_bss;
+ svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index);
+ }
else
ms_type = mst_abs;
break;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Uninitialized section index internal error on Tru64 5.1
2002-04-12 3:19 [RFC] Uninitialized section index internal error on Tru64 5.1 Joel Brobecker
2002-04-12 3:22 ` Joel Brobecker
@ 2002-04-14 15:39 ` Elena Zannoni
2002-04-16 10:40 ` Joel Brobecker
1 sibling, 1 reply; 6+ messages in thread
From: Elena Zannoni @ 2002-04-14 15:39 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
Joel Brobecker writes:
> This follows up on a discussion started over a year ago... Lack of time
> prevented me from persuing this issue. Hopefully we can make progress
> quickly. The last message on this topic was sent by me, and contains
> a full description of what I believe is the source of the problem:
>
> http://sources.redhat.com/ml/gdb-patches/2001-11/msg00296.html
>
> The following patch fixes many regressions in the testsuite:
> Summary 1 2
> FAIL 1644 792
> PASS 4388 6990
> XFAIL 59 149
> XPASS 1 3
>
> I compiled on Tru64 5.1A, using GCC.
>
> This patch is not meant to be integrated as is, this is more a first
> rough fix presented so that we can discuss more precisely which
> direction to take in order to complete the work.
>
I don't mind this patch as is actually.
> In particular, should the "if section-is-uninitialized then discard"
> bits be always there regardless of the target? Or should we put in place
> some configure test in order to execute this test only on targets were
> this is needed (alpha-osf is the only one that I know of).
>
Yeah, I see your point. It seems like the real problem is that a
storage class is assigned w/o a corresponding section being
there. Does the section ever exist, does it get optimized out at some
point? Your comments explain pretty well what's going on, so I am inclined
to leave the "continue's" in.
> There is also the get_section_index function that I quickly threw in. I
> suppose it should be defined in a .h file, and implemented somewhere
> else than in mdebugread.c.
>
I would suggest symfile.c and symfile.h.
Elena
> Cheers,
> --
> Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Uninitialized section index internal error on Tru64 5.1
2002-04-14 15:39 ` Elena Zannoni
@ 2002-04-16 10:40 ` Joel Brobecker
2002-04-19 9:15 ` Elena Zannoni
0 siblings, 1 reply; 6+ messages in thread
From: Joel Brobecker @ 2002-04-16 10:40 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 964 bytes --]
Thank you Elena for reviewing my changes. May I suggest the following
patch for inclusion, then?
2002-04-16 J. Brobecker <brobecker@gnat.com>
* symfile.h (get_section_index): Define.
* symfile.c (get_section_index): New function.
* mdebugread.c (SC_IS_SBSS): New macro.
(SC_IS_BSS): Return true for the scBss storage class only, as
the scSBss storage class refers to the .sbss section.
(parse_partial_symbols): Discard the symbols which associated
section does not exist.
Make sure to use the .sbss section index for symbols which
storage class is scBss, rather than using the .bss section index.
One additional note: I split the SC_IS_BSS macro into 2 macros, one for
scBss and one for scSBss. I wonder if the same should not be done for
the SC_IS_TEXT and SC_IS_DATA macros as well. So far, I haven't found a
case where this causes a problem, so left them unchanged for now.
--
Joel
[-- Attachment #2: sect_index_uninitialized.diff --]
[-- Type: text/plain, Size: 5618 bytes --]
Index: symfile.h
===================================================================
RCS file: /cvs/src/src/gdb/symfile.h,v
retrieving revision 1.12
diff -c -3 -p -r1.12 symfile.h
*** symfile.h 1 Feb 2002 01:14:20 -0000 1.12
--- symfile.h 16 Apr 2002 13:18:36 -0000
*************** extern void find_lowest_section (bfd *,
*** 252,257 ****
--- 252,259 ----
extern bfd *symfile_bfd_open (char *);
+ extern int get_section_index (struct objfile *, char *);
+
/* Utility functions for overlay sections: */
extern enum overlay_debugging_state {
ovly_off,
Index: symfile.c
===================================================================
RCS file: /cvs/src/src/gdb/symfile.c,v
retrieving revision 1.58
diff -c -3 -p -r1.58 symfile.c
*** symfile.c 29 Mar 2002 01:09:27 -0000 1.58
--- symfile.c 16 Apr 2002 13:18:36 -0000
*************** static void cashier_psymtab (struct part
*** 120,125 ****
--- 120,127 ----
bfd *symfile_bfd_open (char *);
+ int get_section_index (struct objfile *, char *);
+
static void find_sym_fns (struct objfile *);
static void decrement_reading_symtab (void *);
*************** symfile_bfd_open (char *name)
*** 1113,1118 ****
--- 1115,1132 ----
bfd_errmsg (bfd_get_error ()));
}
return (sym_bfd);
+ }
+
+ /* Return the section index for the given section name. Return -1 if
+ the section was not found. */
+ int
+ get_section_index (struct objfile *objfile, char *section_name)
+ {
+ asection *sect = bfd_get_section_by_name (objfile->obfd, section_name);
+ if (sect)
+ return sect->index;
+ else
+ return -1;
}
/* Link a new symtab_fns into the global symtab_fns list. Called on gdb
Index: mdebugread.c
===================================================================
RCS file: /cvs/src/src/gdb/mdebugread.c,v
retrieving revision 1.24
diff -c -3 -p -r1.24 mdebugread.c
*** mdebugread.c 19 Mar 2002 19:00:03 -0000 1.24
--- mdebugread.c 16 Apr 2002 13:18:36 -0000
*************** struct symloc
*** 143,149 ****
|| (sc) == scPData \
|| (sc) == scXData)
#define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
! #define SC_IS_BSS(sc) ((sc) == scBss || (sc) == scSBss)
#define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
\f
/* Various complaints about symbol reading that don't abort the process */
--- 143,150 ----
|| (sc) == scPData \
|| (sc) == scXData)
#define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
! #define SC_IS_BSS(sc) ((sc) == scBss)
! #define SC_IS_SBSS(sc) ((sc) == scSBss)
#define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
\f
/* Various complaints about symbol reading that don't abort the process */
*************** parse_partial_symbols (struct objfile *o
*** 2425,2450 ****
--- 2426,2497 ----
ms_type = mst_bss;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
}
+ else if (SC_IS_SBSS (ext_in->asym.sc))
+ {
+ ms_type = mst_bss;
+ svalue += ANOFFSET (objfile->section_offsets,
+ get_section_index (objfile, ".sbss"));
+ }
else
ms_type = mst_abs;
break;
case stLabel:
/* Label */
+
+ /* On certain platforms, some extra label symbols can be
+ generated by the linker. One possible usage for this kind
+ of symbols is to represent the address of the begining of a
+ given section. For instance, on Tru64 5.1, the address of
+ the _ftext label is the start address of the .text section.
+
+ The storage class of these symbols is usually directly
+ related to the section to which the symbol refers. For
+ instance, on Tru64 5.1, the storage class for the _fdata
+ label is scData, refering to the .data section.
+
+ It is actually possible that the section associated to the
+ storage class of the label does not exist. On True64 5.1
+ for instance, the libm.so shared library does not contain
+ any .data section, although it contains a _fpdata label
+ which storage class is scData... Since these symbols are
+ usually useless for the debugger user anyway, we just
+ discard these symbols.
+ */
+
if (SC_IS_TEXT (ext_in->asym.sc))
{
+ if (objfile->sect_index_text == -1)
+ continue;
+
ms_type = mst_file_text;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
}
else if (SC_IS_DATA (ext_in->asym.sc))
{
+ if (objfile->sect_index_data == -1)
+ continue;
+
ms_type = mst_file_data;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
}
else if (SC_IS_BSS (ext_in->asym.sc))
{
+ if (objfile->sect_index_bss == -1)
+ continue;
+
ms_type = mst_file_bss;
svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
}
+ else if (SC_IS_SBSS (ext_in->asym.sc))
+ {
+ const int sbss_sect_index = get_section_index (objfile, ".sbss");
+
+ if (sbss_sect_index == -1)
+ continue;
+
+ ms_type = mst_file_bss;
+ svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index);
+ }
else
ms_type = mst_abs;
break;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Uninitialized section index internal error on Tru64 5.1
2002-04-16 10:40 ` Joel Brobecker
@ 2002-04-19 9:15 ` Elena Zannoni
2002-04-22 3:21 ` Joel Brobecker
0 siblings, 1 reply; 6+ messages in thread
From: Elena Zannoni @ 2002-04-19 9:15 UTC (permalink / raw)
To: Joel Brobecker; +Cc: Elena Zannoni, gdb-patches
Joel Brobecker writes:
> Thank you Elena for reviewing my changes. May I suggest the following
> patch for inclusion, then?
Yes, OK.
Thanks
Elena
>
> 2002-04-16 J. Brobecker <brobecker@gnat.com>
>
> * symfile.h (get_section_index): Define.
> * symfile.c (get_section_index): New function.
> * mdebugread.c (SC_IS_SBSS): New macro.
> (SC_IS_BSS): Return true for the scBss storage class only, as
> the scSBss storage class refers to the .sbss section.
> (parse_partial_symbols): Discard the symbols which associated
> section does not exist.
> Make sure to use the .sbss section index for symbols which
> storage class is scBss, rather than using the .bss section index.
>
> One additional note: I split the SC_IS_BSS macro into 2 macros, one for
> scBss and one for scSBss. I wonder if the same should not be done for
> the SC_IS_TEXT and SC_IS_DATA macros as well. So far, I haven't found a
> case where this causes a problem, so left them unchanged for now.
>
> --
> Joel
> Index: symfile.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.h,v
> retrieving revision 1.12
> diff -c -3 -p -r1.12 symfile.h
> *** symfile.h 1 Feb 2002 01:14:20 -0000 1.12
> --- symfile.h 16 Apr 2002 13:18:36 -0000
> *************** extern void find_lowest_section (bfd *,
> *** 252,257 ****
> --- 252,259 ----
>
> extern bfd *symfile_bfd_open (char *);
>
> + extern int get_section_index (struct objfile *, char *);
> +
> /* Utility functions for overlay sections: */
> extern enum overlay_debugging_state {
> ovly_off,
> Index: symfile.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.c,v
> retrieving revision 1.58
> diff -c -3 -p -r1.58 symfile.c
> *** symfile.c 29 Mar 2002 01:09:27 -0000 1.58
> --- symfile.c 16 Apr 2002 13:18:36 -0000
> *************** static void cashier_psymtab (struct part
> *** 120,125 ****
> --- 120,127 ----
>
> bfd *symfile_bfd_open (char *);
>
> + int get_section_index (struct objfile *, char *);
> +
> static void find_sym_fns (struct objfile *);
>
> static void decrement_reading_symtab (void *);
> *************** symfile_bfd_open (char *name)
> *** 1113,1118 ****
> --- 1115,1132 ----
> bfd_errmsg (bfd_get_error ()));
> }
> return (sym_bfd);
> + }
> +
> + /* Return the section index for the given section name. Return -1 if
> + the section was not found. */
> + int
> + get_section_index (struct objfile *objfile, char *section_name)
> + {
> + asection *sect = bfd_get_section_by_name (objfile->obfd, section_name);
> + if (sect)
> + return sect->index;
> + else
> + return -1;
> }
>
> /* Link a new symtab_fns into the global symtab_fns list. Called on gdb
> Index: mdebugread.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mdebugread.c,v
> retrieving revision 1.24
> diff -c -3 -p -r1.24 mdebugread.c
> *** mdebugread.c 19 Mar 2002 19:00:03 -0000 1.24
> --- mdebugread.c 16 Apr 2002 13:18:36 -0000
> *************** struct symloc
> *** 143,149 ****
> || (sc) == scPData \
> || (sc) == scXData)
> #define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
> ! #define SC_IS_BSS(sc) ((sc) == scBss || (sc) == scSBss)
> #define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
> \f
> /* Various complaints about symbol reading that don't abort the process */
> --- 143,150 ----
> || (sc) == scPData \
> || (sc) == scXData)
> #define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
> ! #define SC_IS_BSS(sc) ((sc) == scBss)
> ! #define SC_IS_SBSS(sc) ((sc) == scSBss)
> #define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
> \f
> /* Various complaints about symbol reading that don't abort the process */
> *************** parse_partial_symbols (struct objfile *o
> *** 2425,2450 ****
> --- 2426,2497 ----
> ms_type = mst_bss;
> svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
> }
> + else if (SC_IS_SBSS (ext_in->asym.sc))
> + {
> + ms_type = mst_bss;
> + svalue += ANOFFSET (objfile->section_offsets,
> + get_section_index (objfile, ".sbss"));
> + }
> else
> ms_type = mst_abs;
> break;
> case stLabel:
> /* Label */
> +
> + /* On certain platforms, some extra label symbols can be
> + generated by the linker. One possible usage for this kind
> + of symbols is to represent the address of the begining of a
> + given section. For instance, on Tru64 5.1, the address of
> + the _ftext label is the start address of the .text section.
> +
> + The storage class of these symbols is usually directly
> + related to the section to which the symbol refers. For
> + instance, on Tru64 5.1, the storage class for the _fdata
> + label is scData, refering to the .data section.
> +
> + It is actually possible that the section associated to the
> + storage class of the label does not exist. On True64 5.1
> + for instance, the libm.so shared library does not contain
> + any .data section, although it contains a _fpdata label
> + which storage class is scData... Since these symbols are
> + usually useless for the debugger user anyway, we just
> + discard these symbols.
> + */
> +
> if (SC_IS_TEXT (ext_in->asym.sc))
> {
> + if (objfile->sect_index_text == -1)
> + continue;
> +
> ms_type = mst_file_text;
> svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
> }
> else if (SC_IS_DATA (ext_in->asym.sc))
> {
> + if (objfile->sect_index_data == -1)
> + continue;
> +
> ms_type = mst_file_data;
> svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
> }
> else if (SC_IS_BSS (ext_in->asym.sc))
> {
> + if (objfile->sect_index_bss == -1)
> + continue;
> +
> ms_type = mst_file_bss;
> svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
> }
> + else if (SC_IS_SBSS (ext_in->asym.sc))
> + {
> + const int sbss_sect_index = get_section_index (objfile, ".sbss");
> +
> + if (sbss_sect_index == -1)
> + continue;
> +
> + ms_type = mst_file_bss;
> + svalue += ANOFFSET (objfile->section_offsets, sbss_sect_index);
> + }
> else
> ms_type = mst_abs;
> break;
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC] Uninitialized section index internal error on Tru64 5.1
2002-04-19 9:15 ` Elena Zannoni
@ 2002-04-22 3:21 ` Joel Brobecker
0 siblings, 0 replies; 6+ messages in thread
From: Joel Brobecker @ 2002-04-22 3:21 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches
> Yes, OK.
Thank you, committed in the main branch.
> > 2002-04-16 J. Brobecker <brobecker@gnat.com>
> >
> > * symfile.h (get_section_index): Define.
> > * symfile.c (get_section_index): New function.
> > * mdebugread.c (SC_IS_SBSS): New macro.
> > (SC_IS_BSS): Return true for the scBss storage class only, as
> > the scSBss storage class refers to the .sbss section.
> > (parse_partial_symbols): Discard the symbols which associated
> > section does not exist.
> > Make sure to use the .sbss section index for symbols which
> > storage class is scBss, rather than using the .bss section index.
--
Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2002-04-22 10:21 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-04-12 3:19 [RFC] Uninitialized section index internal error on Tru64 5.1 Joel Brobecker
2002-04-12 3:22 ` Joel Brobecker
2002-04-14 15:39 ` Elena Zannoni
2002-04-16 10:40 ` Joel Brobecker
2002-04-19 9:15 ` Elena Zannoni
2002-04-22 3:21 ` Joel Brobecker
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox