On Wed, Feb 09, 2005 at 10:40:53AM +0000, Russell King wrote:
> On Tue, Feb 08, 2005 at 08:05:01PM +0000, Russell King wrote:
> > On Tue, Feb 08, 2005 at 08:42:43PM +0100, Sam Ravnborg wrote:
> > > On Mon, Feb 07, 2005 at 11:43:59AM +0000, Russell King wrote:
> > > > 
> > > > Maybe we need an architecture hook or something for post-processing
> > > > vmlinux?
> > > Makes sense.
> > > For now arm can provide an arm specific cmd_vmlinux__ like um does.
> > > 
> > > The ?= used in Makefile snippet below allows an ARCH to override the
> > > definition of quiet_cmd_vmlinux__ and cmd_vmlinux__
> > 
> > Great - I'll merge your previous idea with this one and throw a patch
> > here.
> 
> Well, this was a great idea until you find that this is also used for
> linking the intermediate vmlinux objects for kallsyms, and kallsyms
> uses weak (== undefined) symbols:
> 
>   LD      .tmp_vmlinux1
> .tmp_vmlinux1: error: undefined symbol(s) found:
>          w kallsyms_addresses
>          w kallsyms_markers
>          w kallsyms_names
>          w kallsyms_num_syms
>          w kallsyms_token_index
>          w kallsyms_token_table
> 
> Maybe kallsyms needs to provide an empty object with these symbols
> defined for the first linker pass, instead of using weak symbols?

So, what's the answer?  Maybe this patch?  With this, we can drop the
__attribute__((weak)) from the kallsyms symbols since they're always
provided.

diff -up -x BitKeeper -x ChangeSet -x SCCS -x _xlk -x *.orig -x *.rej 
orig/Makefile linux/Makefile
--- orig/Makefile       Sun Feb 13 17:26:38 2005
+++ linux/Makefile      Sun Feb 13 17:24:17 2005
@@ -702,14 +702,20 @@ quiet_cmd_kallsyms = KSYM    $@
       cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
                      $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
 
-.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
+.tmp_kallsyms0.o .tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S 
scripts FORCE
        $(call if_changed_dep,as_o_S)
 
+.tmp_kallsyms0.S: FORCE
+       @( echo ".data"; \
+         for sym in addresses markers names num_syms token_index token_table; \
+         do echo -e ".globl kallsyms_$$sym\nkallsyms_$$sym:\n"; done; \
+         echo ".word 0"; ) > $@
+
 .tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
        $(call cmd,kallsyms)
 
 # .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
-.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
+.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms0.o FORCE
        $(call if_changed_rule,ksym_ld)
 
 .tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
diff -up -x BitKeeper -x ChangeSet -x SCCS -x _xlk -x *.orig -x *.rej 
orig/arch/arm/Makefile linux/arch/arm/Makefile
--- orig/arch/arm/Makefile      Mon Nov 15 09:15:02 2004
+++ linux/arch/arm/Makefile     Wed Feb  9 10:09:36 2005
@@ -156,6 +156,17 @@ else
 all: zImage
 endif
 
+# Override the default command for generating vmlinux, so we can check for
+# the assembler bug with undefined symbols.
+cmd_vmlinux__ = $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@       \
+       -T $(vmlinux-lds) $(vmlinux-init)                       \
+       --start-group $(vmlinux-main) --end-group               \
+       $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^); 
\
+       if [ "`$(NM) -u [EMAIL PROTECTED]" != "" ]; then                      \
+          echo "$@: error: undefined symbol(s) found:";        \
+          $(NM) -u $@; exit 1;                                 \
+       fi
+
 boot := arch/arm/boot
 
 #      Update machine arch and proc symlinks if something which affects


-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to