qrencode - 分段错误(核心已转储)
qrencode - Segmentation fault (core dumped)
我已经制作了一个工作程序,可以在给定特定字符串的情况下生成图像。它完全适用于我的 Slackware 32 位发行版和其他 32 位发行版。
现在我需要在客户机上实现它,它是一台 AIX powerpc。它编译没有任何问题,并且似乎可以工作(所有其他函数都可以工作并给出正确的结果),除非我调用这两个函数 "QRcode_encodeString" 和 "QRcode_encodeData"。
它一直给我分段错误。
您可以假设我的 main() 唯一行是该函数调用:
#include <stdio.h>
#include <qrencode.h>
int main(void)
{
QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);
return 0;
}
我的客户端机器上没有 gdb,也没有 root 权限。它与生成微型 QRcode 的 "QRcode_encodeStringMQR()" 一起使用,但这不是我的解决方案。它生成一个名为 "core" 的转储文件,我无法使用它,因为那台机器没有 gdb ...而且我假设我无法在另一台机器上打开它,因为它们没有共享相同的架构。我完全不知道如何解决这个问题...
同样,这段代码适用于我的 Slackware 发行版。
遗憾的是,我对 powerpc 和 AIX 的了解仅限于此。
忘了说了,只有cc可用,我是这样编译的:
cc qrgen.c -lqrencode -L/usr/local/lib -I/usr/local/include
仅供参考,我能够在 Linux 的 Power 环境中编译它,它运行良好,没有分段错误。
机器:POWER8
OS: Ubuntu 15.04
ubuntu@ubuntu1504:~/qr$ cat hello.c
#include <stdio.h>
#include <qrencode.h>
int main(void)
{
QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);
return 0;
}
ubuntu@ubuntu1504:~/qr$ gcc hello.c -lqrencode
ubuntu@ubuntu1504:~/qr$ ./a.out
ubuntu@ubuntu1504:~/qr$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 20 vars */]) = 0
brk(0) = 0x1003f690000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42765, ...}) = 0
mmap(NULL, 42765, PROT_READ, MAP_PRIVATE, 3, 0) = 0x3fff816c0000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/powerpc64le-linux-gnu/libqrencode.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=67496, ...}) = 0
mmap(NULL, 131832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff81690000
mmap(0x3fff816a0000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x3fff816a0000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/powerpc64le-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]@R[=10=][=10=][=10=][=10=][=10=]"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1789000, ...}) = 0
mmap(NULL, 1860208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff814c0000
mmap(0x3fff81670000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a0000) = 0x3fff81670000
close(3) = 0
mprotect(0x3fff81670000, 65536, PROT_READ) = 0
mprotect(0x3fff816a0000, 65536, PROT_READ) = 0
mprotect(0x10010000, 65536, PROT_READ) = 0
mprotect(0x3fff81720000, 65536, PROT_READ) = 0
munmap(0x3fff816c0000, 42765) = 0
brk(0) = 0x1003f690000
brk(0x1003f6c0000) = 0x1003f6c0000
exit_group(0) = ?
+++ exited with 0 +++
我发现了问题...lib 的安装产生了问题并导致符号 links 作为一个简单文件存在而库只是不存在...
这是丢失的文件“/usr/local/lib/libqrencode.so.3.4.4”,它是代码本身...我正在查看这些文件但没有注意到它,因为有一个名为 libqrencode.so.3.4 但此文件应该是 link 到 libqrencode.so.3.4.4 的符号,因为 libqrencode.so.3.4.4 不存在,而不是符号 link 失败,它创建了一个同名的空文件...
我已经制作了一个工作程序,可以在给定特定字符串的情况下生成图像。它完全适用于我的 Slackware 32 位发行版和其他 32 位发行版。
现在我需要在客户机上实现它,它是一台 AIX powerpc。它编译没有任何问题,并且似乎可以工作(所有其他函数都可以工作并给出正确的结果),除非我调用这两个函数 "QRcode_encodeString" 和 "QRcode_encodeData"。 它一直给我分段错误。
您可以假设我的 main() 唯一行是该函数调用:
#include <stdio.h>
#include <qrencode.h>
int main(void)
{
QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);
return 0;
}
我的客户端机器上没有 gdb,也没有 root 权限。它与生成微型 QRcode 的 "QRcode_encodeStringMQR()" 一起使用,但这不是我的解决方案。它生成一个名为 "core" 的转储文件,我无法使用它,因为那台机器没有 gdb ...而且我假设我无法在另一台机器上打开它,因为它们没有共享相同的架构。我完全不知道如何解决这个问题...
同样,这段代码适用于我的 Slackware 发行版。
遗憾的是,我对 powerpc 和 AIX 的了解仅限于此。
忘了说了,只有cc可用,我是这样编译的:
cc qrgen.c -lqrencode -L/usr/local/lib -I/usr/local/include
仅供参考,我能够在 Linux 的 Power 环境中编译它,它运行良好,没有分段错误。 机器:POWER8 OS: Ubuntu 15.04
ubuntu@ubuntu1504:~/qr$ cat hello.c
#include <stdio.h>
#include <qrencode.h>
int main(void)
{
QRcode* pQRC = QRcode_encodeString("abc", 0, QR_ECLEVEL_L, QR_MODE_8, 0);
return 0;
}
ubuntu@ubuntu1504:~/qr$ gcc hello.c -lqrencode
ubuntu@ubuntu1504:~/qr$ ./a.out
ubuntu@ubuntu1504:~/qr$ strace ./a.out
execve("./a.out", ["./a.out"], [/* 20 vars */]) = 0
brk(0) = 0x1003f690000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42765, ...}) = 0
mmap(NULL, 42765, PROT_READ, MAP_PRIVATE, 3, 0) = 0x3fff816c0000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/powerpc64le-linux-gnu/libqrencode.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=67496, ...}) = 0
mmap(NULL, 131832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff81690000
mmap(0x3fff816a0000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x3fff816a0000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/powerpc64le-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "7ELF[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]@R[=10=][=10=][=10=][=10=][=10=]"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1789000, ...}) = 0
mmap(NULL, 1860208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3fff814c0000
mmap(0x3fff81670000, 131072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a0000) = 0x3fff81670000
close(3) = 0
mprotect(0x3fff81670000, 65536, PROT_READ) = 0
mprotect(0x3fff816a0000, 65536, PROT_READ) = 0
mprotect(0x10010000, 65536, PROT_READ) = 0
mprotect(0x3fff81720000, 65536, PROT_READ) = 0
munmap(0x3fff816c0000, 42765) = 0
brk(0) = 0x1003f690000
brk(0x1003f6c0000) = 0x1003f6c0000
exit_group(0) = ?
+++ exited with 0 +++
我发现了问题...lib 的安装产生了问题并导致符号 links 作为一个简单文件存在而库只是不存在...
这是丢失的文件“/usr/local/lib/libqrencode.so.3.4.4”,它是代码本身...我正在查看这些文件但没有注意到它,因为有一个名为 libqrencode.so.3.4 但此文件应该是 link 到 libqrencode.so.3.4.4 的符号,因为 libqrencode.so.3.4.4 不存在,而不是符号 link 失败,它创建了一个同名的空文件...