From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <3eXFfYgcKCvIgUmelUsaiiafY.WigfcVW-UfjbUmiolWYqUlY.ila@flex--maskray.bounces.google.com> Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by sourceware.org (Postfix) with ESMTPS id 7A94B3858D3C for ; Wed, 20 Apr 2022 02:35:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7A94B3858D3C Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2f198b4e2d1so4271387b3.14 for ; Tue, 19 Apr 2022 19:35:38 -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=CTo9x7n7LhFf40TjeCD2LSjcCe8vB89al2H0Gqur7Ng=; b=KKOiYbeZF+Yqptz2fKXBfnrDMZ58iy/pspQcHL2kBBNIvdEk6243oJQSjnAPE6AU3b OWfuHCh4lK7KYb8XndSNeDd0P2zcL+Jh0gy25jRK+n+GwWvF/kmo9itA5J5JVit3zWnW CV2/JuJHa3178HdOkyVoXU3KldBowGpxan+2JNkytAgOwuDh1O5ducU8TGhgzwJwZ6Qo G/b0z/tmOFixpYZLi9ZiagmoRUEa4ASa3gfemIlSEbo2NptIOz5RmWSOB65rUsPJUjz6 i6pSSeAhzL6ilKzT5SNg1nEhUj2tm1Sbrr3PQFnzM8aKaKH/wSe29CGfTiI8p2m7QFWA zlgQ== X-Gm-Message-State: AOAM530XAiiaZ4pPMMd9xZIdt59h3I2S01z2achZjrrRut+j4La2VKvI apNlKJpHfxs8TB4C+m7ccH1AVBHcnLtaIYmXWYMDkilSvjw+6kuUxht/TDwFQ+4wvAlkdyMSFZG cNscv2IrP/rpRIBmjxACdJRSjTN+kQ7N/yJGqJ7cB9Xm8wHnZqOdLJ73qnbHr4fCBaIxs X-Google-Smtp-Source: ABdhPJxz1w8X8ZPt2N6XtwYmHQZXVRcp6J6KhJV7snL7qLTUe5yZzvS28bU/90ohc5YIBqsOeBIm7jh8Xjs2 X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:f5d7:c50d:9370:4aba]) (user=maskray job=sendgmr) by 2002:a25:b991:0:b0:610:bf4e:1b33 with SMTP id r17-20020a25b991000000b00610bf4e1b33mr18782435ybg.352.1650422137854; Tue, 19 Apr 2022 19:35:37 -0700 (PDT) Date: Tue, 19 Apr 2022 19:35:32 -0700 Message-Id: <20220420023532.367055-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] m68k: Handle fewer relocations for RTLD_BOOTSTRAP (#BZ29071) From: Fangrui Song To: libc-alpha@sourceware.org, Adhemerval Zanella , Andreas Schwab Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-19.5 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, T_SCC_BODY_TEXT_LINE, 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-List-Received-Date: Wed, 20 Apr 2022 02:35:40 -0000 m68k is a non-PI_STATIC_AND_HIDDEN arch which uses a GOT relocation when loading a jump table. The GOT load may be reordered before processing R_68K_RELATIVE relocations, leading to an unrelocated/incorrect jump table. The foolproof approach is to add an optimization barrier (e.g. calling a function after relative relocations are resolved). That isn't suitable given the current code structure, so just use the simple approach to avoid the jump table: handle only the essential reloctions for RTLD_BOOTSTRAP code. This is based on Andreas Schwab's patch and fixed ld.so crash on m68k. --- sysdeps/m68k/dl-machine.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h index c44ab055aa..bb51b4198c 100644 --- a/sysdeps/m68k/dl-machine.h +++ b/sysdeps/m68k/dl-machine.h @@ -234,6 +234,11 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], switch (r_type) { + case R_68K_GLOB_DAT: + case R_68K_JMP_SLOT: + *reloc_addr = value; + break; +#ifndef RTLD_BOOTSTRAP case R_68K_COPY: if (sym == NULL) /* This can happen in trace mode if an object could not be @@ -252,10 +257,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], memcpy (reloc_addr_arg, (void *) value, MIN (sym->st_size, refsym->st_size)); break; - case R_68K_GLOB_DAT: - case R_68K_JMP_SLOT: - *reloc_addr = value; - break; case R_68K_8: *(char *) reloc_addr = value + reloc->r_addend; break; @@ -276,7 +277,6 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], case R_68K_PC32: *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr; break; -#ifndef RTLD_BOOTSTRAP case R_68K_TLS_DTPMOD32: /* Get the information from the link map returned by the resolv function. */ @@ -294,9 +294,9 @@ elf_machine_rela (struct link_map *map, struct r_scope_elem *scope[], *reloc_addr = TLS_TPREL_VALUE (sym_map, sym, reloc); } break; -#endif /* !RTLD_BOOTSTRAP */ case R_68K_NONE: /* Alright, Wilbur. */ break; +#endif /* !RTLD_BOOTSTRAP */ default: _dl_reloc_bad_type (map, r_type, 0); break; -- 2.36.0.rc0.470.gd361397f0d-goog