我正在尝试在 Linux chroot 中运行 Firefox。chroot 通过 debootstrap 安装了一份 Debian Etch。如果 chroot 在装有 2.6 内核的机器上运行,我可以正常运行 Firefox 2.0、3.0 和 3.5。当我将 chroot 移到运行 2.4.37 内核的机器上时,问题就出现了,我可以正常运行 2.0,但 3.0 和 3.5 都无声无息地挂起,没有显示,也没有错误输出。
在内核为 2.4 的机器上使用 Firefox 3.5,strace -f ./firefox
输出:(仅显示挂起前的最后几行)
[pid 8220] set_thread_area({entry_number:-1 -> -1, base_addr:0x41bef140, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = -1 ENOSYS (Function not implemented)
[pid 8220] modify_ldt(1, {entry_number:0, base_addr:0x41bef140, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, 16) = 0
[pid 8220] munmap(0x40019000, 11144) = 0
[pid 8220] getpid() = 8220
[pid 8220] rt_sigaction(SIGRTMIN, {0x400241e0, [], SA_RESTORER, 0x416f58f8}, NULL, 8) = 0
[pid 8220] rt_sigaction(SIGRT_1, {0x40023cc0, [RTMIN], SA_RESTORER, 0x416f58f8}, NULL, 8) = 0
[pid 8220] rt_sigaction(SIGRT_2, {0x40023500, [], SA_RESTORER, 0x416f58f8}, NULL, 8) = 0
[pid 8220] rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0
[pid 8220] rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 8) = 0
[pid 8220] open("/proc/cpuinfo", O_RDONLY) = 3
[pid 8220] read(3, "processor\t: 0\nvendor_id\t: Genuin"..., 1024) = 422
[pid 8220] read(3, "", 1024) = 0
[pid 8220] close(3) = 0
[pid 8220] readlink("/etc/malloc.conf", 0xbfffe47b, 4096) = -1 ENOENT (No such file or directory)
[pid 8220] rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0
[pid 8220] rt_sigsuspend([]
调用set_thread_area
失败并显示“功能未实现”,而且由于我在 chroot 中运行,因此两个运行环境之间只有内核不同,这让我相信 Firefox 无法在 2.4 内核上运行。但是,Mozilla 列出了运行 Firefox 的一系列要求,而 2.6 内核并不是其中之一。有人能建议一种解决方法来让我运行它吗?
答案1
我首先要尝试在 2.4 内核机器上进行实际编译,这样您的编译器就不会尝试使用 2.6 内核 ABI。如果您能在 2.4 下成功编译,它可能会正常工作。如果不能,则可能存在某个隐藏的依赖关系。
答案2
虽然这个函数确实没有在 2.4 中实现,但它可能不会从 Firefox 本身调用。我猜想,通过运行(在 2.4 中)针对 2.6 编译和链接的二进制文件,您会调用一个不兼容的库。由于 Firefox 是可移植的东西,因此这要么是 ifdef 的,要么是单独库的一部分。
答案3
您是在下载二进制文件,还是从源代码进行编译?对于二进制文件,您确定 glibc 的版本与您安装的版本相匹配吗?
答案4
我对此深表怀疑。从 2.4 到 2.6,甚至从 2.6.20 到 2.6.24 及以上版本,Linux 网络(就内核提供的内容而言)发生了很大变化。不仅仅是细微的变化,整个结构都被重新命名,有些结构完全消失,其他结构的成员也重新排列。
在你可以将它构建出来之前,很可能需要进行大量的调整。