From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id 5B1FB3856260 for ; Tue, 3 May 2022 15:55:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5B1FB3856260 Received: by mail-pf1-x432.google.com with SMTP id v11so5586687pff.6 for ; Tue, 03 May 2022 08:55:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=FqH6GDmcHhA/qgtVycUA7NEj1nOHT41dEeTt9ioIuLU=; b=PHHJ+4o1isx0G+Pp4LJW57tiNlZh6qwJD6enyDtnlxxjPJexHTfYXMP2WUHSuVVrhW ZnvB8C0/aCgY1P9uP7bPo9A4KCo7Nk/N+Tc0mezr6COuXpPfB1BIiad9RXyoX/KdmeF2 wpv6NegbMxvoBa2QrWMJQU92asC9S9I5mHSrYkk0BpvuJnEpteb931LBNvAe3eak2tNs SREY5dGj0+IsnoKLLl3Ch/bJ6Fc+8BG8oAHcd4B3dGyGmuarG/3wfNJmj6VPJ4b0d9oA DZmMEz8PhjQGvgsbBABh4hxPHN5Ua8tHUCRrN2WlcjfaQ+2nu4NmXvdK32kMPnf1sror 3Hhw== X-Gm-Message-State: AOAM533PeJMITFNkKZ6rhCyEP3v0PbanVGMw478BhRts+pfTjJ7CP13x NkBbUVIECmTmegMKy7PJmjlfEJUpo9icZ7J6FrY= X-Google-Smtp-Source: ABdhPJyaBuCIpUqDBUM8Go6Ly4fvNTlaFoP3SozpOFFzR0YQC4+n+9bvip66aMrzZL+RND5MBzg3S5G8TFH/BE28ZEg= X-Received: by 2002:a62:d155:0:b0:50d:3c4e:37ec with SMTP id t21-20020a62d155000000b0050d3c4e37ecmr16438846pfl.60.1651593318323; Tue, 03 May 2022 08:55:18 -0700 (PDT) MIME-Version: 1.0 References: <7a6a51b346a81484046ba392a9854a88568a92aa.1651518694.git.fweimer@redhat.com> <87ilqn4spx.fsf@oldenburg.str.redhat.com> <877d734qne.fsf@oldenburg.str.redhat.com> <87bkwfxkhg.fsf@oldenburg.str.redhat.com> In-Reply-To: <87bkwfxkhg.fsf@oldenburg.str.redhat.com> From: "H.J. Lu" Date: Tue, 3 May 2022 08:54:41 -0700 Message-ID: Subject: Re: [PATCH 1/5] Linux: Implement a useful version of _startup_fatal To: Florian Weimer Cc: GNU C Library Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-3026.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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: Tue, 03 May 2022 15:55:21 -0000 On Mon, May 2, 2022 at 10:18 PM Florian Weimer wrote: > > * Florian Weimer: > > > * H. J. Lu: > > > >> On Mon, May 2, 2022 at 12:53 PM Florian Weimer wrote: > >>> > >>> * H. J. Lu: > >>> > >>> >> +#include_next > >>> >> diff --git a/sysdeps/unix/sysv/linux/startup.h b/sysdeps/unix/sysv/linux/startup.h > >>> >> new file mode 100644 > >>> >> index 0000000000..a5de941759 > >>> >> --- /dev/null > >>> >> +++ b/sysdeps/unix/sysv/linux/startup.h > >>> >> @@ -0,0 +1,38 @@ > >>> >> +/* Linux definitions of functions used by static libc main startup. > >>> >> + Copyright (C) 2017-2022 Free Software Foundation, Inc. > >>> > Shouldn't it just be 2022? > >>> >> + This file is part of the GNU C Library. > >>> >> + > >>> >> + The GNU C Library is free software; you can redistribute it and/or > >>> >> + modify it under the terms of the GNU Lesser General Public > >>> >> + License as published by the Free Software Foundation; either > >>> >> + version 2.1 of the License, or (at your option) any later version. > >>> >> + > >>> >> + The GNU C Library is distributed in the hope that it will be useful, > >>> >> + but WITHOUT ANY WARRANTY; without even the implied warranty of > >>> >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > >>> >> + Lesser General Public License for more details. > >>> >> + > >>> >> + You should have received a copy of the GNU Lesser General Public > >>> >> + License along with the GNU C Library; if not, see > >>> >> + . */ > >>> >> + > >>> >> +#ifdef SHARED > >>> >> +# include_next > >>> >> +#else > >>> >> +# include > >>> >> + > >>> >> +/* Avoid a run-time invocation of strlen. */ > >>> >> +#define _startup_fatal(message) \ > >>> > > >>> > Is this needed only for static PIE? > >>> > >>> I don't know. It's used from csu/libc-tls.c, some targets may need it > >>> for ET_EXEC static linking, too. I haven't checked. The additional > >>> code size is minimal. > >> > >> _startup_fatal was added for i386 static PIE. I don't think it is > >> needed for normal static executables. > > > > Based on the current initialization ordering, it seems to me that we > > need it for non-PIE static programs, too. Maybe I should check this > > tomorrow. > > It does not work on x86-64 because cancellation handling needs the TCB: > > Breakpoint 1, _dl_early_allocate (size=size@entry=3520) at ../sysdeps/unix/sysv/linux/dl-early_allocate.c:41 > 41 if (__curbrk != NULL) > (gdb) finish > Run till exit from #0 _dl_early_allocate (size=size@entry=3520) > at ../sysdeps/unix/sysv/linux/dl-early_allocate.c:41 > __libc_setup_tls () at libc-tls.c:149 > 149 if (tlsblock == NULL) > Value returned is $1 = (void *) 0x4eb000 > (gdb) set $rax = 0 > (gdb) c > Continuing. > > Program received signal SIGSEGV, Segmentation fault. > __writev (fd=fd@entry=2, iov=iov@entry=0x7fffffffddb0, iovcnt=iovcnt@entry=1) at ../sysdeps/unix/sysv/linux/writev.c:26 > 26 return SYSCALL_CANCEL (writev, fd, iov, iovcnt); > (gdb) disas > Dump of assembler code for function __writev: > => 0x000000000044e3c0 <+0>: mov %fs:0x18,%eax > 0x000000000044e3c8 <+8>: test %eax,%eax > 0x000000000044e3ca <+10>: jne 0x44e3e0 <__writev+32> > 0x000000000044e3cc <+12>: mov $0x14,%eax > 0x000000000044e3d1 <+17>: syscall > 0x000000000044e3d3 <+19>: cmp $0xfffffffffffff000,%rax > 0x000000000044e3d9 <+25>: ja 0x44e430 <__writev+112> > 0x000000000044e3db <+27>: ret > 0x000000000044e3dc <+28>: nopl 0x0(%rax) > 0x000000000044e3e0 <+32>: sub $0x28,%rsp > 0x000000000044e3e4 <+36>: mov %edx,0x1c(%rsp) > 0x000000000044e3e8 <+40>: mov %rsi,0x10(%rsp) > 0x000000000044e3ed <+45>: mov %edi,0x8(%rsp) > 0x000000000044e3f1 <+49>: call 0x46d2b0 <__pthread_enable_asynccancel> > 0x000000000044e3f6 <+54>: mov 0x1c(%rsp),%edx > 0x000000000044e3fa <+58>: mov 0x10(%rsp),%rsi > 0x000000000044e3ff <+63>: mov %eax,%r8d > 0x000000000044e402 <+66>: mov 0x8(%rsp),%edi > 0x000000000044e406 <+70>: mov $0x14,%eax > 0x000000000044e40b <+75>: syscall > 0x000000000044e40d <+77>: cmp $0xfffffffffffff000,%rax > 0x000000000044e413 <+83>: ja 0x44e448 <__writev+136> > 0x000000000044e415 <+85>: mov %r8d,%edi > 0x000000000044e418 <+88>: mov %rax,0x8(%rsp) > 0x000000000044e41d <+93>: call 0x46d330 <__pthread_disable_asynccancel> > 0x000000000044e422 <+98>: mov 0x8(%rsp),%rax > 0x000000000044e427 <+103>: add $0x28,%rsp > 0x000000000044e42b <+107>: ret > 0x000000000044e42c <+108>: nopl 0x0(%rax) > 0x000000000044e430 <+112>: mov $0xffffffffffffffa8,%rdx > 0x000000000044e437 <+119>: neg %eax > 0x000000000044e439 <+121>: mov %eax,%fs:(%rdx) > 0x000000000044e43c <+124>: mov $0xffffffffffffffff,%rax > 0x000000000044e443 <+131>: ret > 0x000000000044e444 <+132>: nopl 0x0(%rax) > 0x000000000044e448 <+136>: mov $0xffffffffffffffa8,%rdx > 0x000000000044e44f <+143>: neg %eax > 0x000000000044e451 <+145>: mov %eax,%fs:(%rdx) > 0x000000000044e454 <+148>: mov $0xffffffffffffffff,%rax > 0x000000000044e45b <+155>: jmp 0x44e415 <__writev+85> > End of assembler dump. > (gdb) bt > #0 __writev (fd=fd@entry=2, iov=iov@entry=0x7fffffffddb0, > iovcnt=iovcnt@entry=1) at ../sysdeps/unix/sysv/linux/writev.c:26 > #1 0x00000000004077aa in writev_for_fatal (fd=, > total=, niov=, iov=) > at ../sysdeps/posix/libc_fatal.c:44 > #2 __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x4c70ad "%s") > at ../sysdeps/posix/libc_fatal.c:124 > #3 0x000000000040789c in __libc_fatal ( > message=message@entry=0x4adb60 "Fatal glibc error: Cannot allocate TLS block\n") at ../sysdeps/posix/libc_fatal.c:164 > #4 0x000000000040a3c0 in __libc_setup_tls () at libc-tls.c:150 > #5 0x0000000000409709 in __libc_start_main_impl (main=0x401740
, > argc=1, argv=0x7fffffffe008, init=, fini=, > rtld_fini=0x0, stack_end=0x7fffffffdff8) at ../csu/libc-start.c:301 > #6 0x0000000000401da1 in _start () at ../sysdeps/x86_64/start.S:115 > (gdb) > > That might be a different bug. The startup codes can't use cancellation before it is ready. Do we need to check SHARED in this case? -- H.J.