我知道将vdso = 0传递给内核可以关闭此功能,并且glibc中的动态链接器可以自动检测并使用内核中的vdso功能。
我在这里遇到了这个问题。在我的机构中有一个RHEL 5.6框(内核2.6.18-238.el5),我只有正常的用户访问权限,可能患有RHEL bug 673616。
当我在其上编译linux-headers-3.9 / gcc-4.7.2 / glibc-2.17 / binutils-2.23的工具链时,gcc bootstrap在stage2中的cc1失败无法运行
Program received signal SIGSEGV, Segmentation fault.
0x00002aaaaaaca6eb in ?? ()
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00002aaaaaaabba0 0x00002aaaaaac3249 Yes (*) /home/benda/gnto/lib64/ld-linux-x86-64.so.2
0x00002aaaaacd29b0 0x00002aaaaace2480 Yes (*) /home/benda/gnto/usr/lib/libmpc.so.3
0x00002aaaaaef2cd0 0x00002aaaaaf36c08 Yes (*) /home/benda/gnto/usr/lib/libmpfr.so.4
0x00002aaaab14f280 0x00002aaaab19b658 Yes (*) /home/benda/gnto/usr/lib/libgmp.so.10
0x00002aaaab3b3060 0x00002aaaab3b3b50 Yes (*) /home/benda/gnto/lib/libdl.so.2
0x00002aaaab5b87b0 0x00002aaaab5c4bb0 Yes (*) /home/benda/gnto/usr/lib/libz.so.1
0x00002aaaab7d0e70 0x00002aaaab80f62c Yes (*) /home/benda/gnto/lib/libm.so.6
0x00002aaaaba70d40 0x00002aaaabb81aec Yes (*) /home/benda/gnto/lib/libc.so.6
(*): Shared library is missing debugging information.
和一个简单的程序
#include <sys/time.h>
#include <stdio.h>
int main () {
struct timeval tim;
gettimeofday(&tim, NULL);
return 0;
}
如果从stage1编译glibc-2.17和xgcc,则以相同的方式获取段错误。
cc1和测试程序都可以在另一个运行RHEL 5.5(内核2.6.18-194.26.1.el5)上运行,gcc-4.7.2 / glibc-2.17 / binutils-2.23作为普通用户。
我不能简单地将盒子升级到较新的RHEL版本,也不能通过sysctl或proc关闭VDSO。问题是,有没有办法编译glibc,以便无条件关闭VDSO?