From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rusty Russell Subject: Re: [RFC -next] linux/linkage.h: fix symbol prefix handling Date: Fri, 08 Mar 2013 11:03:13 +1100 Message-ID: <87sj46wyf2.fsf@rustcorp.com.au> References: <1362656642-2693-1-git-send-email-james.hogan@imgtec.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: In-Reply-To: <1362656642-2693-1-git-send-email-james.hogan@imgtec.com> Sender: linux-kbuild-owner@vger.kernel.org To: Al Viro Cc: Michal Marek , Andrew Morton , Guenter Roeck , Jean Delvare , linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, Mike Frysinger , uclinux-dist-devel@blackfin.uclinux.org, linux-next@vger.kernel.org, James Hogan List-Id: linux-next.vger.kernel.org James Hogan writes: > The commit "consolidate cond_syscall and SYSCALL_ALIAS declarations" > broke the build on blackfin and metag due to the following code: > > #ifndef SYMBOL_NAME > #ifdef CONFIG_SYMBOL_PREFIX > #define SYMBOL_NAME(x) CONFIG_SYMBOL_PREFIX ## x > #else > #define SYMBOL_NAME(x) x > #endif > #endif > #define __SYMBOL_NAME(x) __stringify(SYMBOL_NAME(x)) > > __stringify literally stringifies CONFIG_SYMBOL_PREFIX ##x, so you get > lines like this in the assembly output: > > .weak CONFIG_SYMBOL_PREFIXsys_quotactl > .set > CONFIG_SYMBOL_PREFIXsys_quotactl,CONFIG_SYMBOL_PREFIXsys_ni_syscall > > This is fixed by defining SYMBOL_PREFIX from the command line for c > files in addition to assembly for architectures that set > CONFIG_SYMBOL_PREFIX (scripts/Makefile.lib), and defining __SYMBOL_NAME > as: > > #define __SYMBOL_NAME(x) __stringify(SYMBOL_PREFIX) #x > > We first have to ensure SYMBOL_PREFIX is defined (which avoids polluting > the command lines for architectures that don't use symbol prefixes). > Also the definition of SYMBOL_PREFIX in is removed as > it conflicts, isn't used anywhere, and is defined as a string so differs > from the assembly definition. So now, if CONFIG_SYMBOL_PREFIX, SYMBOL_PREFIX is defined on the cmdline as a string. Otherwise it's empty (not the empty string?): > +/* This helps us to avoid #ifdef SYMBOL_PREFIX */ > +#ifndef SYMBOL_PREFIX > +#define SYMBOL_PREFIX > #endif > -#define __SYMBOL_NAME(x) __stringify(SYMBOL_NAME(x)) > + > +#define __SYMBOL_NAME(x) __stringify(SYMBOL_PREFIX) #x And why are you __stringify()ing a string? > #ifndef cond_syscall > #define cond_syscall(x) asm(".weak\t" __SYMBOL_NAME(x) \ > diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib > index 07125e6..f1cce6a 100644 > --- a/scripts/Makefile.lib > +++ b/scripts/Makefile.lib > @@ -123,6 +123,7 @@ ifdef CONFIG_SYMBOL_PREFIX > _sym_flags = -DSYMBOL_PREFIX=$(patsubst "%",%,$(CONFIG_SYMBOL_PREFIX)) > _cpp_flags += $(_sym_flags) > _a_flags += $(_sym_flags) > +_c_flags += $(_sym_flags) > endif Confused, Rusty.