Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755352AbcLNJoh (ORCPT ); Wed, 14 Dec 2016 04:44:37 -0500 Received: from mx2.suse.de ([195.135.220.15]:46463 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755138AbcLNJoL (ORCPT ); Wed, 14 Dec 2016 04:44:11 -0500 Subject: Re: [PATCH] x86/kbuild: enable modversions for symbols exported from asm To: Dodji Seketeli References: <20161201125545.406d092c@roar.ozlabs.ibm.com> <1480559754.16599.92.camel@decadent.org.uk> <20161201143928.07a08348@roar.ozlabs.ibm.com> <6e8cf20b-2d2f-ba1f-e02c-c757d5a25db7@suse.com> <20161209133308.0acbb57a@roar.ozlabs.ibm.com> <1481296893.4509.135.camel@hellion.org.uk> <20161210021529.4a6e684f@roar.ozlabs.ibm.com> <86vaus3eld.fsf@seketeli.org> <867f72vqec.fsf@seketeli.org> <20161214091539.GA9000@sepie.suse.cz> <86twa6svhi.fsf@seketeli.org> Cc: Nicholas Piggin , Ian Campbell , Ben Hutchings , Linus Torvalds , Adam Borowski , Greg Kroah-Hartman , Linux Kbuild mailing list , Debian kernel maintainers , "linux-arch@vger.kernel.org" , Arnd Bergmann , Ingo Molnar , Linux Kernel Mailing List From: Michal Marek Message-ID: Date: Wed, 14 Dec 2016 10:44:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.0 MIME-Version: 1.0 In-Reply-To: <86twa6svhi.fsf@seketeli.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1984 Lines: 91 On 2016-12-14 10:36, Dodji Seketeli wrote: > Michal Marek a écrit: > > [...] > >> A minimal example would be >> >> t1.c: >> struct s1; >> struct s2 { >> int i; >> } >> struct s3 { >> struct s1 *ptr1; >> struct s2 *ptr2; >> } >> void foo(struct s3*); >> EXPORT_SYMBOL(foo); >> >> t2.c: >> struct s1 { >> int j; >> } >> struct s2; >> struct s3 { >> struct s1 *ptr1; >> struct s2 *ptr2; >> } >> void foo(struct s3*); >> EXPORT_SYMBOL(foo); >> >> genksyms expands this to >> void foo ( struct s3 { struct s1 { UNKNOWN } * ptr1 ; struct s2 { int i ; } * ptr2 ; } * ) >> >> or >> >> void foo ( struct s3 { struct s1 { int j ; } * ptr1 ; struct s2 { UNKNOWN } * ptr2 ; } * ) >> respectively. > > Thanks, I have built an independant test case from this: > > $ cat t1.c > struct s1; > struct s2 { > int i; > }; > struct s3 { > struct s1 *ptr1; > struct s2 *ptr2; > }; > void foo(struct s3*); > $ cat t2.c > struct s1 { > int j; > }; > struct s2; > struct s3 { > struct s1 *ptr1; > struct s2 *ptr2; > }; > void foo(struct s3*); > $ gcc -g -c t1.c > $ gcc -g -c t2.c > $ abidiff t1.o t2.o > $ > > So, as you see here, abidiff considers t1.o and t2.o has having the same > ABI, so it considers the two foo functions to be equivalent. Wow. That sounds too good to be true. >> The types are the same, but their visibility in the different >> compilation units differs. > > I see, for genksyms, the order of declarations matters, especially when > forward declarations are involved. > > Libabigail does a "whole binary" analysis of types. > > So, consider the point of use of the type 'struct s1*'. Even if 'struct > s' is just forward-declared at that point, the declaration of struct s1 > is "resolved" to its definition. Even if the definition comes later in > the binary. But there isn't any definition of struct s1 in t1.o. Does abidiff "steal" the definition from the other object file? That would be legitimate, I'm just curious. Thanks, Michal