全部,
最近,我一直在尝试从具有 X11 转发功能的客户端获取 NetBSD 的 Solaris 8 版本xterm
并xauth
运行,但两个二进制文件似乎都会立即产生分段违规。我对这两个程序都运行了,试图找出发生了什么,这两个程序的最后几行输出如下所示:ssh
ktrace
...
571 1 xclock compat_20_getfsstat(0xedefa018, 0xefffede4) Err#2 ENOENT
571 1 xclock compat_50_getrusage(0xedefa000, 0x1000) = 0
571 1 xclock #115 (obsolete vtrace)(0, 0x1000, 0x7, 0x80000102, 0xffffffff, 0) = -303063040
571 1 xclock compat_50_getrusage(0xedee4000, 0x1000) = 0
571 1 xclock break(0x25850) = 0
571 1 xclock break(0x27850) = 0
571 1 xclock break(0x27850) = 0
571 1 xclock break(0x29850) = 0
571 1 xclock break(0x29850) = 0
571 1 xclock break(0x2b850) = 0
571 1 xclock compat_43_otruncate(0x5, 0xeffff3a0) = 0
571 1 xclock shmdt(0x2, 0x2, 0) = 3
571 1 xclock modctl(0x3, 0x6, 0x1, 0xeffff39c, 0x4) = 0
571 1 xclock modctl(0x3, 0xffff, 0x8, 0xeffff398, 0x4) = 0
571 1 xclock break(0x2b850) = 0
571 1 xclock break(0x2d850) = 0
571 1 xclock open("/emul/svr4/etc/netconfig", 0, 0x1b6) = 4
571 1 xclock #217 (unimplemented)(0x4, 0xefffebb0) = 0
571 1 xclock ioctl(0x4, _IO('T',0x1,0), 0xefffeb3c) Err#-4
571 1 xclock read(0x4, 0x2b9a4, 0x400) = 1024
"#pragma ident\t"@(#)netconfig\t1.16\t99/10/25 SMI"\n#\n# The "Network Configuration" File.\n#\n# Each entry is of the form:\n#\n# <network_id> <semantics> <fl"
571 1 xclock SIGSEGV SIG_DFL
我注意到呼叫ioctl
失败了;这可能是失败的原因吗?
我还运行了ktrace
NetBSD 版本xclock
,xterm
看看是否有任何相似之处,我能找到的最相似的输出示例如下:
...
604 1 xclock __stat50("/etc/nsswitch.conf", 0xefffeed8) = 0
604 1 xclock open("/etc/nsswitch.conf", 0x400000, 0x1b6) = 3
604 1 xclock __fstat50(0x3, 0xefffeb70) = 0
604 1 xclock read(0x3, 0xed61d000, 0x4000) = 621
"#\t$NetBSD: nsswitch.conf,v 1.6 2009/10/25 00:17:06 tsarna Exp $\n#\n# nsswitch.conf(5) -\n#\tname service switch configuration file\n#\n\n\n# These are the default"
604 1 xclock read(0x3, 0xed61d000, 0x4000) = 0
...
604 1 xclock open("/etc/hosts", 0x400000, 0x1b6) = 3
604 1 xclock __fstat50(0x3, 0xefffcc38) = 0
604 1 xclock read(0x3, 0xed61d000, 0x4000) = 831
"#\t$NetBSD: hosts,v 1.9 2013/11/24 07:20:01 dholland Exp $\n#\n# Host name database.\n#\n# This file contains addresses and aliases for local hosts whose names\n# n"
604 1 xclock read(0x3, 0xed61d000, 0x4000) = 0
""
604 1 xclock close(0x3) = 0
因此,我怀疑原因可能在于我复制到 NetBSD 虚拟机的某些 Solaris 8 文件(例如/etc/netconfig
),但我不确定。这些文件是否是导致 Solaris 8 X11 二进制文件无法在 NetBSD 上正常运行的原因?
答案1
ioctl()
由于尝试读取的文件(FD#4)最终被成功读取,因此这次失败可能无关紧要。
还有一个未实现的系统调用,同样位于 FD#4 上,就在看起来是 的上方fstat64()
,可能是为了查找文件的大小。同样,这可能无关紧要,因为文件似乎已被成功读取。
这两个调用都可能是在 Solaris libc 中通过 STDIO 函数进行的,通过setnetconfig()
,也在 libc 中。
因此,假设您在 NetBSD 测试主机上放入的文件/emul/svr4/etc/netconfig
与有效工作的 Solaris 8 副本没有变化/etc/netconfig
,我会进一步怀疑ktrace
输出中看到的任何内容是否能为问题提供任何真正的线索。
下一步可能是尝试一些更简单的程序,例如cat
或/bin/echo
,甚至/bin/true
和/bin/false
,看看它们是否成功运行。
真正的答案可能只有在可以在 NetBSD 上的模拟下在源代码级调试器下运行从 Solaris 源代码构建的未剥离版本的代码时才会出现,以准确查看它崩溃的位置。