gcc - 是否可以关闭 glibc 端的 vdso?

标签 gcc linux-kernel glibc vdso

我知道将 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?

最佳答案

问题已通过 simple patch 解决或here :

Index: work/glibc-2.17/elf/dl-support.c
=====================================================================
--- work.orig/glibc-2.17/elf/dl-support.c
+++ work/glibc-2.17/elf/dl-support.c
@@ -212,16 +212,6 @@ _dl_aux_init (ElfW(auxv_t) *av)
       case AT_HWCAP:
    GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val;
    break;
-#ifdef NEED_DL_SYSINFO
-      case AT_SYSINFO:
-   GL(dl_sysinfo) = av->a_un.a_val;
-   break;
-#endif
-#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
-      case AT_SYSINFO_EHDR:
-   GL(dl_sysinfo_dso) = (void *) av->a_un.a_val;
-   break;
-#endif
       case AT_UID:
    uid ^= av->a_un.a_val;
    seen |= 1;
Index: work/glibc-2.17/elf/setup-vdso.h
=====================================================================
--- work.orig/glibc-2.17/elf/setup-vdso.h
+++ work/glibc-2.17/elf/setup-vdso.h
@@ -20,7 +20,7 @@ static inline void __attribute__ ((alway
 setup_vdso (struct link_map *main_map __attribute__ ((unused)),
        struct link_map ***first_preload __attribute__ ((unused)))
 {
-#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
+#if 0
   if (GLRO(dl_sysinfo_dso) == NULL)
     return;
 

关于gcc - 是否可以关闭 glibc 端的 vdso?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406389/

相关文章:

macos - OSX 上的 LD_PRELOAD 的确切等效项是什么?

c++ - 未创建目标文件

linux - NASM中的printf最简单的工作示例失败

c - 如何在 makefile 中包含 *.so 文件

linux - kmalloc 中 GFP_USER 标志的用途是什么?

c++ - *** 检测到 glibc *** free() : invalid pointer:

c++ - 如何抑制多个警告但不是所有警告都来自库?

c++ - 符号查找错误 : undefined symbol: _alloca

linux-kernel - ARMv8 AARCH64 指令中止处理程序?

linux - 使用 Linux 可加载内核模块拦截系统调用(劫持)