簡體   English   中英

在uCLinux環境中使用zlib時的非法指令

[英]Illegal Instruction while using zlib in uCLinux environment

這可能是完全無關或非常簡單的問題。

我試圖編寫一個使用libz庫函數進行壓縮的非常簡單的應用程序。 它應在NIOS CPU的uCLinux環境中運行。 我的系統運行busybox,busybox提供了所有常規的gzipgunzip功能。 但是它們內置在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 ,但是發生了同樣的錯誤。

找到了問題的原因。

原始的zlib使用-O3優化標志。 我的NIOSII CPU或編譯器可能無法完成創建正確運行的代碼的任務。 一旦放寬了優化標志,錯誤就會消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM