@@ -107,11 +107,11 @@ int handle_vsyscall(pid_t pid) {
107
107
debug_printf ("vdso address is %p\n" , vdso );
108
108
109
109
if (regs .rip == VSYS_gettimeofday ) {
110
- regs .rip = vdso | VDSO_gettimeofday ;
110
+ regs .rip = vdso + VDSO_gettimeofday ;
111
111
} else if (regs .rip == VSYS_time ) {
112
- regs .rip = vdso | VDSO_time ;
112
+ regs .rip = vdso + VDSO_time ;
113
113
} else if (regs .rip == VSYS_getcpu ) {
114
- regs .rip = vdso | VDSO_getcpu ;
114
+ regs .rip = vdso + VDSO_getcpu ;
115
115
} else {
116
116
debug_printf ("invalid vsyscall %x\n" , regs .rip );
117
117
return 0 ;
@@ -211,9 +211,10 @@ int main(int argc, char *argv[]) {
211
211
/* The vDSO shows up as an object in our address space naemd
212
212
* "linux-vdso.so.1" that's already been loaded. */
213
213
void * vdso = dlopen ("linux-vdso.so.1" , RTLD_LAZY | RTLD_NOLOAD );
214
- VDSO_gettimeofday = (unsigned long )dlsym (vdso , "__vdso_gettimeofday" ) & 0xfff ;
215
- VDSO_time = (unsigned long )dlsym (vdso , "__vdso_time" ) & 0xfff ;
216
- VDSO_getcpu = (unsigned long )dlsym (vdso , "__vdso_getcpu" ) & 0xfff ;
214
+ unsigned long my_vdso_base = vdso_address (getpid ());
215
+ VDSO_gettimeofday = (unsigned long )dlsym (vdso , "__vdso_gettimeofday" ) - my_vdso_base ;
216
+ VDSO_time = (unsigned long )dlsym (vdso , "__vdso_time" ) - my_vdso_base ;
217
+ VDSO_getcpu = (unsigned long )dlsym (vdso , "__vdso_getcpu" ) - my_vdso_base ;
217
218
218
219
while ((pid = waitpid (-1 , & wstatus , 0 )) != -1 ) {
219
220
if (WIFSTOPPED (wstatus )) {
0 commit comments