首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在uCLinux环境中使用zlib时的非法指令

在uCLinux环境中使用zlib时的非法指令
EN

Stack Overflow用户
提问于 2015-07-21 23:25:59
回答 1查看 313关注 0票数 0

这可能是完全不相关的问题,也可能是非常简单的问题。

我正在尝试编写一个非常简单的应用程序,它使用libz库函数进行压缩。它应该在uCLinux环境中运行在NIOS CPU上。我的系统运行busybox,而busybox提供了所有常规的gzipgunzip功能。但它们是内置在busybox中的,据我所知,不使用动态libz库。以下是代码:

代码语言:javascript
复制
{
    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对故障的回溯:

代码语言:javascript
复制
#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,但也发生了相同的错误。

EN

回答 1

Stack Overflow用户

发布于 2015-07-23 23:25:58

找到了问题的原因。

原始zlib使用-O3优化标志。可能我的NIOSII CPU或编译器无法完成创建正确运行的代码的任务。一旦我放松了优化标志,错误就消失了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31551351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档