Skip to content

Commit c1f5440

Browse files
committed
vsyscall_emu: Handle the vDSO correctly
It can be more than one page.
1 parent 10936eb commit c1f5440

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

docker/vsyscall_emu/vsyscall_trace.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ int handle_vsyscall(pid_t pid) {
107107
debug_printf("vdso address is %p\n", vdso);
108108

109109
if (regs.rip == VSYS_gettimeofday) {
110-
regs.rip = vdso | VDSO_gettimeofday;
110+
regs.rip = vdso + VDSO_gettimeofday;
111111
} else if (regs.rip == VSYS_time) {
112-
regs.rip = vdso | VDSO_time;
112+
regs.rip = vdso + VDSO_time;
113113
} else if (regs.rip == VSYS_getcpu) {
114-
regs.rip = vdso | VDSO_getcpu;
114+
regs.rip = vdso + VDSO_getcpu;
115115
} else {
116116
debug_printf("invalid vsyscall %x\n", regs.rip);
117117
return 0;
@@ -211,9 +211,10 @@ int main(int argc, char *argv[]) {
211211
/* The vDSO shows up as an object in our address space naemd
212212
* "linux-vdso.so.1" that's already been loaded. */
213213
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;
217218

218219
while ((pid = waitpid(-1, &wstatus, 0)) != -1) {
219220
if (WIFSTOPPED(wstatus)) {

0 commit comments

Comments
 (0)