【问题标题】:vdso gettimeofday with 64 bit kernel & application compiled for 32 bit使用 64 位内核和为 32 位编译的应用程序的 vdso gettimeofday
【发布时间】:2016-12-23 14:20:10
【问题描述】:

在 64 位内核和 glibc 2.15 版上运行的 32 位应用程序是否支持 vdso。如果是,我如何使它适用于在 64 位内核上运行的 32 位应用程序。?因为即使“linux-vdso.so.1”上的 dlopen 成功,“__vdso_gettimeofday”上的 dlsym 也会失败。

在同一系统上,我可以从为 64 位编译的应用程序中对“linux-vdso.so.1”和“__vdso_gettimeofday”进行 dlopen。

【问题讨论】:

  • 后来添加了对 32 位内核的 Vdso 支持。确保您已检查内核版本。
  • @rakib 我的内核是 64 位的,它是 32 位的应用程序。正如我在同一个内核的问题中提到的,为 64 位编译的应用程序似乎支持 vdso。

标签: c linux-kernel glibc gettimeofday vdso


【解决方案1】:

在我的 64 位 Linux 4.4.15 上,32 位 vdso 有这些符号:

readelf -Ws vdso32

Symbol table '.dynsym' contains 9 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 00000ce0     9 FUNC    GLOBAL DEFAULT   12 __kernel_sigreturn@@LINUX_2.5
     2: 00000d00    13 FUNC    GLOBAL DEFAULT   12 __kernel_vsyscall@@LINUX_2.5
     3: 00000ad0   438 FUNC    GLOBAL DEFAULT   12 __vdso_gettimeofday@@LINUX_2.6
     4: 00000c90    42 FUNC    GLOBAL DEFAULT   12 __vdso_time@@LINUX_2.6
     5: 00000770   853 FUNC    GLOBAL DEFAULT   12 __vdso_clock_gettime@@LINUX_2.6
     6: 00000cf0     8 FUNC    GLOBAL DEFAULT   12 __kernel_rt_sigreturn@@LINUX_2.5
     7: 00000000     0 OBJECT  GLOBAL DEFAULT  ABS LINUX_2.5
     8: 00000000     0 OBJECT  GLOBAL DEFAULT  ABS LINUX_2.6

这表明您要查找的 __vdso_gettimeofday 已添加到内核 2.6 中,并且您的内核版本较旧。

【讨论】:

猜你喜欢
  • 2014-04-18
  • 2020-11-25
  • 2012-01-05
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
相关资源
最近更新 更多