vdso gettimeofday с 64-битным ядром и приложением, скомпилированным для 32-битного

Поддерживается ли vdso для 32-битного приложения, работающего на 64-битном ядре с версией glibc 2.15? Если да, как я могу заставить его работать для 32-битного приложения, работающего на 64-битном ядре? Причина, даже если dlopen на "linux-vdso.so.1" является успешным, dlsym на "__vdso_gettimeofday" завершается ошибкой.

В той же системе я смог создать dlopen для "linux-vdso.so.1" и dlsym для "__vdso_gettimeofday" из приложения, скомпилированного для 64-битной системы.

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, и что ваша версия ядра старше.

Другие вопросы по тегам