Недопустимая инструкция при использовании zlib в среде uCLinux

Это может быть совершенно неактуальный или очень простой вопрос.

Я пытаюсь написать очень простое приложение, которое использует libz Функции библиотеки для сжатия. Это должно работать в uCLinux среда на NIOS ЦПУ. Моя система работает с busybox и busybox обеспечивает все обычные gzip, gunzip Функциональные возможности. Но они встроены в busybox и, насколько я могу судить, не используют динамический libz библиотека. Вот код:

{
    printf("Hello World\n");
    printf("Zlib: %s\n", zlibVersion());
    gzFile file = gzopen ("/tmp/s2.log.gz", "wb");
    if (! file) {
        fprintf (stderr, "gzopen failed: %s.\n", strerror (errno));
        exit (-1);
    }

    printf("%d\n", __LINE__);
    {
        unsigned char buffer[LENGTH] = "Hello world";
        int bytes_read = gzwrite (file, buffer, LENGTH - 1);
        if (bytes_read < LENGTH - 1) {
            int err;
            const char * error_string;
            error_string = gzerror (file, & err);
            if (err) {
                fprintf (stderr, "Error: %s.\n", error_string);
                exit (-1);
            }
        }
    }
    printf("%d\n", __LINE__);
    printf("%d\n", gzclose (file));
    return 0;
}

Частично снят с примера zlib. Проблема в том, что на последней строке - gzclose - когда сжатый буфер фактически сбрасывается в файл, я получаю illegal instruction исключение. У кого-нибудь есть идеи, почему это может происходить?

Вот обратный след от сбоя GDB:

#0  0x2aad9efc in order.3344 () from ./uClinux/uClinux-dist/staging/usr/lib/libz.so.1
#1  0x2aad21c8 in _tr_flush_block () from ./uClinux/uClinux-dist/staging/usr/lib/libz.so.1
#2  0x2aace694 in deflate_slow () from ./uClinux/uClinux-dist/staging/usr/lib/libz.so.1
#3  0x2aacec9c in deflate () from ./uClinux/uClinux-dist/staging/usr/lib/libz.so.1
#4  0x2aacb5d0 in gzclose () from ./uClinux/uClinux-dist/staging/usr/lib/libz.so.1
#5  0x0000193c in main () at main.c:49

Обновление: я связал libz.a статически, но произошла та же ошибка.

1 ответ

Нашел причину проблемы.

Оригинал zlib использования -O3 флаг оптимизации. Возможно, что либо мой процессор NIOSII, либо компилятор не справляются с задачей создания правильно работающего кода. Как только я ослабил флаг оптимизации, ошибка исчезла.

Другие вопросы по тегам