[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Ping: [PATCH] build: provide option to disambiguate symbol names
On 24.10.2019 15:31, Jan Beulich wrote: > The .file assembler directives generated by the compiler do not include > any path components (gcc) or just the ones specified on the command line > (clang, at least version 5), and hence multiple identically named source > files (in different directories) may produce identically named static > symbols (in their kallsyms representation). The binary diffing algorithm > used by xen-livepatch, however, depends on having unique symbols. > > Provide a Kconfig option to control the (build) behavior, and if enabled > use objcopy to prepend the (relative to the xen/ subdirectory) path to > the compiler invoked STT_FILE symbols. > > Conditionalize explicit .file directive insertion in C files where it > exists just to disambiguate names in a less generic manner; note that > at the same time the redundant emission of STT_FILE symbols gets > suppressed for clang. Assembler files as well as multiply compiled C > ones using __OBJECT_FILE__ are left alone for the time being. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Ping? I realize I need to re-base this now that ... > --- > Kconfig change taken from "[PATCH v3 5/7] x86/livepatch: Fail the build > if duplicate symbols exist". When re-basing onto that other patch I > think we will also want to drop that other patch'es adjustment to > allrandom.config again. ... the other patch mentioned here has gone in, but preferably I'd do so alongside incorporating other review feedback. Jan > The clang behavior may require further tweaking if different versions > behave differently. Alternatively we could pass two --redefine-sym > arguments to objcopy. > > --- a/xen/Rules.mk > +++ b/xen/Rules.mk > @@ -194,12 +194,24 @@ FORCE: > > .PHONY: clean > clean:: $(addprefix _clean_, $(subdir-all)) > - rm -f *.o *~ core $(DEPS_RM) > + rm -f *.o .*.o.tmp *~ core $(DEPS_RM) > _clean_%/: FORCE > $(MAKE) -f $(BASEDIR)/Rules.mk -C $* clean > > +SRCPATH := $(patsubst $(BASEDIR)/%,%,$(CURDIR)) > + > %.o: %.c Makefile > +ifeq ($(CONFIG_ENFORCE_UNIQUE_SYMBOLS),y) > + $(CC) $(CFLAGS) -c $< -o $(@D)/.$(@F).tmp > +ifeq ($(clang),y) > + $(OBJCOPY) --redefine-sym $<=$(SRCPATH)/$< $(@D)/.$(@F).tmp $@ > +else > + $(OBJCOPY) --redefine-sym $(<F)=$(SRCPATH)/$< $(@D)/.$(@F).tmp $@ > +endif > + rm -f $(@D)/.$(@F).tmp > +else > $(CC) $(CFLAGS) -c $< -o $@ > +endif > > %.o: %.S Makefile > $(CC) $(AFLAGS) -c $< -o $@ > --- a/xen/arch/x86/x86_64/compat.c > +++ b/xen/arch/x86/x86_64/compat.c > @@ -2,7 +2,7 @@ > * compat.c > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/hypercall.h> > #include <compat/xen.h> > --- a/xen/arch/x86/x86_64/mm.c > +++ b/xen/arch/x86/x86_64/mm.c > @@ -16,7 +16,7 @@ > * with this program; If not, see <http://www.gnu.org/licenses/>. > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/lib.h> > #include <xen/init.h> > --- a/xen/arch/x86/x86_64/physdev.c > +++ b/xen/arch/x86/x86_64/physdev.c > @@ -2,7 +2,7 @@ > * physdev.c > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/types.h> > #include <xen/guest_access.h> > --- a/xen/arch/x86/x86_64/platform_hypercall.c > +++ b/xen/arch/x86/x86_64/platform_hypercall.c > @@ -2,7 +2,7 @@ > * platform_hypercall.c > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/lib.h> > #include <compat/platform.h> > --- a/xen/common/Kconfig > +++ b/xen/common/Kconfig > @@ -338,9 +338,23 @@ config FAST_SYMBOL_LOOKUP > > If unsure, say Y. > > +config ENFORCE_UNIQUE_SYMBOLS > + bool "Enforce unique symbols" > + default LIVEPATCH > + ---help--- > + Multiple symbols with the same name aren't generally a problem > + unless Live patching is to be used. > + > + Livepatch loading involves resolving relocations against symbol > + names, and attempting to a duplicate symbol in a livepatch will > + result in incorrect livepatch application. > + > + This option should be used to ensure that a build of Xen can have a > + livepatch build and apply correctly. > + > config SUPPRESS_DUPLICATE_SYMBOL_WARNINGS > - bool "Suppress duplicate symbol warnings" if !LIVEPATCH > - default y if !LIVEPATCH > + bool "Suppress duplicate symbol warnings" > + depends on !ENFORCE_UNIQUE_SYMBOLS > ---help--- > Multiple symbols with the same name aren't generally a problem > unless Live patching is to be used, so these warnings can be > --- a/xen/common/compat/domain.c > +++ b/xen/common/compat/domain.c > @@ -3,7 +3,7 @@ > * > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/lib.h> > #include <xen/sched.h> > --- a/xen/common/compat/kernel.c > +++ b/xen/common/compat/kernel.c > @@ -2,7 +2,7 @@ > * kernel.c > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/init.h> > #include <xen/lib.h> > --- a/xen/common/compat/memory.c > +++ b/xen/common/compat/memory.c > @@ -1,4 +1,4 @@ > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/types.h> > #include <xen/hypercall.h> > --- a/xen/common/compat/multicall.c > +++ b/xen/common/compat/multicall.c > @@ -2,7 +2,7 @@ > * multicall.c > */ > > -asm(".file \"" __FILE__ "\""); > +EMIT_FILE; > > #include <xen/types.h> > #include <xen/multicall.h> > --- a/xen/include/xen/config.h > +++ b/xen/include/xen/config.h > @@ -11,7 +11,15 @@ > > #ifndef __ASSEMBLY__ > #include <xen/compiler.h> > + > +#if defined(CONFIG_ENFORCE_UNIQUE_SYMBOLS) || defined(__clang__) > +# define EMIT_FILE asm ( "" ) > +#else > +# define EMIT_FILE asm ( ".file \"" __FILE__ "\"" ) > +#endif > + > #endif > + > #include <asm/config.h> > > #define EXPORT_SYMBOL(var) > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/xen-devel > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |