From patchwork Wed Jul 26 00:55:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 126013 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:a985:0:b0:3e4:2afc:c1 with SMTP id t5csp101021vqo; Tue, 25 Jul 2023 17:55:34 -0700 (PDT) X-Google-Smtp-Source: APBJJlFOCx7tVdFSF+DhycIT83Cup2XBwSIANb3zoZjW0fR7riA9xZ2tZdNEgMatp/aFjfMlS7wv X-Received: by 2002:aa7:d9da:0:b0:522:55cb:ad88 with SMTP id v26-20020aa7d9da000000b0052255cbad88mr367400eds.6.1690332934481; Tue, 25 Jul 2023 17:55:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690332934; cv=none; d=google.com; s=arc-20160816; b=ZLgerJIe9d+TYbAkFgO8uNq2e8ziYEAUGy6PPpijhVNEw2kyhRhoUQclUueFA0UO+f xfEaX9gP9J1zmGh+kdNlDWPa9galiKMaZ35ndDVUQHSF27AtS+fw2zKpC4VXh8v8OD94 69amMi0s2I5MhkfiwuqHvZlrRJOPQv/21zPy2zHrSxM+Uk+8U78wp2RY/NxDYTY0DxTh OkTRSQjodsPWgpEB0pASCkrtn+WaLwV/3lP2fDHwyhrrHZDuoVOB93bWoNNLLsd/fzAK ZAcxIRMSs8kr/658WO1Tsa5KObZ+NLrwPqhILmrq7x2sz5l7jZX4hbSYK3GIkwVADl7+ 3w3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-disposition:mime-version:message-id:subject:to:date :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=LdE+ifDg1yDrrc2m/36TYC6RVGIErOFbqtqPTENffTw=; fh=HNIqzTA9Dp00ovCAyCdXfuEvWDT00OlFxFRPLybXRis=; b=EQRmNDAsRwTHH2CC2GjHQED7NcwuRLM8zHxzKb6MvC472+nqSOIlVO0cGqKXVuYh8a oruUVYzwDZxr8Zxej2sbdgYQt1mTUkXWFL1Fq98F1bkqQroQK7cEHekvwXFuQhsJoH1C iM3Hwaex/eYphkzmUQ0elJ8AShHEAp3KqjAfT/kIBFR0DmzM4zdrZ9hqPCxlLNC+kYYg g/n1PPa2th1shFnRxi0scmdRngD8P7HbIYcD53GDDvs5BvNJxJu193eXGwHTxyWpi209 y+rDe98BbTu8q2tgQiXEzIxlNlUDf6rXCDa2T1MN34/duUA99IqG1ZO6mNAyiF24LSbH Mh3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=xsn1MpBJ; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id r10-20020aa7d14a000000b005221eb09887si5290457edo.86.2023.07.25.17.55.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jul 2023 17:55:34 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=xsn1MpBJ; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B73413854160 for ; Wed, 26 Jul 2023 00:55:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B73413854160 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1690332932; bh=LdE+ifDg1yDrrc2m/36TYC6RVGIErOFbqtqPTENffTw=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=xsn1MpBJp5OlZsuKlcNaeQsrSDfKFwtQge1CVxHEFlU4OSKUYeSVkrOZqTiq8U+AJ qVUDKq4vLFfKwfhyZoy0YWWt++T62Y1QC/dCE9xDYXa9LVUK8mAXrXMs1OXKlKDQfX Ri6bleBhv8Lqzon1ktAfFzAWPaLenuFuJ+Vyz+Y4= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id 316C43858C33 for ; Wed, 26 Jul 2023 00:55:21 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 316C43858C33 Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-666eba6f3d6so3671928b3a.3 for ; Tue, 25 Jul 2023 17:55:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690332919; x=1690937719; h=content-disposition:mime-version:message-id:subject:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=LdE+ifDg1yDrrc2m/36TYC6RVGIErOFbqtqPTENffTw=; b=ic3QUSDX7cu5HeJIw2cdxEtQzW1bYpsYAxrs3vJ3ngVuCpQbfln0v0wJBNFWiROOWh g9ZranEUgyXLG+EByB1NeBK6spbTTxEQmh/ojwwkTkjr4eTccxox26m3SKOAgyMijPz/ QtEJFvMZ8AnuCGy6o8T1JHNE8+mrgiM6ZqH+Nn1KUchFWUerbOPD9pMIjNK9bY7of/OO 88q2N4gViscQYybzXUyXjsU5PIZL0qqOvrxfbcCCLM1ITASEayYB9xbvdbf71HrXelo/ wipECq1eDvUEUpqXfOOBP5+mRsoTTJwoXu/v9FeehEVaEXq3/iYzwruIaa3GI7KWHCd9 DcXQ== X-Gm-Message-State: ABy/qLYRf7dspMEms2i4vkHnFZ9bWUeqbtU2tA+C1jyL20O9Zimk+Ggw 85g1+L54Ajr6s3oJl9NDKCJBcHrU3y4= X-Received: by 2002:a05:6a00:815:b0:677:c5bf:dccc with SMTP id m21-20020a056a00081500b00677c5bfdcccmr955348pfk.19.1690332919218; Tue, 25 Jul 2023 17:55:19 -0700 (PDT) Received: from squeak.grove.modra.org (158.106.96.58.static.exetel.com.au. [58.96.106.158]) by smtp.gmail.com with ESMTPSA id g3-20020a633743000000b00563deb296bbsm489475pgn.22.2023.07.25.17.55.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Jul 2023 17:55:18 -0700 (PDT) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id 98A861142902; Wed, 26 Jul 2023 10:25:15 +0930 (ACST) Date: Wed, 26 Jul 2023 10:25:15 +0930 To: binutils@sourceware.org Subject: [GOLD] reporting local symbol names Message-ID: MIME-Version: 1.0 Content-Disposition: inline X-Spam-Status: No, score=-3034.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Alan Modra via Binutils From: Alan Modra Reply-To: Alan Modra Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772442547118742314 X-GMAIL-MSGID: 1772442547118742314 get_symbol_name currently returns "" for the usual STT_SECTION symbols generated by gas. That's not very helpful, return the section name. Demangle local symbols too, fixing an inconsistency in issue_discarded_error where global symbols are demangled. * object.cc (Sized_relobj_file::get_symbol_name): Return a std::string. Return section name for STT_SECTION symbols with zero st_name. Sanity check st_name, and don't run off the end of an improperly terminated .strtab. Demangle sym names. * object.h (Sized_relobj_file::get_symbol_name): Update decl. * target-reloc.h (issue_discarded_error): Adjust. * powerpc.cc (Target_powerpc::Relocate::relocate): Report reloc type and symbol for relocation overflows. diff --git a/gold/object.cc b/gold/object.cc index 77b2690c381..acd7c945937 100644 --- a/gold/object.cc +++ b/gold/object.cc @@ -3054,7 +3054,7 @@ Sized_relobj_file::find_kept_section_object( // Return the name of symbol SYMNDX. template -const char* +std::string Sized_relobj_file::get_symbol_name(unsigned int symndx) { if (this->symtab_shndx_ == 0) @@ -3065,6 +3065,24 @@ Sized_relobj_file::get_symbol_name(unsigned int symndx) &symbols_size, false); + const unsigned char* p = symbols + symndx * This::sym_size; + if (p >= symbols + symbols_size) + return NULL; + + elfcpp::Sym sym(p); + + if (sym.get_st_name() == 0 && sym.get_st_type() == elfcpp::STT_SECTION) + { + bool is_ordinary; + unsigned int sym_shndx = this->adjust_sym_shndx(symndx, + sym.get_st_shndx(), + &is_ordinary); + if (!is_ordinary || sym_shndx >= this->shnum()) + return NULL; + + return this->section_name(sym_shndx); + } + unsigned int symbol_names_shndx = this->adjust_shndx(this->section_link(this->symtab_shndx_)); section_size_type names_size; @@ -3072,14 +3090,25 @@ Sized_relobj_file::get_symbol_name(unsigned int symndx) this->section_contents(symbol_names_shndx, &names_size, false); const char* symbol_names = reinterpret_cast(symbol_names_u); - const unsigned char* p = symbols + symndx * This::sym_size; - - if (p >= symbols + symbols_size) + unsigned int sym_name = sym.get_st_name(); + if (sym_name >= names_size) return NULL; - - elfcpp::Sym sym(p); - - return symbol_names + sym.get_st_name(); + const char* namep = symbol_names + sym_name; + const void* endp = memchr(namep, 0, names_size - sym_name); + if (!endp) + endp = symbol_names + names_size; + std::string name = std::string(namep, static_cast(endp) - namep); + + if (!parameters->options().do_demangle()) + return name; + + char* demangled_name = cplus_demangle(name.c_str(), DMGL_ANSI | DMGL_PARAMS); + if (!demangled_name) + return name; + + name = demangled_name; + free(demangled_name); + return name; } // Get symbol counts. diff --git a/gold/object.h b/gold/object.h index e7472893ca6..d6c53eb105e 100644 --- a/gold/object.h +++ b/gold/object.h @@ -2347,7 +2347,7 @@ class Sized_relobj_file : public Sized_relobj find_kept_section_object(unsigned int shndx, unsigned int* symndx_p) const; // Return the name of symbol SYMNDX. - const char* + std::string get_symbol_name(unsigned int symndx); // Compute final local symbol value. R_SYM is the local symbol index. diff --git a/gold/powerpc.cc b/gold/powerpc.cc index d62bdea7ecb..e66d9cbb900 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -12420,17 +12420,24 @@ Target_powerpc::Relocate::relocate( && gsym->is_undefined() && is_branch_reloc(r_type)))) { + std::string name; + if (gsym) + name = gsym->demangled_name(); + else + name = relinfo->object->get_symbol_name(r_sym); if (os->flags() & elfcpp::SHF_ALLOC) { gold_error_at_location(relinfo, relnum, rela.get_r_offset(), - _("relocation overflow")); + _("reloc type %u overflow against '%s'"), + r_type, name.c_str()); if (has_stub_value) gold_info(_("try relinking with a smaller --stub-group-size")); } else { gold_warning_at_location(relinfo, relnum, rela.get_r_offset(), - _("relocation overflow")); + _("reloc type %u overflow against '%s'"), + r_type, name.c_str()); gold_info(_("debug info may be unreliable, compile with -gdwarf64")); } } diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 5f4c5c5a101..1df25ae452e 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -242,7 +242,7 @@ issue_discarded_error( relinfo, shndx, offset, _("relocation refers to local symbol \"%s\" [%u], " "which is defined in a discarded section"), - object->get_symbol_name(r_sym), r_sym); + object->get_symbol_name(r_sym).c_str(), r_sym); } else { @@ -264,7 +264,7 @@ issue_discarded_error( &key_symndx); if (key_symndx != 0) gold_info(_(" section group signature: \"%s\""), - object->get_symbol_name(key_symndx)); + object->get_symbol_name(key_symndx).c_str()); if (kept_obj != NULL) gold_info(_(" prevailing definition is from %s"), kept_obj->name().c_str());