From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755528AbcBCCRh (ORCPT ); Tue, 2 Feb 2016 21:17:37 -0500 Received: from szxga03-in.huawei.com ([119.145.14.66]:11610 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755125AbcBCCRg (ORCPT ); Tue, 2 Feb 2016 21:17:36 -0500 Subject: Re: [PATCH 2/2] perf tools: Adjust symbol for shared objects To: Namhyung Kim References: <1454403366-27055-1-git-send-email-wangnan0@huawei.com> <1454403366-27055-3-git-send-email-wangnan0@huawei.com> <20160202151814.GD4627@danjae.kornet> CC: , , , , , , Arnaldo Carvalho de Melo , Jiri Olsa , Masami Hiramatsu , Li Zefan , From: "Wangnan (F)" Message-ID: <56B1621B.9070100@huawei.com> Date: Wed, 3 Feb 2016 10:12:43 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 MIME-Version: 1.0 In-Reply-To: <20160202151814.GD4627@danjae.kornet> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.111.66.109] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.56B1622C.0048,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2013-05-26 15:14:31, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: efeba69b509cb5d563d45e7df8d9e40b Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2016/2/2 23:18, Namhyung Kim wrote: > 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/ ? Thank you. Have you really tested this program? >> 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.. OK. Let's make adjust_symbols the default choice. Thank you. > Thanks, > Namhyung > > >> dso__is_vdso(dso) || >> elf_section_by_name(elf, &ehdr, &shdr, >> ".gnu.prelink_undo", >> -- >> 1.8.3.4 >>