From patchwork Fri Apr 11 00:06:54 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos O'Donell X-Patchwork-Id: 338300 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id B5A47140085 for ; Fri, 11 Apr 2014 10:07:08 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:cc :subject:content-type:content-transfer-encoding; q=dns; s= default; b=xRbKbVLN3T+gFneVmXiXcf7wy3W4OsRoMtSpm/mValjnT9SJvIiZS Z2QJhFwJR30Xt2W0M6ad4RHnhLEi4OKkqE2LGYAlpKP/0/8U03UErahR/X6LjTn8 NX+NBx1Y76GmzEPDqK7/BWrlCTaTv1vO6WT6mqfxkhiOfklkDoOvDo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:message-id:date:from:mime-version:to:cc :subject:content-type:content-transfer-encoding; s=default; bh=P O3PKmaN7tKDrv2Hm7mSSKeXKuo=; b=MMLJ9Iqa+on4C3giRw4h0+BqLoaSYsAoP j1/Vh9lptSW/12tWVDvDdM2DkEfCHPrnhAoB40MbepXoA8HiOp3qil+rorWRa1L1 1bJCfYODh7HDHRro00f+2yruKxQ6ZzSQ9DgyJO8Iwq9QGH+HA8YteiP2XUkAyR/o CYE+0rIao4= Received: (qmail 22597 invoked by alias); 11 Apr 2014 00:07:03 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 22579 invoked by uid 89); 11 Apr 2014 00:07:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.0 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Message-ID: <5347321E.2060802@redhat.com> Date: Thu, 10 Apr 2014 20:06:54 -0400 From: "Carlos O'Donell" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: GNU C Library CC: Jan Kratochvil , "Maciej W. Rozycki" , Roland McGrath Subject: [PATCH] Initialize _r_debug for static applications. With Maciej's great work on reducing the difference between static and dyanmic executables, and with the addition of a functional main link map in static exectuables we can now usefully initialize _r_debug for static applications. This will allow future debuggers the ability to coalesce code paths which previously had to have special cases for static v.s. dyanmic. It also fixes this particular use case where gdb would like a consistent way to find the application link map for looking up TLS variables in both static and dynamic applications: https://www.sourceware.org/ml/libc-help/2014-03/msg00024.html The discussion touches on the fact that without _r_debug the debugger has to make various assupmtions while using libthread_db that contrains the implementation. This patch initializes the debug infrastructure during LIBC_START_MAIN, but only for static applications, by calling `_dl_debug_initialize (0, LM_ID_BASE)'. We pass 0 as the ldbase because it's a static application, and the runtime address of the loader doesn't matter. We pass LM_ID_BASE because we want to load, by default, the base link map, and that's what really matters. Tested on x86_64 with no regressions. Jan reports this works and that gdb can be patched to use _r_debug to access TLS variables in static applications while still using the current libthread_db calls normally used for dynamic applications. This removes one more difference between static and dynamic applications. Note: This does not attempt to cleanup the -Wundef warning for SHARED, which I am looking to fix in another patch so we still use `#ifndef SHARED' (Makeconfig needs to be fixed to use -DSHARED=0 and -DSHARED=1 IMO to make this work correctly). OK to checkin? Cheers, Carlos. 2014-04-10 Carlos O'Donell * csu/libc-start.c (LIBC_START_MAIN) [!SHARED]: Call _dl_debug_initialize. --- Cheers, Carlos. diff --git a/csu/libc-start.c b/csu/libc-start.c index 3b7092b..d571a1a 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -264,6 +264,9 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL), GLRO(dl_debug_printf) ("\ntransferring control: %s\n\n", argv[0]); #endif +#ifndef SHARED + _dl_debug_initialize (0, LM_ID_BASE); +#endif #ifdef HAVE_CLEANUP_JMP_BUF /* Memory for the cancellation buffer. */ struct pthread_unwind_buf unwind_buf;