68 lines
2.1 KiB
Text
68 lines
2.1 KiB
Text
# This file is part of ltrace.
|
|
# Copyright (C) 2013 Petr Machata, Red Hat Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation; either version 2 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
# 02110-1301 USA
|
|
|
|
proc do_tests {bin appendage} {
|
|
ltraceMatch1 [ltraceRun -e *xyz -- $bin] {xyz\(} == 2
|
|
|
|
# If the actual entry point that xyz resolves to is not traced, it
|
|
# should get xyz's name. But we don't mind if somebody implements
|
|
# the late lookup and actually names the symbol properly.
|
|
|
|
set log [ltraceRun -L -x xyz -- $bin]
|
|
ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
|
|
ltraceMatch1 $log [format {(xyz|abc)%s\(} $appendage] == 2
|
|
|
|
# If we request abc's tracing explicitly, than it definitely needs
|
|
# to be presented as abc, not as xyz.
|
|
|
|
set log [ltraceRun -L -x xyz+abc -- $bin]
|
|
ltraceMatch1 $log [format {xyz\.IFUNC%s\(\)} $appendage] == 1
|
|
ltraceMatch1 $log [format {abc%s\(} $appendage] == 2
|
|
}
|
|
|
|
set src [ltraceSource c {
|
|
int abc (int a) { return a + 1; }
|
|
|
|
__asm__(".type xyz, \%gnu_indirect_function");
|
|
|
|
int xyz (int a);
|
|
extern void *xyz_ifunc(void) __asm__("xyz");
|
|
extern void *xyz_ifunc(void) {
|
|
return &abc;
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
return xyz (xyz (argc));
|
|
}
|
|
}]
|
|
|
|
foreach ext {{} .pie} {
|
|
set bin1 [ltraceCompile $ext $src]
|
|
do_tests $bin1 ""
|
|
}
|
|
|
|
set lib [ltraceCompile lib.so $src]
|
|
|
|
foreach ext {{} .pie} {
|
|
set bin2 [ltraceCompile $ext $lib [ltraceSource c {/* Empty. */}]]
|
|
do_tests $bin2 @lib.so
|
|
}
|
|
|
|
ltraceDone
|