2015-07-21 2 views
0

Это может быть совершенно неактуальный или очень простой вопрос.Нелегальная инструкция при использовании 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 example. Проблема в том, что в последней строке - 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 из исходного кода, используя ту же техническую привязку ucLinux, которую вы используете для создания своего приложения. Также рассмотрите возможность создания статического zlib .a и привязки вашего приложения к этому. – paulsm4

+0

Спасибо. Я создаю его из источника, используя ту же самую инструментальную комбинацию uCLinux. Я все еще тестирую статически связанную zlib.s – ilya1725

ответ

0

Обнаружил причину проблемы.

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

Смежные вопросы