From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 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 dcvr.yhbt.net (Postfix) with ESMTPS id D1BD81F4B5 for ; Fri, 15 Nov 2019 12:30:53 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:from:to:cc:subject:in-reply-to:references :reply-to:mime-version:content-transfer-encoding:content-type :message-id; q=dns; s=default; b=YoM0WZywjSWJXv4glwHrlfHzLobGl8X 13qC7H7h81/lXT10XRvg8E/zd0r0SmLQiMUOjG1hRNOi/+vDNRToUAMQPE4RBB9Q LwSPWETjmJTutMh74ILQYRRiO40Z0U+SZm3GhDbwMy9RgzMcng8VS31XX0SHgX6s bYCi3g899YLw= 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:date:from:to:cc:subject:in-reply-to:references :reply-to:mime-version:content-transfer-encoding:content-type :message-id; s=default; bh=JKfKXT2ci3MuNn0NGmZIO8K90PY=; b=v4O0x TaV0f2RHXHHhfchEpY4wA6lWMVR89Xnc9f9yTymRR6CMptNKZVQPFWA7MTjIPFkE SCPxqtEvy6u2Rp1Chh3XreDlIvEBI+vNBqRtAKkG9daR9aXz+5lDQizISh8WagiV r3/kdizAVX3xgmyZU/ybORvrFCn3tMPSDny4JA= Received: (qmail 393 invoked by alias); 15 Nov 2019 12:30:37 -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 Received: (qmail 131007 invoked by uid 89); 15 Nov 2019 12:30:36 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: mx1.osci.io X-Gerrit-PatchSet: 2 Date: Fri, 15 Nov 2019 07:30:20 -0500 From: "Sourceware to Gerrit sync (Code Review)" To: Florian Weimer , libc-alpha@sourceware.org Cc: Szabolcs Nagy Auto-Submitted: auto-generated X-Gerrit-MessageType: merged Subject: [pushed] Introduce link_map_audit_state accessor function X-Gerrit-Change-Id: Id815673c29950fc011ae5301d7cde12624f658df X-Gerrit-Change-Number: 487 X-Gerrit-ChangeURL: X-Gerrit-Commit: e1d559f337de2c8ab68a6749dfe873477c883807 In-Reply-To: References: Reply-To: noreply@gnutoolchain-gerrit.osci.io, fweimer@redhat.com, szabolcs.nagy@arm.com, libc-alpha@sourceware.org MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Disposition: inline User-Agent: Gerrit/3.0.3-76-gf8b6da0ab5 Content-Type: text/plain; charset=UTF-8 Message-Id: <20191115123020.A943828171@gnutoolchain-gerrit.osci.io> Sourceware to Gerrit sync has submitted this change. Change URL: https://gnutoolchain-gerrit.osci.io/r/c/glibc/+/487 ...................................................................... Introduce link_map_audit_state accessor function To improve GCC 10 compatibility, it is necessary to remove the l_audit zero-length array from the end of struct link_map. In preparation of that, this commit introduces an accessor function for the audit state, so that it is possible to change the representation of the audit state without adjusting the code that accesses it. Tested on x86_64-linux-gnu. Built on i686-gnu. Change-Id: Id815673c29950fc011ae5301d7cde12624f658df --- M csu/libc-start.c M elf/dl-close.c M elf/dl-fini.c M elf/dl-load.c M elf/dl-object.c M elf/dl-open.c M elf/dl-runtime.c M elf/dl-sym.c M elf/rtld.c M sysdeps/generic/ldsodefs.h 10 files changed, 78 insertions(+), 45 deletions(-) Approvals: Szabolcs Nagy: Looks good to me, approved diff --git a/csu/libc-start.c b/csu/libc-start.c index 14e2b69..e9e8e44 100644 --- a/csu/libc-start.c +++ b/csu/libc-start.c @@ -272,7 +272,7 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->preinit != NULL) - afct->preinit (&head->l_audit[cnt].cookie); + afct->preinit (&link_map_audit_state (head, cnt)->cookie); afct = afct->next; } diff --git a/elf/dl-close.c b/elf/dl-close.c index de91c28..c32e647 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -302,8 +302,12 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->objclose != NULL) - /* Return value is ignored. */ - (void) afct->objclose (&imap->l_audit[cnt].cookie); + { + struct auditstate *state + = link_map_audit_state (imap, cnt); + /* Return value is ignored. */ + (void) afct->objclose (&state->cookie); + } afct = afct->next; } @@ -478,7 +482,10 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&head->l_audit[cnt].cookie, LA_ACT_DELETE); + { + struct auditstate *state = link_map_audit_state (head, cnt); + afct->activity (&state->cookie, LA_ACT_DELETE); + } afct = afct->next; } @@ -774,7 +781,10 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); + { + struct auditstate *state = link_map_audit_state (head, cnt); + afct->activity (&state->cookie, LA_ACT_CONSISTENT); + } afct = afct->next; } diff --git a/elf/dl-fini.c b/elf/dl-fini.c index bed736d..70e7346 100644 --- a/elf/dl-fini.c +++ b/elf/dl-fini.c @@ -152,9 +152,12 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->objclose != NULL) - /* Return value is ignored. */ - (void) afct->objclose (&l->l_audit[cnt].cookie); - + { + struct auditstate *state + = link_map_audit_state (l, cnt); + /* Return value is ignored. */ + (void) afct->objclose (&state->cookie); + } afct = afct->next; } } diff --git a/elf/dl-load.c b/elf/dl-load.c index c1bc8c2..6cdd11e 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -973,7 +973,8 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&head->l_audit[cnt].cookie, LA_ACT_ADD); + afct->activity (&link_map_audit_state (head, cnt)->cookie, + LA_ACT_ADD); afct = afct->next; } @@ -1402,10 +1403,9 @@ { if (afct->objopen != NULL) { - l->l_audit[cnt].bindflags - = afct->objopen (l, nsid, &l->l_audit[cnt].cookie); - - l->l_audit_any_plt |= l->l_audit[cnt].bindflags != 0; + struct auditstate *state = link_map_audit_state (l, cnt); + state->bindflags = afct->objopen (l, nsid, &state->cookie); + l->l_audit_any_plt |= state->bindflags != 0; } afct = afct->next; @@ -1511,8 +1511,8 @@ { if (afct->objsearch != NULL) { - name = afct->objsearch (name, &loader->l_audit[cnt].cookie, - whatcode); + struct auditstate *state = link_map_audit_state (loader, cnt); + name = afct->objsearch (name, &state->cookie, whatcode); if (name == NULL) /* Ignore the path. */ return -1; @@ -1970,8 +1970,8 @@ if (afct->objsearch != NULL) { const char *before = name; - name = afct->objsearch (name, &loader->l_audit[cnt].cookie, - LA_SER_ORIG); + struct auditstate *state = link_map_audit_state (loader, cnt); + name = afct->objsearch (name, &state->cookie, LA_SER_ORIG); if (name == NULL) { /* Do not try anything further. */ diff --git a/elf/dl-object.c b/elf/dl-object.c index 4dff99e..225e2cc 100644 --- a/elf/dl-object.c +++ b/elf/dl-object.c @@ -81,7 +81,7 @@ struct link_map *new; struct libname_list *newname; #ifdef SHARED - size_t audit_space = naudit * sizeof (new->l_audit[0]); + size_t audit_space = naudit * sizeof (struct auditstate); #else # define audit_space 0 #endif @@ -134,10 +134,8 @@ #ifdef SHARED for (unsigned int cnt = 0; cnt < naudit; ++cnt) - { - new->l_audit[cnt].cookie = (uintptr_t) new; - /* new->l_audit[cnt].bindflags = 0; */ - } + /* No need to initialize bindflags due to calloc. */ + link_map_audit_state (new, cnt)->cookie = (uintptr_t) new; #endif /* new->l_global = 0; We use calloc therefore not necessary. */ diff --git a/elf/dl-open.c b/elf/dl-open.c index a9fd4cb..8d699d3 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -278,7 +278,10 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); + { + struct auditstate *state = link_map_audit_state (head, cnt); + afct->activity (&state->cookie, LA_ACT_CONSISTENT); + } afct = afct->next; } diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index 342b794..8457862 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -325,15 +325,18 @@ { /* XXX Check whether both DSOs must request action or only one */ - if ((l->l_audit[cnt].bindflags & LA_FLG_BINDFROM) != 0 - && (result->l_audit[cnt].bindflags & LA_FLG_BINDTO) != 0) + struct auditstate *l_state = link_map_audit_state (l, cnt); + struct auditstate *result_state + = link_map_audit_state (result, cnt); + if ((l_state->bindflags & LA_FLG_BINDFROM) != 0 + && (result_state->bindflags & LA_FLG_BINDTO) != 0) { if (afct->symbind != NULL) { uintptr_t new_value = afct->symbind (&sym, reloc_result->boundndx, - &l->l_audit[cnt].cookie, - &result->l_audit[cnt].cookie, + &l_state->cookie, + &result_state->cookie, &flags, strtab2 + defsym->st_name); if (new_value != (uintptr_t) sym.st_value) @@ -421,10 +424,13 @@ & (LA_SYMB_NOPLTENTER << (2 * (cnt + 1)))) == 0) { long int new_framesize = -1; + struct auditstate *l_state = link_map_audit_state (l, cnt); + struct auditstate *bound_state + = link_map_audit_state (reloc_result->bound, cnt); uintptr_t new_value = afct->ARCH_LA_PLTENTER (&sym, reloc_result->boundndx, - &l->l_audit[cnt].cookie, - &reloc_result->bound->l_audit[cnt].cookie, + &l_state->cookie, + &bound_state->cookie, regs, &flags, symname, &new_framesize); if (new_value != (uintptr_t) sym.st_value) @@ -504,9 +510,11 @@ && (reloc_result->enterexit & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0) { + struct auditstate *l_state = link_map_audit_state (l, cnt); + struct auditstate *bound_state + = link_map_audit_state (reloc_result->bound, cnt); afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx, - &l->l_audit[cnt].cookie, - &reloc_result->bound->l_audit[cnt].cookie, + &l_state->cookie, &bound_state->cookie, inregs, outregs, symname); } diff --git a/elf/dl-sym.c b/elf/dl-sym.c index 8209342..21e025b 100644 --- a/elf/dl-sym.c +++ b/elf/dl-sym.c @@ -198,17 +198,20 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { + struct auditstate *match_audit + = link_map_audit_state (match, cnt); + struct auditstate *result_audit + = link_map_audit_state (result, cnt); if (afct->symbind != NULL - && ((match->l_audit[cnt].bindflags & LA_FLG_BINDFROM) - != 0 - || ((result->l_audit[cnt].bindflags & LA_FLG_BINDTO) + && ((match_audit->bindflags & LA_FLG_BINDFROM) != 0 + || ((result_audit->bindflags & LA_FLG_BINDTO) != 0))) { unsigned int flags = altvalue | LA_SYMB_DLSYM; uintptr_t new_value = afct->symbind (&sym, ndx, - &match->l_audit[cnt].cookie, - &result->l_audit[cnt].cookie, + &match_audit->cookie, + &result_audit->cookie, &flags, strtab + ref->st_name); if (new_value != (uintptr_t) sym.st_value) { diff --git a/elf/rtld.c b/elf/rtld.c index d54a796..e22c756 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1025,9 +1025,9 @@ else *last_audit = (*last_audit)->next = &newp->ifaces; - /* The dynamic linker link map is statically allocated, initialize - the data now. */ - GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie + /* The dynamic linker link map is statically allocated, so the + cookie in _dl_new_object has not happened. */ + link_map_audit_state (&GL (dl_rtld_map), GLRO (dl_naudit))->cookie = (intptr_t) &GL (dl_rtld_map); ++GLRO(dl_naudit); @@ -1046,9 +1046,9 @@ { if (afct->objopen != NULL) { - map->l_audit[cnt].bindflags - = afct->objopen (map, LM_ID_BASE, &map->l_audit[cnt].cookie); - map->l_audit_any_plt |= map->l_audit[cnt].bindflags != 0; + struct auditstate *state = link_map_audit_state (map, cnt); + state->bindflags = afct->objopen (map, LM_ID_BASE, &state->cookie); + map->l_audit_any_plt |= state->bindflags != 0; } afct = afct->next; @@ -1662,7 +1662,8 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&main_map->l_audit[cnt].cookie, LA_ACT_ADD); + afct->activity (&link_map_audit_state (main_map, cnt)->cookie, + LA_ACT_ADD); afct = afct->next; } @@ -2333,7 +2334,8 @@ for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) { if (afct->activity != NULL) - afct->activity (&head->l_audit[cnt].cookie, LA_ACT_CONSISTENT); + afct->activity (&link_map_audit_state (head, cnt)->cookie, + LA_ACT_CONSISTENT); afct = afct->next; } diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index a6991f3..923bd4c 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -1174,7 +1174,13 @@ initialized and active ld.so copy. */ return GLRO(dl_init_all_dirs) != NULL; } -#endif + +static inline struct auditstate * +link_map_audit_state (struct link_map *l, size_t index) +{ + return &l->l_audit[index]; +} +#endif /* SHARED */ __END_DECLS -- Gerrit-Project: glibc Gerrit-Branch: master Gerrit-Change-Id: Id815673c29950fc011ae5301d7cde12624f658df Gerrit-Change-Number: 487 Gerrit-PatchSet: 2 Gerrit-Owner: Florian Weimer Gerrit-Reviewer: Szabolcs Nagy Gerrit-MessageType: merged