# 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