When a function is inlined, the corresponding calls to __cyg_profile_func_{enter,exit} are passed the address of caller.
Below is an example. Addresses shown in "Enter"/"Exit" messages all point to main(). If you add -fno-inline-functions, then this problem goes away. ----- Makefile ------ CC=gcc-4.0.1 all: blah.o lib.o $(CC) -o a.out $^ blah.o: blah.c $(CC) -O3 -finstrument-functions -c $^ lib.o: lib.c $(CC) -O3 -c $^ ------ blah.c ------- #include <stdio.h> int Foo() { return 900; } int Bar() { return Foo() + 10; } int main() { printf("Value is %d\n", Bar()); } ------ lib.c -------- #include <stdio.h> __cyg_profile_func_enter(void *this_fn, void *call_site) { printf("Enter %p\n", this_fn); } __cyg_profile_func_exit(void *this_fn, void *call_site) { printf("Exit %p\n", this_fn); } -- Summary: -finstrument-functions + -finline-functions produces incorrect output. Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yasushi dot saito at gmail dot com CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23629