diff options
author | Roland McGrath <roland@redhat.com> | 2008-01-30 13:30:40 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 13:30:40 +0100 |
commit | 5b93049337301d6fbd3cf55db99b34e6b0dbd3a3 (patch) | |
tree | 69e42bddac98aff8035f03a36fc88030a7f2a902 /arch | |
parent | c1d171a002942ea2d93b4fbd0c9583c56fce0772 (diff) | |
download | blackbird-op-linux-5b93049337301d6fbd3cf55db99b34e6b0dbd3a3.tar.gz blackbird-op-linux-5b93049337301d6fbd3cf55db99b34e6b0dbd3a3.zip |
x86 vDSO: generate vdso-syms.lds
This patch adds a new way of extracting symbols from the built vDSO image.
This is much simpler and less fragile than using ld -R; it removes the
need to control the DSO layout quite so exactly. I was clearly unduly
distracted by clever ld uses when I did the original vDSO implementation.
Signed-off-by: Roland McGrath <roland@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/vdso/Makefile | 14 | ||||
-rw-r--r-- | arch/x86/vdso/vdso.lds.S | 10 |
2 files changed, 24 insertions, 0 deletions
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index e7bff0fbac23..d8200adae9fa 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile @@ -55,6 +55,20 @@ SYSCFLAGS_vdso-syms.o = -r -d $(obj)/vdso-syms.o: $(src)/vdso.lds $(vobjs) FORCE $(call if_changed,syscall) +targets += vdso-syms.lds +obj-y += vdso-syms.lds + +# +# Match symbols in the DSO that look like VDSO*; produce a file of constants. +# +sed-vdsosym := -e 's/^00*/0/' \ + -e 's/^\([0-9a-fA-F]*\) . \(VDSO[a-zA-Z0-9_]*\)$$/\2 = 0x\1;/p' +quiet_cmd_vdsosym = VDSOSYM $@ + cmd_vdsosym = $(NM) $< | sed -n $(sed-vdsosym) | LC_ALL=C sort > $@ + +$(obj)/%-syms.lds: $(obj)/%.so.dbg FORCE + $(call if_changed,vdsosym) + quiet_cmd_vdso_install = INSTALL $@ cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@ vdso.so: diff --git a/arch/x86/vdso/vdso.lds.S b/arch/x86/vdso/vdso.lds.S index 667d3245d972..d40d0e906190 100644 --- a/arch/x86/vdso/vdso.lds.S +++ b/arch/x86/vdso/vdso.lds.S @@ -8,6 +8,16 @@ #define VDSO_PRELINK 0xffffffffff700000 +/* + * Symbols we define here called VDSO* get their values into vdso-syms.lds + * and become visible to the kernel itself. + */ +VDSO64_PRELINK = VDSO_PRELINK; + +#define VEXTERN(x) VDSO64_ ## x = vdso_ ## x; +#include "vextern.h" +#undef VEXTERN + SECTIONS { . = VDSO_PRELINK + SIZEOF_HEADERS; |