trace-irelative.exp revision ce011e2111524f8cc5e246f2bcfa9eb20984d4bf
1# This file is part of ltrace.
2# Copyright (C) 2013 Petr Machata, Red Hat Inc.
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License as
6# published by the Free Software Foundation; either version 2 of the
7# License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful, but
10# WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12# General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
17# 02110-1301 USA
18
19proc do_tests {bin appendage} {
20    ltraceMatch1 [ltraceRun -e xyz -- $bin] {xyz\(} == 2
21
22    # If the actual entry point that xyz resolves to is not traced, it
23    # should get xyz's name.  But we don't mind if somebody implements
24    # the late lookup and actually names the symbol properly.
25
26    set log [ltraceRun -L -x xyz -- $bin]
27    ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
28    ltraceMatch1 $log [format {(xyz|abc)%s\(} $appendage] == 2
29
30    # If we request abc's tracing explicitly, than it definitely needs
31    # to be presented as abc, not as xyz.
32
33    set log [ltraceRun -L -x xyz+abc -- $bin]
34    ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
35    ltraceMatch1 $log [format {abc%s\(} $appendage] == 2
36}
37
38set src [ltraceSource c {
39    int abc (int a) { return a + 1; }
40
41    __asm__(".type xyz, \%gnu_indirect_function");
42
43    int xyz (int a);
44    extern void *xyz_ifunc(void) __asm__("xyz");
45    extern void *xyz_ifunc(void) {
46	return &abc;
47    }
48
49    int
50    main(int argc, char *argv[])
51    {
52      return xyz (xyz (argc));
53    }
54}]
55
56set bin1 [ltraceCompile {} $src]
57
58do_tests $bin1 ""
59
60set lib [ltraceCompile lib.so $src]
61set bin2 [ltraceCompile {} $lib [ltraceSource c {/* Empty.  */}]]
62
63do_tests $bin2 @lib.so
64
65ltraceDone
66