The default linker in OpenBSD 3.9 segfaults reproducibly:

[EMAIL PROTECTED]:~$ gcc -o -Wall wav2bin wav2bin.c
collect2: ld terminated with signal 11 [Segmentation fault], core dumped
wav2bin(.init+0x0): In function `__init':
: multiple definition of `__init'
/usr/lib/crtbegin.o(.init+0x0): first defined here
wav2bin(.text+0x0): In function `_start':
: multiple definition of `__start'
/usr/lib/crt0.o(.text+0x0): first defined here
wav2bin(.data+0x0): multiple definition of `__progname'
/usr/lib/crt0.o(.data+0x0): first defined here
wav2bin(.text+0x0): In function `_start':
: multiple definition of `_start'
/usr/lib/crt0.o(.text+0x0): first defined here
wav2bin(.fini+0x0): In function `__fini':
: multiple definition of `__fini'
/usr/lib/crtbegin.o(.fini+0x0): first defined here
wav2bin(.text+0x18): In function `___start':
: multiple definition of `___start'
/usr/lib/crt0.o(.text+0x18): first defined here
/tmp//cce21751.o(.text+0x91): In function `process_byte':
: multiple definition of `process_byte'
wav2bin(.text+0x249): first defined here
/usr/bin/ld: Warning: size of symbol `process_byte' changed from 171 in wav2bin 
to 242 in /tmp//cce21751.o
/tmp//cce21751.o(.text+0x183): In function `process_bit':
: multiple definition of `process_bit'
wav2bin(.text+0x2f4): first defined here
/tmp//cce21751.o(.text+0x1d0): In function `process_time':
: multiple definition of `process_time'
wav2bin(.text+0x341): first defined here
/tmp//cce21751.o(.text+0x27e): In function `squelch_reset':
: multiple definition of `squelch_reset'
wav2bin(.text+0x3ef): first defined here
/tmp//cce21751.o(.text+0x2fb): In function `process_loud_sample':
: multiple definition of `process_loud_sample'
wav2bin(.text+0x46c): first defined here
/tmp//cce21751.o(.text+0x37d): In function `process_sample':
: multiple definition of `process_sample'
wav2bin(.text+0x4ee): first defined here
/tmp//cce21751.o(.text+0x3e4): In function `process_samples':
: multiple definition of `process_samples'
wav2bin(.text+0x555): first defined here
/tmp//cce21751.o(.text+0x445): In function `main':
: multiple definition of `main'
wav2bin(.text+0x5b6): first defined here
/usr/lib/crt0.o(.dynamic+0x0): multiple definition of `_DYNAMIC'
/usr/lib/crt0.o(.got.plt+0x0): multiple definition of `_GLOBAL_OFFSET_TABLE_'

bt full:
(gdb) bt full
#0  0x1c01a6a6 in bfd_getl32 ()
No symbol table info available.
#1  0x1c0278a9 in bfd_elf32_swap_reloc_in ()
No symbol table info available.
#2  0x1c038b51 in elf_link_sort_relocs ()
No symbol table info available.
#3  0x1c03b4d7 in bfd_elf_final_link ()
No symbol table info available.
#4  0x1c0107be in ldwrite ()
No symbol table info available.
#5  0x1c00e69e in main ()
No symbol table info available.

What should I do to diagnose the problem? The .c file follows.

CL<

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define WAV_HDR_LEN 0x2c
#define SAMPLERATE_OFFSET 0x18
#define BDRY1 340 /* us */ 
#define BDRY2 555 /* us */
#define BDRY3 700 /* us */
#define LEAD 100 /* 100 edges */
#define SQUELCH_TIME 300 /* us */

#define PRINT_TIMES 0
#define HDR_SIZE 16

unsigned char wav_header[WAV_HDR_LEN];
float sample_time; /* In microseconds */
unsigned leader_counter=0;
int halfbit;
int firstbit;
unsigned byte_counter; 
unsigned char byte_checksum;
unsigned char flagbyte;
unsigned char type;
unsigned char header[HDR_SIZE]; /* Tape header */

void read_wav_header(void)
{
        unsigned short samplerate;
        unsigned char *srptr=wav_header+SAMPLERATE_OFFSET;

        fread(header, WAV_HDR_LEN, 1, stdin);
        if (memcmp(wav_header,"RIFF",4)){
                fprintf(stderr,"wav2bin: Error: input not a WAV file\n");
                exit(1);
        }
        samplerate=*srptr+(*(srptr+1)<<8);
        sample_time=1e6/samplerate;
}

/* Gets all bytes, including flag byte. */
void process_byte(unsigned char byte)
{
        byte_checksum^=byte;
        if (!byte_counter){
                flagbyte=byte;
                if (flagbyte==0xff){
                        fprintf(stderr,"Data\n");
                }else if (flagbyte==0x00){
                        fprintf(stderr,"Header\n");
                }else{
                        fprintf(stderr,"Invalid flagbyte\n");
                        exit(1);
                }
        }else{
                if (!flagbyte){
                        if (byte_counter<HDR_SIZE) header[byte_counter]=byte;
                        else{
                                fprintf(stderr,"Header overrun!\n");
                                exit(1);
                        }
                }
        }
        if (byte_counter) printf("0x%02x\n",byte);
        byte_counter++;
}

void process_bit (int bit)
{
        static int bits;
        static int byte=0;

        byte<<=1;
        byte|=bit;
        bits++;
        if (bits>=8){
                process_byte(byte);
                bits=0;
                byte=0;
        }
}

void process_time(float time)
{

        if (leader_counter<100){
                if (time>=BDRY2&&time<BDRY3) leader_counter++;
                else leader_counter=0;
                return;
        }
        if (time<BDRY2){
                halfbit^=1;
                if (halfbit) return;
                if (firstbit){
                        firstbit=0;
                        return;
                }
#if PRINT_TIMES
                printf("%f\n",time);
#else
                process_bit(time>=BDRY1);
#endif
        }
}

/* Resets the decoder when the sound ceases. */
void squelch_reset(void)
{
        if (byte_counter){
                if (byte_checksum)fprintf(stderr,"Bad checksum block"
                                " checksum=0x%02x\n", byte_checksum);
                else fprintf(stderr,"Good checksum block\n");
        }
        leader_counter=0;
        firstbit=1;
        halfbit=0;
        byte_counter=0;
        byte_checksum=0;
}
void process_loud_sample(int sample)
{
        static int last_sample=0;
        static float time_since_last_edge=0;

        if ((sample^last_sample)<0){
                /* They have different signs */
                float time; /* Time between the beginning of this sample and
                               the zero crossing */

                time=sample_time*last_sample/(last_sample-sample);
                time_since_last_edge+=time;
                process_time(time_since_last_edge);
                time_since_last_edge=sample_time-time;
        }else{
                /* They have the same signs */
                time_since_last_edge+=sample_time;
        }
        last_sample=sample;
}

#define abs(x) ((x)>=0?(x):-(x))
void process_sample(int sample)
{
        static float time_since_last_loud=0;

        if (abs(sample)>3) time_since_last_loud=0;
        else time_since_last_loud+=sample_time;
        if (time_since_last_loud<SQUELCH_TIME) process_loud_sample(sample);
        else squelch_reset();
}

void process_samples(void)
{
        int sample;

again:
        sample=getchar();
        if (sample==EOF) return;
        sample-=0x80;
        process_sample(sample);
        goto again;
}

int main(int argc, char **argv)
{
        read_wav_header();
        squelch_reset();
        process_samples();
        return 0;
}

Reply via email to