From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933027AbcBBPTY (ORCPT ); Tue, 2 Feb 2016 10:19:24 -0500 Received: from mail-pa0-f65.google.com ([209.85.220.65]:32808 "EHLO mail-pa0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932505AbcBBPTW (ORCPT ); Tue, 2 Feb 2016 10:19:22 -0500 Date: Wed, 3 Feb 2016 00:18:14 +0900 From: Namhyung Kim To: Wang Nan Cc: acme@kernel.org, adrian.hunter@intel.com, dev@codyps.com, hekuang@huawei.com, kirr@nexedi.com, linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo , Jiri Olsa , Masami Hiramatsu , Li Zefan , pi3orama@163.com Subject: Re: [PATCH 2/2] perf tools: Adjust symbol for shared objects Message-ID: <20160202151814.GD4627@danjae.kornet> References: <1454403366-27055-1-git-send-email-wangnan0@huawei.com> <1454403366-27055-3-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1454403366-27055-3-git-send-email-wangnan0@huawei.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Feb 02, 2016 at 08:56:06AM +0000, Wang Nan wrote: > He Kuang reported a problem that perf fails to get correct symbol on > Android platform in [1]. The problem can be reproduced on normal x86_64 > platform. I will describe the reproducing steps in detail at the end of > commit message. > > The reason of this problem is the missing of symbol adjustment for normal > shared objects. In most of the cases it works correctly, but when > '.text' section have different 'address' and 'offset' the result is > wrong. I checked all shared objects in my working platform, only wine > dll objects and debug objects (in .debug) have this problem. However, > it is common on Android. For example: > > $ readelf -S ./libsurfaceflinger.so | grep \.text > [10] .text PROGBITS 0000000000029030 00012030 > > This patch enables symbol adjustment for dynamic objects so the symbol > address got from elfutils would be adjusted correctly. > > Steps to reproduce the problem: > > $ cat << EOF > ./Makefile > PWD := $(shell pwd) > LDFLAGS += "-Wl,-rpath=$(PWD)" > CFLAGS += -g > main: main.c libbuggy.so > libbuggy.so: buggy.c > gcc -g -shared -fPIC -Wl,-Ttext-segment=0x200000 $< -o $@ > clean: > rm -rf main libbuggy.so *.o > EOF > > $ cat << EOF > ./buggy.c > int fib(int x) > { > return (x == 0) ? 1 : (x == 1) ? 1 : fib(x - 1) + fib(x - 2); > } > EOF > > $ cat << EOF > ./main.c > #include > > extern int fix(int x); s/fix/fib/ ? > int main() > { > int i; > > for (i = 0; i < 40; i++) > printf("%d\n", fib(i)); > return 0; > } > EOF > > $ make > $ perf record ./main > ... > $ perf report --stdio > # Overhead Command Shared Object Symbol > # ........ ....... ................. ............................... > # > 14.97% main libbuggy.so [.] 0x000000000000066c > 8.68% main libbuggy.so [.] 0x00000000000006aa > 8.52% main libbuggy.so [.] fib@plt > 7.95% main libbuggy.so [.] 0x0000000000000664 > 5.94% main libbuggy.so [.] 0x00000000000006a9 > 5.35% main libbuggy.so [.] 0x0000000000000678 > ... > > The correct result should be (after this patch): > > # Overhead Command Shared Object Symbol > # ........ ....... ................. ............................... > # > 91.47% main libbuggy.so [.] fib > 8.52% main libbuggy.so [.] fib@plt > 0.00% main [kernel.kallsyms] [k] kmem_cache_free > > [1] http://lkml.kernel.org/g/1452567507-54013-1-git-send-email-hekuang@huawei.com > > Signed-off-by: Wang Nan > Cc: Adrian Hunter > Cc: Arnaldo Carvalho de Melo > Cc: Cody P Schafer > Cc: He Kuang > Cc: Jiri Olsa > Cc: Kirill Smelkov > Cc: Masami Hiramatsu > Cc: Namhyung Kim > Cc: Li Zefan > Cc: pi3orama@163.com > --- > tools/perf/util/symbol-elf.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c > index 5227186..d4e59dd 100644 > --- a/tools/perf/util/symbol-elf.c > +++ b/tools/perf/util/symbol-elf.c > @@ -712,6 +712,7 @@ int symsrc__init(struct symsrc *ss, struct dso *dso, const char *name, > GElf_Shdr shdr; > ss->adjust_symbols = (ehdr.e_type == ET_EXEC || > ehdr.e_type == ET_REL || > + ehdr.e_type == ET_DYN || It seems there's no need to check the e_type anymore.. Thanks, Namhyung > dso__is_vdso(dso) || > elf_section_by_name(elf, &ehdr, &shdr, > ".gnu.prelink_undo", > -- > 1.8.3.4 >