From patchwork Mon Dec 28 19:48:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 41572 X-Patchwork-Delegate: carlos@redhat.com 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 3D41B3875414; Mon, 28 Dec 2020 19:49:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3D41B3875414 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1609184950; bh=iLNXrLXzW6YJVpPHP1sLs0ZvCN1QLQq+/LnEnypZU1g=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=WGbxngy6Uq3YsJYWWD3HAbHrbDCqrc1AX+mq0kyryDY662rOy3CLqR7vpQer2GpPi TOLkAZxi+gUsV1wm8bnEkRfTc53Lp1yLn+70c2QWiT0is3VuSrqCnpsWQPMGWWBj/5 wubIUXBRI9rIfCxQpvnLwyJ3U50m1mMgsUuahdp4= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by sourceware.org (Postfix) with ESMTPS id 688553861887 for ; Mon, 28 Dec 2020 19:49:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 688553861887 Received: by mail-yb1-xb49.google.com with SMTP id k7so19694222ybm.13 for ; Mon, 28 Dec 2020 11:49:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=iLNXrLXzW6YJVpPHP1sLs0ZvCN1QLQq+/LnEnypZU1g=; b=lrmLBW1jpI+U+sI/kEJfAi8JFG4q7cTrrWzUEH/G0j6a/+s6ACeYmB6fcrUOXPxMgH E5wypQ9mignPDx+vp5mjcMD7n0P0uUnMCxERLRJGwvNdqRVzFF0eYoKZf9lmUzrPWlOV CGo4XEM2QyA4u+KArl2HeALSXK7LkDGXuTtBjHnHTf41UKtb1Ej3sU1Ts6+OwWxaDyTw K3LXoF7HraKhtQgp+jleN3VhBuAoNFsZo09Eol20cZdDSbr39gfTKXQbdkimfYS9cN83 LOKtUmagzHUpo5s1QSNbFjluSVFAbsZC+Ew9XCvCLX/2CVKFq6lnSCXnHQiK5XLcqfql XcUg== X-Gm-Message-State: AOAM532Lf0sXwFog0ySEsErO/Qg2w9NovKm1j7On07zzL2k9Q03q4ppn 7AWnI0IhVCZN6zYn6+VKuECNABY5qO6rGya4G3vQa3r4jygAmmcWIlJb6RyvFiEnS23VCnMlYUf 4tooCW6NhZmrg3M2R0Pr3pEmIFUJqL7GALK4zbUOzY+UBMeRrhZQCOf8jCD/fV7hf4SEw X-Google-Smtp-Source: ABdhPJwHsZamxSIwy6WCcJUDaTO/HsSQVB3lDY5DYlOdB4iOkAfk2rTCfjC3uDvx5aXL1JpgJtSL+Ja7EMot X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:0:a6ae:11ff:fe11:4abb]) (user=maskray job=sendgmr) by 2002:a25:aa45:: with SMTP id s63mr66032979ybi.471.1609184947926; Mon, 28 Dec 2020 11:49:07 -0800 (PST) Date: Mon, 28 Dec 2020 11:48:54 -0800 In-Reply-To: <20201228194855.510315-1-maskray@google.com> Message-Id: <20201228194855.510315-3-maskray@google.com> Mime-Version: 1.0 References: <20201228194855.510315-1-maskray@google.com> X-Mailer: git-send-email 2.29.2.729.g45daf8777d-goog Subject: [PATCH 2/3] elf: Replace a --defsym trick with an object file to be compatible with lld To: libc-alpha@sourceware.org X-Spam-Status: No, score=-19.9 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Fangrui Song via Libc-alpha From: Fangrui Song Reply-To: Fangrui Song Cc: Fangrui Song Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" The existing code specifies -Wl,--defsym=malloc=0 and other malloc.os definitions before libc_pic.a so that libc_pic.a(malloc.os) is not fetched. This trick is used to avoid multiple definition errors which would happen as a chain result: dl-allobjs.os has an undefined __libc_scratch_buffer_set_array_size __libc_scratch_buffer_set_array_size fetches libc_pic.a(scratch_buffer_set_array_size.os) libc_pic.a(scratch_buffer_set_array_size.os) has an undefined free free fetches libc_pic.a(malloc.os) libc_pic.a(malloc.os) has an undefined __libc_message __libc_message fetches libc_pic.a(libc_fatal.os) libc_fatal.os will cause a multiple definition error (__GI___libc_fatal) >>> defined at dl-fxstatat64.c >>> /tmp/p/glibc/Release/elf/dl-allobjs.os:(__GI___libc_fatal) >>> defined at libc_fatal.c >>> libc_fatal.os:(.text+0x240) in archive /tmp/p/glibc/Release/libc_pic.a lld processes --defsym after all input files, so this trick does not suppress multiple definition errors with lld. Split the step into two and use an object file to make the intention more obvious and make lld work. This is conceptually more appropriate because --defsym defines a SHN_ABS symbol while a normal definition is relative to the image base. See https://sourceware.org/pipermail/libc-alpha/2020-March/111910.html for discussions about the --defsym semantics. --- elf/Makefile | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 0b4d78c874..299bf24b49 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -524,10 +524,6 @@ rtld-stubbed-symbols = \ malloc \ realloc \ -# The GCC arguments that implement $(rtld-stubbed-symbols). -rtld-stubbed-symbols-args = \ - $(patsubst %,-Wl$(comma)--defsym=%=0, $(rtld-stubbed-symbols)) - ifeq ($(have-ssp),yes) # rtld is not built with the stack protector, so these references will # go away in the rebuilds. @@ -536,9 +532,10 @@ endif $(objpfx)librtld.map: $(objpfx)dl-allobjs.os $(common-objpfx)libc_pic.a @-rm -f $@T - $(reloc-link) -o $@.o $(rtld-stubbed-symbols-args) \ - '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@T - rm -f $@.o + echo '$(patsubst %,.globl %;,$(rtld-stubbed-symbols)) $(patsubst %,%:,$(rtld-stubbed-symbols))' | \ + $(CC) -o $@T.o $(ASFLAGS) -c -x assembler - + $(reloc-link) -o $@.o $@T.o '-Wl,-(' $^ -lgcc '-Wl,-)' -Wl,-Map,$@T + rm -f %@T.o $@.o mv -f $@T $@ # For lld, skip preceding addresses and values before matching the archive and the member.