hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/bin/sh
# build id cache operations
# SPDX-License-Identifier: GPL-2.0
 
# skip if there's no readelf
if ! [ -x "$(command -v readelf)" ]; then
   echo "failed: no readelf, install binutils"
   exit 2
fi
 
# skip if there's no compiler
if ! [ -x "$(command -v cc)" ]; then
   echo "failed: no compiler, install gcc"
   exit 2
fi
 
ex_md5=$(mktemp /tmp/perf.ex.MD5.XXX)
ex_sha1=$(mktemp /tmp/perf.ex.SHA1.XXX)
 
echo 'int main(void) { return 0; }' | cc -Wl,--build-id=sha1 -o ${ex_sha1} -x c -
echo 'int main(void) { return 0; }' | cc -Wl,--build-id=md5 -o ${ex_md5} -x c -
 
echo "test binaries: ${ex_sha1} ${ex_md5}"
 
check()
{
   id=`readelf -n ${1} 2>/dev/null | grep 'Build ID' | awk '{print $3}'`
 
   echo "build id: ${id}"
 
   link=${build_id_dir}/.build-id/${id:0:2}/${id:2}
   echo "link: ${link}"
 
   if [ ! -h $link ]; then
       echo "failed: link ${link} does not exist"
       exit 1
   fi
 
   file=${build_id_dir}/.build-id/${id:0:2}/`readlink ${link}`/elf
   echo "file: ${file}"
 
   if [ ! -x $file ]; then
       echo "failed: file ${file} does not exist"
       exit 1
   fi
 
   diff ${file} ${1}
   if [ $? -ne 0 ]; then
       echo "failed: ${file} do not match"
       exit 1
   fi
 
   echo "OK for ${1}"
}
 
test_add()
{
   build_id_dir=$(mktemp -d /tmp/perf.debug.XXX)
   perf="perf --buildid-dir ${build_id_dir}"
 
   ${perf} buildid-cache -v -a ${1}
   if [ $? -ne 0 ]; then
       echo "failed: add ${1} to build id cache"
       exit 1
   fi
 
   check ${1}
 
   rm -rf ${build_id_dir}
}
 
test_record()
{
   data=$(mktemp /tmp/perf.data.XXX)
   build_id_dir=$(mktemp -d /tmp/perf.debug.XXX)
   perf="perf --buildid-dir ${build_id_dir}"
 
   ${perf} record --buildid-all -o ${data} ${1}
   if [ $? -ne 0 ]; then
       echo "failed: record ${1}"
       exit 1
   fi
 
   check ${1}
 
   rm -rf ${build_id_dir}
   rm -rf ${data}
}
 
# add binaries manual via perf buildid-cache -a
test_add ${ex_sha1}
test_add ${ex_md5}
 
# add binaries via perf record post processing
test_record ${ex_sha1}
test_record ${ex_md5}
 
# cleanup
rm ${ex_sha1} ${ex_md5}
 
exit ${err}