From patchwork Tue Apr 15 05:09:52 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Drake X-Patchwork-Id: 110456 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 5BAC73857B84 for ; Tue, 15 Apr 2025 05:12:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5BAC73857B84 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=jdrake.com header.i=@jdrake.com header.a=rsa-sha1 header.s=csoft header.b=lerg5X9o X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail231.csoft.net (mail231.csoft.net [66.216.5.135]) by sourceware.org (Postfix) with ESMTPS id 0F7A1385841C for ; Tue, 15 Apr 2025 05:09:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0F7A1385841C Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=jdrake.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=jdrake.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0F7A1385841C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=66.216.5.135 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1744693793; cv=none; b=SpA3lPKWltfgbUEvgKDZCPy+DvxX1tutgqVMsJS0re1Z9IoUvrfuZJaSXQrwn+mh/qL/9BacaQV6kgKmjCt4gVzAdrTKtRrFrhzGjORFpiwRloC2ePdfq1UYGVRhCKPlG9dpbOkUp5CE+/zkmAa9nsn4MbYkz21WCb+bKXQEB2k= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1744693793; c=relaxed/simple; bh=Sin4wWPxCm/a+hF/wlbmShauRWrZBWixy2hyzLbEi4Y=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=aiUgXrHo5cKWGTXJhbIh9BjwJexK4npyFuBLaGhILeBQ4QChlC85kbTB/YjEsRBEpHGyz4u3y5qsCy20XyUCyuCLkHA0B8SOfEZy1gJFN5hdUJ970L6QeoiGdVfhE5wZk2ELOCbQPtsBGugy6M3WIKET4pldpOSIEwSN2VVe6dw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0F7A1385841C Received: from mail231.csoft.net (localhost [127.0.0.1]) by mail231.csoft.net (Postfix) with ESMTP id DEE9245C7F; Tue, 15 Apr 2025 01:09:52 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=jdrake.com; h=date:from:to :cc:subject:message-id:mime-version:content-type; s=csoft; bh=iX aFP2WXO28xFiuH26j/Ea+RLvg=; b=lerg5X9on4a/0OpEZjAULvRJb/ab0d/Mov k/Me00NVWrq862vxPx4lIJMy9qVqZmhOAlj2DK56+mCa2H2zJx8UooE0XO4W5/dk atEEfRsAxQv2LzmS7aaz/PduSA21KZiHcWx2/51WSbh3SwOaeYjrHv+C7Z9GHAxK zOWkVPQO4= Received: from mail231 (mail231 [66.216.5.135]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) (Authenticated sender: jeremyd) by mail231.csoft.net (Postfix) with ESMTPSA id D45DC45C68; Tue, 15 Apr 2025 01:09:52 -0400 (EDT) Date: Mon, 14 Apr 2025 22:09:52 -0700 (PDT) From: Jeremy Drake X-X-Sender: jeremyd@resin.csoft.net To: binutils@sourceware.org cc: dave.korn.cygwin@gmail.com, LIU Hao Subject: [PATCH 3/3] bfd: populate delay import directory in PE header. Message-ID: <346348f7-5f9e-de25-6ada-a8c9e59df702@jdrake.com> MIME-Version: 1.0 X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_PASS, 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: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org Date: Sat, 8 Mar 2025 15:42:07 -0800 Previously, the delay import table was constructed but its rva and size were never put into the PE optional header. Signed-off-by: Jeremy Drake --- bfd/peXXigen.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 7dfa82ee43e..6fe0c0186e7 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -593,7 +593,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out; bfd_vma sa, fa, ib; - IMAGE_DATA_DIRECTORY idata2, idata5, tls, loadcfg; + IMAGE_DATA_DIRECTORY idata2, idata5, didat2, tls, loadcfg; sa = extra->SectionAlignment; fa = extra->FileAlignment; @@ -601,6 +601,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE]; idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE]; + didat2 = pe->pe_opthdr.DataDirectory[PE_DELAY_IMPORT_DESCRIPTOR]; tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE]; loadcfg = pe->pe_opthdr.DataDirectory[PE_LOAD_CONFIG_TABLE]; @@ -651,6 +652,7 @@ _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out) a final link is going to be performed, it can overwrite them. */ extra->DataDirectory[PE_IMPORT_TABLE] = idata2; extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5; + extra->DataDirectory[PE_DELAY_IMPORT_DESCRIPTOR] = didat2; extra->DataDirectory[PE_TLS_TABLE] = tls; extra->DataDirectory[PE_LOAD_CONFIG_TABLE] = loadcfg; @@ -4544,6 +4546,54 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo) } } + /* The delay import directory. This is .didat$2 */ + h1 = coff_link_hash_lookup (coff_hash_table (info), + "__DELAY_IMPORT_DIRECTORY_start__", false, false, + true); + if (h1 != NULL) + { + if ((h1->root.type == bfd_link_hash_defined + || h1->root.type == bfd_link_hash_defweak) + && h1->root.u.def.section != NULL + && h1->root.u.def.section->output_section != NULL) + { + bfd_vma delay_va; + + delay_va = + (h1->root.u.def.value + + h1->root.u.def.section->output_section->vma + + h1->root.u.def.section->output_offset); + + h1 = coff_link_hash_lookup (coff_hash_table (info), + "__DELAY_IMPORT_DIRECTORY_end__", false, + false, true); + if (h1 != NULL + && (h1->root.type == bfd_link_hash_defined + || h1->root.type == bfd_link_hash_defweak) + && h1->root.u.def.section != NULL + && h1->root.u.def.section->output_section != NULL) + { + pe_data (abfd)->pe_opthdr.DataDirectory[PE_DELAY_IMPORT_DESCRIPTOR].Size = + ((h1->root.u.def.value + + h1->root.u.def.section->output_section->vma + + h1->root.u.def.section->output_offset) + - delay_va); + if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_DELAY_IMPORT_DESCRIPTOR].Size + != 0) + pe_data (abfd)->pe_opthdr.DataDirectory[PE_DELAY_IMPORT_DESCRIPTOR].VirtualAddress = + delay_va - pe_data (abfd)->pe_opthdr.ImageBase; + } + else + { + _bfd_error_handler + (_("%pB: unable to fill in DataDirectory[%d]: %s not defined correctly"), + abfd, PE_DELAY_IMPORT_DESCRIPTOR, + "__DELAY_IMPORT_DIRECTORY_end__"); + result = false; + } + } + } + name[0] = bfd_get_symbol_leading_char (abfd); strcpy (name + !!name[0], "_tls_used"); h1 = coff_link_hash_lookup (coff_hash_table (info), name, false, false, true);