From patchwork Thu Sep 21 03:13:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Mezentsev X-Patchwork-Id: 76484 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 68EDD3857C44 for ; Thu, 21 Sep 2023 03:14:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 68EDD3857C44 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1695266077; bh=8DdbdceXKKSCYAox3rdRSBlXx7cA20E3CDwEFkLj3Nc=; h=To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=X+tZ7Iv7pLLQgdk0oSCNiPQh1elZFWuQNC4toO2QFvapnkl9XBwYQCUoL/rItwY3r /2qJljaTiRrRo2FlbIo9WqyfMvHbStLGqvnXw0Pnmk5orYyCqsAPQtc47q0Tr6AUN8 OKRU1R04u1OrXnn9FrgsC1Bml0ZjF3T3DNJN6hMs= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 07E933858C54 for ; Thu, 21 Sep 2023 03:14:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 07E933858C54 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38KKJ7RT019106 for ; Thu, 21 Sep 2023 03:14:06 GMT Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3t52se0q9h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 21 Sep 2023 03:14:06 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 38L3BHgG030071 for ; Thu, 21 Sep 2023 03:14:05 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2048.outbound.protection.outlook.com [104.47.66.48]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3t52t7xbna-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 21 Sep 2023 03:14:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Vl2uqD4BsU0k6Q735u54nIbrF0e7sM9UNXgetW1/m+hGpu7scPTZDpzz/lNPVfgs+eWg8WzW9UvMiLBQX/6ofZGDd8ocQ7oKF2at99o/aRJ4+j2G1dtMAPDzQM+C2KusUywUvqj+Hgxg+HquTMJx4gZjw3MNf72w3N2AnmGi4GNrk181p77CIeY7ttoRiifwwkSbwepE8pvKsmxDkjLCWe/ousKVBvOvALOq4OFWrxDaRFKxgeDppAL1fqxS3EA/c/8DGHKa9QzaX4nAg7iFPIsah6eOPEyQe73JxCp9qh687/WJQULiMQhDCHZ/CfIrjB9Et6/oSs3oxGL3v4sKqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8DdbdceXKKSCYAox3rdRSBlXx7cA20E3CDwEFkLj3Nc=; b=iSHLEPqonCsTgpi+FaMNO4+YryIuBgY10abhjust7EJI5gy97AZHzn1Cibf9JZHGebnSjAD1O73PGValJS9FpJnMTyBsapA915MPaaEhy7SXCLsRUZWzlBjESe7jZk0u6g2YO1V+3Meg9/1K45O7JVrkJ+GTvA8NrsLXY+b/DF8NsZVVEJqqBXBji5w/gdhrBxJXXy1EipUYzNcJdDLBogj8GEZ3D7MB4OIQqnwtewstMqMP7KjsOYfsuZXeufuVF/EJWdJzkYm5H3m3I35XwYqBbLbXlce/Sccl+r2TGzSiGsqKvV84F6DOBm7ywW/uEAPVPX2yaloKF1giJbVCRQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from SA2PR10MB4636.namprd10.prod.outlook.com (2603:10b6:806:11e::10) by DM4PR10MB6205.namprd10.prod.outlook.com (2603:10b6:8:88::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.28; Thu, 21 Sep 2023 03:13:55 +0000 Received: from SA2PR10MB4636.namprd10.prod.outlook.com ([fe80::10b3:cd52:5c1e:146e]) by SA2PR10MB4636.namprd10.prod.outlook.com ([fe80::10b3:cd52:5c1e:146e%6]) with mapi id 15.20.6792.026; Thu, 21 Sep 2023 03:13:54 +0000 To: binutils@sourceware.org Cc: Vladimir Mezentsev Subject: [PATCH] gprofng: 30834 improve disassembly output for call and branch instructions Date: Wed, 20 Sep 2023 20:13:48 -0700 Message-Id: <20230921031348.291150-1-vladimir.mezentsev@oracle.com> X-Mailer: git-send-email 2.31.1 X-ClientProxiedBy: BY5PR17CA0047.namprd17.prod.outlook.com (2603:10b6:a03:167::24) To SA2PR10MB4636.namprd10.prod.outlook.com (2603:10b6:806:11e::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PR10MB4636:EE_|DM4PR10MB6205:EE_ X-MS-Office365-Filtering-Correlation-Id: 30847391-3214-4351-273e-08dbba50c97b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: x4W5Rhk1ppYDWtEK40DEHhfW6zM1sBKFbM05N0665P6UEe2vMOdWCLWs6vGsHT8heYiQibm5Rhts7isyfPMh6QmaA1Ndh5mJVJRt2j5vLBxIOpZ6SIjBMFxYGY+2dJbO8d41RPjREkBN9cT+XFUb1tKGtOhrSwChiVV1BQPpcxG4DNqHDA0CuugKdSRvNilg53a38pUvYv6z5ZNTT5X0wBMmnJadYrXOVBUNNA5hGYAZEa8/PmYBHY85KEW6tWd8uhi4AwDXzGxFxyDdjPf2z7gJlIkCYztrULUVBXIKv4srb06wd1iHFXFoWSnD35E3a72EPvvcx901D8vFMwae4rQ7VUPDSnjE/i1VzqNtG1+C0wgzJgs7rQpe8/uX1irHdwIKX8EQjIbs1sAI7jVJxXIvmUlkf50zLGqQxvp4eMLP9yO4Izdz6LmhH3wKyK+oLtpKbfCGVZKJsKHh2zZH5c4vIMAGoZisfqEVd7QhIsNnH/GLJi7GrvGyoXjbZNUoy3HvbCbTuOkQWhnQJ3607hTF17rlOmao7D03MNp5YSsbR2mtUkhI2/NP7G66OfIO X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SA2PR10MB4636.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(346002)(396003)(376002)(366004)(39860400002)(136003)(186009)(1800799009)(451199024)(38100700002)(6506007)(6666004)(6486002)(478600001)(36756003)(9686003)(1076003)(8936002)(86362001)(2906002)(5660300002)(107886003)(6512007)(83380400001)(30864003)(41300700001)(6916009)(4326008)(66946007)(8676002)(316002)(66556008)(66476007)(2616005); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ga1FTABZvsfJQjtRau0TiT7RqPSFnT5pjYnTFYUdOG+1l8beV1y2cppS3cace6Zg8OWpqyZ2yqq77zfo5IJcjz3QKHNc8MhNBZSyPQvsqnmQ4OWwngQNjhrMRmJYEyRhIbO/F7fJxHljmlZQz4WvQBJbBOFlv4t6Ax5+nRPkHxIy1SIgIfiizrhMach7pVMh4qIM1KEUsqGexktRXAf0BC7164VekDOfITX47mZCQAMm434MD9CNsoqY9ATNiCw7UqddF+X1IqlpzlVUj1gAV2hc1g9cq6NskJvQSFsh7AG0AIW/h6H/SbIKeHc1UNrcaK4UvtqfLMyL0dbusfUNr0RBrt4MAvo/SnbqcLbMgEUjIHnh0W2T1oMmgD/CKnGsia6UV6iEjc4oyvsSNBx+4f54ZEjxqma+uHQBKqqzV246Ij5r8pMJjhOeMwcojq34pvI0Q2pPGViRoH6McLdXrqGE/vqHV5GuI9rarBwFozg84t59Z9tRtnz/iAeXHNS5QUl6PbWQVZtsHSiVeGYJm6UrB+fa0kMHeRexQFCP6ctUbtNDVA7Gh3DRmQ8vOOW7vh9lh9Kv8EFZGkOVD5X4QJiBjpSuKgg5Lj+Bm7YlcUDpOttkTM2tJRP5Fy3LWhSF90KbQJx0AAQoOqJVRjTIYlxJjs6CZHOaPmMPgMyBrK9I4GKKzknOu76tZ7ZvQZSxg6gQNCPDV88iaR51i3awlauzj3y27DR9WiNtHgNoUvZsLe127yoPHvLtUa6nF0bxHWJsqYc/pKeknn2gWt0YfK0drQcjdIJhuLRND3yhvxV/MX5CLPQRRBf1h3OyZ2O2nvwbEdGyAxN4w58Fwuu+dpUbYsfE5Pj7hnSi8gKZtgC1y1lYroZXdvdn3DqhsXspA1HtYtQai43sRzyUVUVG7ehg2g95mwWJsIAgaKfhAja9k+0KAC0dKusu2sBqUWO1eheRWnd943ZK2Rtx1xxRM4nCmY1qb6ZQ15El0pt5CY9vGGDTBAbwN5XmylSj8QfD+aUJj0NzyG8GdiZpYMYHrx0LIhTRooLdZZ/rWFqKhvW36iaK7C3Z5n+u3LhNM9KnQCjR/vpBdgszIRn80DB/sRYsQnH0I6N3oYN00vUclMheggdvMaKKyKcVfzhNsoDCB8QSf3yXSoNK+72sLt6cqiZzNSf1Rd9ll2e0RW0inkyR0DUJf+qUo8wZtwG3X8NPLPIWMz1CSu/EUQIxOqJAGdrFEYyTc4YsmYbnyCvtb4gqjBfNOJ1NyIvkNSm28/m3PohBB7PDZbC9sGZMEizpKUpmIvQCcAjwj0v6bsCjleoRDRLvUGzSh7v4u1/oKp+SCfrTYmdi1jmkfIX7FNMgHOM8rWZxrcojHfYOTy+o0Dcds2+rok/ctg/kXcfh2cQYkvAlgk9O792N2M5EMn32NpZn84z+CRKEvI/AYwwxmngv9+AcJSZLpBpSg0tpen3Xa852bpy9F8UPh4C5sDysaV8oa+JAQkNW/MP++EFlIIv+qWbhfKPyRcv+Dv2M3vMI1MyPT9QM7VtHOnSmWsODh9O2vPF6v7A1S+ys8VyWbO1VsrvwZCS73oh0FQWOjP1daMoofIrqRPdWWUxlhs6CcFVIdl1CSUQBpbLyOzRz4FY= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: WgSBBDLuGc48lALI4NXSAZMu2VAVKL8WNCOBq1DaM8eESPjNr7kH0r1ZmvSXXZgClMsAtH8lHPlFwv8a3vyM73H7J8ODkttFy7IRtsedbq3tLd1d1k3YFbkndk2e0PUkxoGBKsOuPxTBVST6lX86mw0hUqMean0RccGtOB/CltoAt7wqKy4PrxmNRnklftsstVqNAfbRy8ywqXKYgKYhOI5nKdQPquzgTX7g3SgcIGhLerI3z+6Wmv0EuFNBveg0JXBTzK1EomAvZQDZ5j/+Wla5HX3So1LaVjhzB038Txd+/j2kizjtSE12LfOHbLPv+LpPJr7PXP9HcZ/gON/7G/eS8QWU+LUWB6Ndh9NjIifB5dorlavZF3fkZaEMgfRzpUo9vmtzHAyau+8VAyi+Nb6tsTYQgvvob64NxSitmi/BoQ4A1Lxkg2WFMS/EuuB365afaWbPLMPm3+kYn88QQlReJLq9IbxrMKu0NYplvdfXEHJyEFHIgPS9FyQ1eBNHfkxgl9QIVWoMMgSHsLhdckZORFkE/I2tAd75buEzfOXNnHN/y7ntCBcNBHQQ84wQqloqNV2cAuec6PJfMrB6i+1n1k8/U9V4wuoQDkaPLNIGhC8gY8ua5A6yI2mMYqsoW6JBZd24OSl4E3kp9z84rCjGTUdQuaf5nLeN3IT+zNbKvYrfqmH+nMY6J0DkMaewxT597reR6UZdL/lIgO9h6mwOOslyIlQ7I74hwPaFNWIut07BIhvc3Xe73cm4f0/7 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 30847391-3214-4351-273e-08dbba50c97b X-MS-Exchange-CrossTenant-AuthSource: SA2PR10MB4636.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Sep 2023 03:13:54.5794 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PxXHJoSdB9ucmSf6X+Xky1iowCwMRyPvnYuwbXvwyfKzgHuz+s8Ygds79lolabhrGnh1vU200dt1GE1bEtHaxtb9RJip4CsbGC8lQWfONCs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR10MB6205 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.601,FMLib:17.11.176.26 definitions=2023-09-20_14,2023-09-20_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 adultscore=0 phishscore=0 malwarescore=0 suspectscore=0 spamscore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2308100000 definitions=main-2309210026 X-Proofpoint-GUID: OrdPsa8HK5ObKeA19GA7ndocAAxdyMlX X-Proofpoint-ORIG-GUID: OrdPsa8HK5ObKeA19GA7ndocAAxdyMlX X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Vladimir Mezentsev via Binutils From: Vladimir Mezentsev Reply-To: vladimir.mezentsev@oracle.com Errors-To: binutils-bounces+patchwork=sourceware.org@sourceware.org Sender: "Binutils" From: Vladimir Mezentsev This patch makes the gprofng disassembler to emit, e.g. call fprintf@plt [ 0x401060, .-0x49c] instead of call 0xfffffffffffffb64 I use bfd_get_synthetic_symtab() to get function names in the .plt section. I have not yet modified Elf-reader in gprofng to remove parsing of .symtab or .dynsym sections. But we plan to do it. gprofng/ChangeLog 2023-09-20 Vladimir Mezentsev PR gprofng/30834 * src/Disasm.cc: Show the function name in the call instruction and the relative address in the branch instruction. Remove unused code. * src/Disasm.h (map_PC_to_func, get_funcname_in_plt): New functions. * src/Elf.cc: Get function names for the .plt section. * src/Elf.h (get_funcname_in_plt, get_bfd_symbols): New functions. * src/Stabs.cc: Add pltSym to SymLst. Remove the conversion to uint32_t. --- gprofng/src/Disasm.cc | 158 ++++++++++++++++-------------------------- gprofng/src/Disasm.h | 3 + gprofng/src/Elf.cc | 94 +++++++++++++++++++++++++ gprofng/src/Elf.h | 9 +++ gprofng/src/Stabs.cc | 42 +++++------ 5 files changed, 185 insertions(+), 121 deletions(-) diff --git a/gprofng/src/Disasm.cc b/gprofng/src/Disasm.cc index ef1ef7c9d9f..9c7e59a590b 100644 --- a/gprofng/src/Disasm.cc +++ b/gprofng/src/Disasm.cc @@ -34,6 +34,7 @@ #include "i18n.h" #include "util.h" #include "StringBuilder.h" +#include "Function.h" struct DisContext { @@ -126,7 +127,49 @@ read_memory_func (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, static void print_address_func (bfd_vma addr, disassemble_info *info) { - (*info->fprintf_func) (info->stream, "0x%llx", (unsigned long long) addr); + bfd_signed_vma off; + unsigned long long ta; + Disasm *dis; + switch (info->insn_type) + { + case dis_branch: + case dis_condbranch: + off = (bfd_signed_vma) addr; + dis = (Disasm *) info->stream; + ta = dis->inst_addr + off; + (*info->fprintf_func) (info->stream, ".%c0x%llx [ 0x%llx ]", + off > 0 ? '+' : '-', (long long) (off > 0 ? off : -off), ta); + return; + case dis_jsr: + off = (bfd_signed_vma) addr; + dis = (Disasm *) info->stream; + ta = dis->inst_addr + off; + const char *nm = NULL; + Function *f = dis->map_PC_to_func (ta); + if (f) + { + if (dis->inst_addr >= f->img_offset + && dis->inst_addr < f->img_offset + f->size) + { // Same function + (*info->fprintf_func) (info->stream, ".%c0x%llx [ 0x%llx ]", + off > 0 ? '+' : '-', (long long) (off > 0 ? off : -off), ta); + return; + } + if (f->flags & FUNC_FLAG_PLT) + nm = dis->get_funcname_in_plt(ta); + if (nm == NULL) + nm = f->get_name (); + } + if (nm) + (*info->fprintf_func) (info->stream, "%s [ 0x%llx, .%c0x%llx]", + nm, ta, off > 0 ? '+' : '-', (long long) (off > 0 ? off : -off)); + else + (*info->fprintf_func) (info->stream, + ".%c0x%llx [ 0x%llx ] // Unable to determine target symbol", + off > 0 ? '+' : '-', (long long) (off > 0 ? off : -off), ta); + return; + } + (*info->fprintf_func) (info->stream, "0x%llx", (long long) addr); } static asymbol * @@ -247,35 +290,6 @@ Disasm::remove_disasm_hndl (void *hndl) delete ctx; } -#if 0 -int -Disasm::get_instr_size (uint64_t vaddr, void *hndl) -{ - DisContext *ctx = (DisContext *) hndl; - if (ctx == NULL || vaddr < ctx->first_pc || vaddr >= ctx->last_pc) - return -1; - ctx->pc = vaddr; - size_t sz = ctx->is_Intel ? sizeof (ctx->codeptr) : 4; - if (sz > ctx->last_pc - vaddr) - sz = (size_t) (ctx->last_pc - vaddr); - if (ctx->elf->get_data (ctx->f_offset + (vaddr - ctx->first_pc), - sz, ctx->codeptr) == NULL) - return -1; - - char buf[MAX_DISASM_STR]; - *buf = 0; - uint64_t inst_vaddr = vaddr; -#if MEZ_NEED_TO_FIX - size_t instrs_cnt = 0; - disasm_err_code_t status = disasm (handle, &inst_vaddr, ctx->last_pc, 1, - ctx, buf, sizeof (buf), &instrs_cnt); - if (instrs_cnt != 1 || status != disasm_err_ok) - return -1; -#endif - return (int) (inst_vaddr - vaddr); -} -#endif - void Disasm::set_addr_end (uint64_t end_address) { @@ -312,6 +326,7 @@ Disasm::get_disasm (uint64_t inst_address, uint64_t end_address, printf ("ERROR: unsupported disassemble\n"); return NULL; } + inst_addr = inst_address; inst_size = disassemble (0, &dis_info); if (inst_size <= 0) { @@ -337,83 +352,26 @@ Disasm::get_disasm (uint64_t inst_address, uint64_t end_address, sb.appendf (fmt, bytes); } sb.append (dis_str); -#if MEZ_NEED_TO_FIX - // Write instruction - if (ctx.is_Intel) // longest instruction length for Intel is 7 - sb.appendf (NTXT ("%-7s %s"), parts_array[1], parts_array[2]); - else // longest instruction length for SPARC is 11 - sb.appendf (NTXT ("%-11s %s"), parts_array[1], parts_array[2]); - if (strcmp (parts_array[1], NTXT ("call")) == 0) - { - if (strncmp (parts_array[2], NTXT ("0x"), 2) == 0) - sb.append (GTXT ("\t! (Unable to determine target symbol)")); - } -#endif return sb.toString (); } -#if MEZ_NEED_TO_FIX -void * -Disasm::get_inst_ptr (disasm_handle_t, uint64_t vaddr, void *pass_through) +Function * +Disasm::map_PC_to_func (uint64_t pc) { - // Actually it fetches only one instruction at a time for sparc, - // and one byte at a time for intel. - DisContext *ctx = (DisContext*) pass_through; - size_t sz = ctx->is_Intel ? 1 : 4; - if (vaddr + sz > ctx->last_pc) - { - ctx->codeptr[0] = -1; - return ctx->codeptr; - } - if (ctx->elf->get_data (ctx->f_offset + (vaddr - ctx->first_pc), sz, ctx->codeptr) == NULL) - { - ctx->codeptr[0] = -1; - return ctx->codeptr; - } - if (ctx->elf->need_swap_endian && !ctx->is_Intel) - ctx->codeptr[0] = ctx->elf->decode (ctx->codeptr[0]); - return ctx->codeptr; + uint64_t low_pc = 0; + if (stabs) + return stabs->map_PC_to_func (pc, low_pc, NULL); + return NULL; } -// get a symbol name for an address -disasm_err_code_t -Disasm::get_sym_name (disasm_handle_t, // an open disassembler handle - uint64_t target_address, // the target virtual address - uint64_t inst_address, // virtual address of instruction - // being disassembled - int use_relocation, // flag to use relocation information - char *buffer, // places the symbol here - size_t buffer_size, // limit on symbol length - int *, // sys/elf_{SPARC.386}.h - uint64_t *offset, // from the symbol to the address - void *pass_through) // disassembler context +const char * +Disasm::get_funcname_in_plt (uint64_t pc) { - char buf[MAXPATHLEN]; - if (!use_relocation) - return disasm_err_symbol; - - DisContext *ctxp = (DisContext*) pass_through; - char *name = NULL; - if (ctxp->stabs) - { - uint64_t addr = ctxp->f_offset + (inst_address - ctxp->first_pc); - name = ctxp->stabs->sym_name (target_address, addr, use_relocation); - } - if (name == NULL) - return disasm_err_symbol; - - char *s = NULL; - if (*name == '_') - s = cplus_demangle (name, DMGL_PARAMS); - if (s) + if (stabs) { - snprintf (buffer, buffer_size, NTXT ("%s"), s); - free (s); + Elf *elf = stabs->openElf (true); + if (elf) + return elf->get_funcname_in_plt (pc); } - else - snprintf (buffer, buffer_size, NTXT ("%s"), name); - - *offset = 0; - return disasm_err_ok; + return NULL; } -#endif diff --git a/gprofng/src/Disasm.h b/gprofng/src/Disasm.h index e82b1966b5d..4094c13a20e 100644 --- a/gprofng/src/Disasm.h +++ b/gprofng/src/Disasm.h @@ -48,7 +48,10 @@ public: char *get_disasm (uint64_t inst_address, uint64_t end_address, uint64_t start_address, uint64_t f_offset, int64_t &inst_size); void set_img_name (char *fname); // Only for dynfunc + Function *map_PC_to_func(uint64_t pc); + const char *get_funcname_in_plt (uint64_t pc); + uint64_t inst_addr; // address of current instruction StringBuilder *dis_str; private: diff --git a/gprofng/src/Elf.cc b/gprofng/src/Elf.cc index 469efe75988..9730b996a95 100644 --- a/gprofng/src/Elf.cc +++ b/gprofng/src/Elf.cc @@ -151,6 +151,14 @@ Elf::Elf (char *filename) : DbeMessages (), Data_window (filename) gnu_debug_file = NULL; dbeFile = NULL; abfd = NULL; + bfd_symcnt = -1; + bfd_dynsymcnt = -1; + bfd_synthcnt = -1; + bfd_sym = NULL; + bfd_dynsym = NULL; + bfd_synthsym = NULL; + synthsym = NULL; + if (bfd_status != BFD_INIT_MAGIC) { status = ELF_ERR_CANT_OPEN_FILE; @@ -162,6 +170,7 @@ Elf::Elf (char *filename) : DbeMessages (), Data_window (filename) status = ELF_ERR_CANT_OPEN_FILE; return; } + abfd->flags |= BFD_DECOMPRESS; if (!bfd_check_format (abfd, bfd_object)) { bfd_close (abfd); @@ -270,6 +279,10 @@ Elf::~Elf () delete elfSymbols; delete gnu_debug_file; delete dbeFile; + delete synthsym; + free (bfd_sym); + free (bfd_dynsym); + free (bfd_synthsym); if (abfd) bfd_close (abfd); } @@ -722,6 +735,87 @@ Elf::find_ancillary_files (char *lo_name) return NULL; } +void +Elf::get_bfd_symbols() +{ + if (bfd_symcnt < 0) + { + if ((bfd_get_file_flags (abfd) & HAS_SYMS) != 0) + bfd_symcnt = bfd_get_symtab_upper_bound (abfd); + if (bfd_symcnt > 0) + { + bfd_sym = (asymbol **) malloc (bfd_symcnt); + bfd_symcnt = bfd_canonicalize_symtab (abfd, bfd_sym); + if (bfd_symcnt < 0) + { + free (bfd_sym); + bfd_sym = NULL; + } + } + else + bfd_symcnt = 0; + } + + if (bfd_dynsymcnt < 0) + { + bfd_dynsymcnt = bfd_get_dynamic_symtab_upper_bound (abfd); + if (bfd_dynsymcnt > 0) + { + bfd_dynsym = (asymbol **) malloc (bfd_dynsymcnt); + bfd_dynsymcnt = bfd_canonicalize_dynamic_symtab (abfd, bfd_dynsym); + if (bfd_dynsymcnt < 0) + { + free (bfd_dynsym); + bfd_dynsym = NULL; + } + } + else + bfd_dynsymcnt = 0; + } + if (bfd_synthcnt < 0) + { + bfd_synthcnt = bfd_get_synthetic_symtab (abfd, bfd_symcnt, bfd_sym, + bfd_dynsymcnt, bfd_dynsym, &bfd_synthsym); + if (bfd_synthcnt < 0) + bfd_synthcnt = 0; + } +} + +static int +cmp_sym_addr (const void *a, const void *b) +{ + asymbol *sym1 = *((asymbol **) a); + asymbol *sym2 = *((asymbol **) b); + uint64_t a1 = sym1->value; + uint64_t a2 = sym2->value; + if (sym1->section) + a1 += sym1->section->vma; + if (sym2->section) + a2 += sym2->section->vma; + return a1 < a2 ? -1 : (a1 == a2 ? 0 : 1); +} + +const char * +Elf::get_funcname_in_plt (uint64_t pc) +{ + if (synthsym == NULL) + { + get_bfd_symbols(); + synthsym = new Vector (bfd_synthcnt + 1); + for (long i = 0; i < bfd_synthcnt; i++) + synthsym->append (bfd_synthsym + i); + synthsym->sort (cmp_sym_addr); + } + + asymbol sym, *symp = &sym; + sym.section = NULL; + sym.value = pc; + long ind = synthsym->bisearch (0, -1, &symp, cmp_sym_addr); + if (ind >= 0) + return synthsym->get (ind)->name; + return NULL; +} + char* Elf::get_location () { diff --git a/gprofng/src/Elf.h b/gprofng/src/Elf.h index 85059bc613c..e5a4f68db69 100644 --- a/gprofng/src/Elf.h +++ b/gprofng/src/Elf.h @@ -96,6 +96,7 @@ public: Elf_Internal_Rela *elf_getrela (Elf_Data *edta, unsigned int ndx, Elf_Internal_Rela *dst); Elf64_Ancillary *elf_getancillary (Elf_Data *edta, unsigned int ndx, Elf64_Ancillary *dst); Elf *find_ancillary_files (char *lo_name); // read the .gnu_debuglink and .SUNW_ancillary seections + const char *get_funcname_in_plt (uint64_t pc); char *get_location (); char *dump (); void dump_elf_sec (); @@ -135,12 +136,20 @@ public: protected: Elf *get_related_file (const char *lo_name, const char *nm); + void get_bfd_symbols(); int elf_class; int elf_datatype; Elf_Internal_Ehdr *ehdrp; Elf_Data **data; bfd *abfd; static int bfd_status; + long bfd_symcnt; + long bfd_dynsymcnt; + long bfd_synthcnt; + asymbol **bfd_sym; + asymbol **bfd_dynsym; + asymbol *bfd_synthsym; + Vector *synthsym; }; diff --git a/gprofng/src/Stabs.cc b/gprofng/src/Stabs.cc index ac2ff48f7e8..82d85efabeb 100644 --- a/gprofng/src/Stabs.cc +++ b/gprofng/src/Stabs.cc @@ -305,7 +305,6 @@ Stabs::Stabs (char *_path, char *_lo_name) Stabs::~Stabs () { - delete pltSym; delete SymLstByName; Destroy (SymLst); Destroy (RelLst); @@ -1618,9 +1617,9 @@ Stabs::createFunction (LoadObject *lo, Module *module, Symbol *sym) Function *func = dbeSession->createFunction (); func->module = module; func->img_fname = path; - func->img_offset = (off_t) sym->img_offset; + func->img_offset = sym->img_offset; func->save_addr = sym->save; - func->size = (uint32_t) sym->size; + func->size = sym->size; func->set_name (sym->name); func->elfSym = sym; module->functions->append (func); @@ -1691,12 +1690,12 @@ Stabs::check_Symtab () Elf *elf = openElf (true); if (elf == NULL) return; - if (elfDis->plt != 0) + if (elf->plt != 0) { - Elf_Internal_Shdr *shdr = elfDis->get_shdr (elfDis->plt); + Elf_Internal_Shdr *shdr = elf->get_shdr (elf->plt); if (shdr) { - pltSym = new Symbol (); + pltSym = new Symbol (SymLst); pltSym->value = shdr->sh_addr; pltSym->size = shdr->sh_size; pltSym->img_offset = shdr->sh_offset; @@ -1744,7 +1743,8 @@ Stabs::readSymSec (unsigned int sec, Elf *elf) switch (GELF_ST_TYPE (Sym.st_info)) { case STT_FUNC: - // Skip UNDEF symbols (bug 4817083) + if (Sym.st_size == 0) + break; if (Sym.st_shndx == 0) { if (Sym.st_value == 0) @@ -1752,8 +1752,8 @@ Stabs::readSymSec (unsigned int sec, Elf *elf) sitem = new Symbol (SymLst); sitem->flags |= SYM_UNDEF; if (pltSym) - sitem->img_offset = (uint32_t) (pltSym->img_offset + - Sym.st_value - pltSym->value); + sitem->img_offset = pltSym->img_offset + + Sym.st_value - pltSym->value; } else { @@ -1761,8 +1761,8 @@ Stabs::readSymSec (unsigned int sec, Elf *elf) if (shdrp == NULL) break; sitem = new Symbol (SymLst); - sitem->img_offset = (uint32_t) (shdrp->sh_offset + - Sym.st_value - shdrp->sh_addr); + sitem->img_offset = shdrp->sh_offset + + Sym.st_value - shdrp->sh_addr; } sitem->size = Sym.st_size; sitem->name = dbe_strdup (st_name); @@ -1882,7 +1882,7 @@ Stabs::check_Relocs () if (shdr_txt == NULL) continue; if (!(shdr_txt->sh_flags & SHF_EXECINSTR)) - continue; + continue; // Get corresponding symbol table section Elf_Internal_Shdr *shdr_sym = elf->get_shdr (shdr->sh_link); @@ -2305,9 +2305,9 @@ Stabs::append_local_funcs (Module *module, int first_ind) Function *func = dbeSession->createFunction (); sitem->func = func; func->img_fname = path; - func->img_offset = (off_t) sitem->img_offset; - func->save_addr = (uint32_t) sitem->save; - func->size = (uint32_t) sitem->size; + func->img_offset = sitem->img_offset; + func->save_addr = sitem->save; + func->size = sitem->size; func->module = module; func->set_name (sitem->name); module->functions->append (func); @@ -2381,9 +2381,9 @@ Stabs::append_Function (Module *module, char *fname) return sitem->func; sitem->func = func = dbeSession->createFunction (); func->img_fname = path; - func->img_offset = (off_t) sitem->img_offset; - func->save_addr = (uint32_t) sitem->save; - func->size = (uint32_t) sitem->size; + func->img_offset = sitem->img_offset; + func->save_addr = sitem->save; + func->size = sitem->size; } else func = dbeSession->createFunction (); @@ -2436,9 +2436,9 @@ Stabs::append_Function (Module *module, char *linkerName, uint64_t pc) sitem->func = func = dbeSession->createFunction (); func->img_fname = path; - func->img_offset = (off_t) sitem->img_offset; - func->save_addr = (uint32_t) sitem->save; - func->size = (uint32_t) sitem->size; + func->img_offset = sitem->img_offset; + func->save_addr = sitem->save; + func->size = sitem->size; func->module = module; func->set_name (sitem->name); //XXXX ?? Now call it to set obj->name module->functions->append (func);