[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-kbuild
Subject:    Re: [PATCH 2/2] kbuild: modversions for exported asm symbols
From:       Nicholas Piggin <npiggin () gmail ! com>
Date:       2016-10-31 11:14:45
Message-ID: 20161031221445.34e50e69 () roar ! ozlabs ! ibm ! com
[Download RAW message or body]

On Sat, 22 Oct 2016 17:36:34 +0200
Michal Marek <mmarek@suse.com> wrote:

> Dne 20.10.2016 v 10:03 Arnd Bergmann napsal(a):
> > On Thursday, October 20, 2016 2:58:27 PM CEST Nicholas Piggin wrote:  
> >>
> >> Yeah, I had the same idea as you and Michal too. It's conceptually nicer,
> >> but in practice it turned into a mess. If some architectures wanted to start
> >> protecting their .h files and including them into .S for the prototypes, we
> >> could start parsing those too. Should we do the quick and dirty way for 4.9?  
> > 
> > Let's stay with your approach for now.  
> 
> Agreed.

My patch 2/2 needs the following incremental patch applied. It is
to preprocess the .S file properly as asm the same way the kernel
build does, and then building the dummy C from there.

Without this, we don't necessarily get proper symbol expansion or
get conditional compilation, etc. With it, genksyms should see what
the assembler sees.

---
 scripts/Makefile.build | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index 2e512a2..6beeb9e 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -321,12 +321,19 @@ $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
 # or a file that it includes, in order to get versioned symbols. We build a
 # dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
 # the .S file (with trailing ';'), and run genksyms on that, to extract vers.
+# 
+# This is convoluted. The .S file must first be preprocessed to run guards and
+# expand names, then the resulting exports must be constructed into plain
+# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
+# to make the genksyms input.
 #
 # These mirror gensymtypes_c and co above, keep them in synch.
 cmd_gensymtypes_S =                                                         \
     (echo "\#include <linux/kernel.h>" ;                                    \
      echo "\#include <asm/asm-prototypes.h>" ;                              \
-     grep EXPORT_SYMBOL $< | sed 's/$$/;/' ) |                              \
+    $(CPP) $(a_flags) $< |                                                  \
+     grep ^___EXPORT_SYMBOL |                                               \
+     sed 's/___EXPORT_SYMBOL \([a-zA-Z0-9_]*\),.*/EXPORT_SYMBOL(\1);/' ) |  \
     $(CPP) -D__GENKSYMS__ $(c_flags) -xc - |                                \
     $(GENKSYMS) $(if $(1), -T $(2))                                         \
      $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \
-- 
2.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic