9 #include <linux/kernel.h>
15 #include "linux/string.h"
18 #define VDSO__TEMP_FILE_NAME "/tmp/perf-vdso.so-XXXXXX"
23 char temp_file_name
[sizeof(VDSO__TEMP_FILE_NAME
)];
28 struct vdso_file vdso
;
31 static struct vdso_info
*vdso_info__new(void)
33 static const struct vdso_info vdso_info_init
= {
35 .temp_file_name
= VDSO__TEMP_FILE_NAME
,
36 .dso_name
= VDSO__MAP_NAME
,
40 return memdup(&vdso_info_init
, sizeof(vdso_info_init
));
43 static int find_vdso_map(void **start
, void **end
)
49 maps
= fopen("/proc/self/maps", "r");
51 pr_err("vdso: cannot open maps\n");
55 while (!found
&& fgets(line
, sizeof(line
), maps
)) {
58 /* We care only about private r-x mappings. */
59 if (2 != sscanf(line
, "%p-%p r-xp %*x %*x:%*x %*u %n",
65 if (!strncmp(&line
[m
], VDSO__MAP_NAME
,
66 sizeof(VDSO__MAP_NAME
) - 1))
74 static char *get_file(struct vdso_file
*vdso_file
)
83 return vdso_file
->temp_file_name
;
85 if (vdso_file
->error
|| find_vdso_map(&start
, &end
))
90 buf
= memdup(start
, size
);
94 fd
= mkstemp(vdso_file
->temp_file_name
);
98 if (size
== (size_t) write(fd
, buf
, size
))
99 vdso
= vdso_file
->temp_file_name
;
106 vdso_file
->found
= (vdso
!= NULL
);
107 vdso_file
->error
= !vdso_file
->found
;
111 void vdso__exit(struct machine
*machine
)
113 struct vdso_info
*vdso_info
= machine
->vdso_info
;
118 if (vdso_info
->vdso
.found
)
119 unlink(vdso_info
->vdso
.temp_file_name
);
121 zfree(&machine
->vdso_info
);
124 struct dso
*vdso__dso_findnew(struct machine
*machine
)
126 struct vdso_info
*vdso_info
;
129 if (!machine
->vdso_info
)
130 machine
->vdso_info
= vdso_info__new();
132 vdso_info
= machine
->vdso_info
;
136 dso
= dsos__find(&machine
->user_dsos
, VDSO__MAP_NAME
, true);
140 file
= get_file(&vdso_info
->vdso
);
144 dso
= dso__new(VDSO__MAP_NAME
);
146 dsos__add(&machine
->user_dsos
, dso
);
147 dso__set_long_name(dso
, file
, false);
This page took 0.032684 seconds and 5 git commands to generate.