这可能是完全不相关或非常简单的问题。
我试图编写一个使用libz
库函数进行压缩的非常简单的应用程序。它应该在uCLinux
CPU上的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
,但发生了同样的错误。
答案 0 :(得分:0)
找到问题的原因。
原始zlib
使用-O3
优化标记。我的NIOSII CPU或编译器可能无法完成创建正确运行代码的任务。一旦我放松了优化标记,错误便消失了。