From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id C7E5F3840C1B for ; Wed, 20 Jan 2021 09:33:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C7E5F3840C1B Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-129-aWpFxJmaN1SHpJjoxEE8Sw-1; Wed, 20 Jan 2021 04:33:49 -0500 X-MC-Unique: aWpFxJmaN1SHpJjoxEE8Sw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id D241C8018A1; Wed, 20 Jan 2021 09:33:47 +0000 (UTC) Received: from oldenburg.str.redhat.com (ovpn-112-110.ams2.redhat.com [10.36.112.110]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5CF885D9DD; Wed, 20 Jan 2021 09:33:46 +0000 (UTC) From: Florian Weimer To: Alan Modra via Libc-alpha Cc: Alan Modra , Fangrui Song , binutils@sourceware.org Subject: Re: ifunc resolving References: <20210118220403.nzq6imfmaluuavfp@gmail.com> <87sg6xezv9.fsf@oldenburg.str.redhat.com> <20210119223153.GZ26219@bubble.grove.modra.org> Date: Wed, 20 Jan 2021 10:33:40 +0100 In-Reply-To: <20210119223153.GZ26219@bubble.grove.modra.org> (Alan Modra via Libc-alpha's message of "Wed, 20 Jan 2021 09:01:53 +1030") Message-ID: <87lfco6jgr.fsf@oldenburg.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain X-Spam-Status: No, score=-6.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP 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-List-Received-Date: Wed, 20 Jan 2021 09:33:54 -0000 * Alan Modra via Libc-alpha: > On Tue, Jan 19, 2021 at 03:59:54PM +0100, Florian Weimer via Binutils wrote: >> We have two positions that still need to be reconciled: >> >> * IFUNC resolvers must not themselves have relocation dependencies >> because they can be called at any time during relocation. This >> restricts the functionality available to an IFUNC resolver. > > On many architectures this cannot be achieved without hand-crafted > assembly. The reason is obvious. Ifunc resolvers return an address. > Compilers load addresses from the GOT, particularly for PIC. GOT > entries need relocation. Yes, this works best for what glibc considers PI_STATIC_AND_HIDDEN architectures. > >> * IFUNC resolvers may have relocation dependencies, but they may only be >> called after the object that contains them has been relocated. This >> restricts how IFUNC symbols can be used (interposition is limited, >> correct dependency ordering via DT_NEEDED is required). > > No interposition in practice, because the object doing the interposing > is almost always relocated later. Right, and that was hard for glibc. >> I do not think we have ever achieved consensus which position is the >> correct one. > > There is a third possibility. If ld.so defers all irelative and other > relocations using ifunc symbols until all non-ifunc relocations have > been performed, globally, then ifunc resolvers would only have the > restriction that they not call other ifuncs. > > That idea was floated a very long time ago. For some reason it is > too hard or too slow to do in ld.so. It's not too hard, I wrote a patch. I didn't mention it because it was rejected. It seemed about the only thing for which we had consensus. 8-/ My patch did not find an appropriate order in all cases. I think that's more or less unavoidable if IFUNC resolvers depend on relocations against other IFUNC resolvers. It would have nicely covered all internal glibc uses at the time. > If it's too hard for glibc itself, it's too hard for anyone to use > anywhere. Agreed, it's difficult to argue against that. Thanks, Florian -- Red Hat GmbH, https://de.redhat.com/ , Registered seat: Grasbrunn, Commercial register: Amtsgericht Muenchen, HRB 153243, Managing Directors: Charles Cachera, Brian Klemm, Laurie Krebs, Michael O'Neill