From patchwork Sun Apr 24 01:45:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 53144 X-Patchwork-Delegate: azanella@linux.vnet.ibm.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 99FCC3857C4E for ; Sun, 24 Apr 2022 01:46:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 99FCC3857C4E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650764815; bh=TVK9K81xYy+8kzIHjICeDYtzJmfDGthimBu296mwCv8=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=X1sAyr8yVdS7uKOEkiAXr7lquQ32SoDBzz/SupNGsFVPG5+OD2umQmUVmt/6GZeuv 5nzWoUYZfWStjYoO5n9bgf4nYH2xcRvk1M92wR754d2HfOf/eB/e5EnUyg6kWhanQD /WRaFzpDd1E1J1qLi8IctstgcRNAfPM5aOx6V0DM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by sourceware.org (Postfix) with ESMTPS id 7A80D3858C56 for ; Sun, 24 Apr 2022 01:45:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7A80D3858C56 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-2e642be1a51so99566177b3.21 for ; Sat, 23 Apr 2022 18:45:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=TVK9K81xYy+8kzIHjICeDYtzJmfDGthimBu296mwCv8=; b=0+54G03pk756+6I+K0OGNhPr9CEgl7vhrbPIpX+ZV48Si1q9jPcBttK4s4r+HMwIob RGkwEG9H3Le7vNi5JAJsS4FVwFuhpwJmy8lhbUlL1KDz+gyLAAJJmqlxGVcMl+5m+c04 ZoEapNo2ybOffR6oaETHm1rFYNOaK8Eo7OrzPphULxbSq6r6CICeAQBs79OHdBPWBfXM txVJBdlaj+JhhMqZYvcFJAo9mr4vWFql8+VRadMn8kx/HBbfOGDlY4maQKbk670YADuL WkaYXu8bKK34R9xH8rfhE0D4hvjZMqenvta6jc9mocMnJrttis8IUORngq+rkHcvWd0j ejoA== X-Gm-Message-State: AOAM5315MbCVQ3MQFqwYwVYD7QplwICzo2O+S/teyOq99ZfMYNI2sT0S QxZRxgwpRaPUT2qu2jmn9NJw4NYDBhygLt1Ndhga+Qc2l6iqeNKHeIhnrIUiqc3tYXfQV1jns/m fXX0WaYz8yTpVCFFk/6SA5ZANYMTWPljr8lnL/zkxs5/OkmKIA2IboV8e7dPZeI3pSeLi X-Google-Smtp-Source: ABdhPJxhyoHjoqYBM+PWvShwg7mjxKjmXC2Nly2rkhOus3zvXPIC6quElQlQ1s8kektnj1lI9UaTUo6P8ZU+ X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:1acc:6e76:bb3a:9cf2]) (user=maskray job=sendgmr) by 2002:a25:3455:0:b0:648:44db:51e0 with SMTP id b82-20020a253455000000b0064844db51e0mr2311180yba.314.1650764732773; Sat, 23 Apr 2022 18:45:32 -0700 (PDT) Date: Sat, 23 Apr 2022 18:45:29 -0700 Message-Id: <20220424014529.347497-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] elf: Move post-relocation code of _dl_start into _dl_start_final To: libc-alpha@sourceware.org, Adhemerval Zanella , Andreas Schwab X-Spam-Status: No, score=-19.7 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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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 Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" On non-PI_STATIC_AND_HIDDEN architectures, getting the address of _rtld_local_ro (for GLRO (dl_final_object)) goes through a GOT entry. The GOT load may be reordered before self relocation, leading to an unrelocated/incorrect _rtld_local_ro address. 84e02af1ebc9988126eebe60bf19226cea835623 tickled GCC powerpc32 to reorder the GOT load before relative relocations, leading to ld.so crash. This is similar to the m68k issue fixed by a8e9b5b8079d18116ca69c9797e77804ecf2ee7e. Move code after self relocation into _dl_start_final to avoid the reordering. This fixes powerpc32 and may help other architectures when ELF_DYNAMIC_RELOCATE is simplified in the future. --- elf/rtld.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/elf/rtld.c b/elf/rtld.c index 19e328f89e..93180466d6 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -468,6 +468,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) { ElfW(Addr) start_addr; + /* Do not use an initializer for these members because it would + intefere with __rtld_static_init. */ + GLRO (dl_find_object) = &_dl_find_object; + /* If it hasn't happen yet record the startup time. */ rtld_timer_start (&start_time); #if !defined DONT_USE_BOOTSTRAP_MAP @@ -512,7 +516,10 @@ _dl_start_final (void *arg, struct dl_start_final_info *info) print_statistics (RTLD_TIMING_REF(rtld_total_time)); } - return start_addr; +#ifndef ELF_MACHINE_START_ADDRESS +# define ELF_MACHINE_START_ADDRESS(map, start) (start) +#endif + return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, start_addr); } #ifdef DONT_USE_BOOTSTRAP_MAP @@ -586,23 +593,11 @@ _dl_start (void *arg) __rtld_malloc_init_stubs (); - /* Do not use an initializer for these members because it would - intefere with __rtld_static_init. */ - GLRO (dl_find_object) = &_dl_find_object; - - { #ifdef DONT_USE_BOOTSTRAP_MAP - ElfW(Addr) entry = _dl_start_final (arg); + return _dl_start_final (arg); #else - ElfW(Addr) entry = _dl_start_final (arg, &info); + return _dl_start_final (arg, &info); #endif - -#ifndef ELF_MACHINE_START_ADDRESS -# define ELF_MACHINE_START_ADDRESS(map, start) (start) -#endif - - return ELF_MACHINE_START_ADDRESS (GL(dl_ns)[LM_ID_BASE]._ns_loaded, entry); - } }