build: provide option to disambiguate symbol names

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.

Make the ENFORCE_UNIQUE_SYMBOLS Kconfig option 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. Note
that this build option is made no longer depend on LIVEPATCH, but merely
defaults to its setting now.

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.

Since we now expect there not to be any duplicates anymore, also don't
force the selection of the option to 'n' anymore in allrandom.config.
Similarly COVERAGE no longer suppresses duplicate symbol warnings if
enforcement is in effect, which in turn allows
SUPPRESS_DUPLICATE_SYMBOL_WARNINGS to simply depend on
!ENFORCE_UNIQUE_SYMBOLS.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Acked-by: Wei Liu <wl@xen.org>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Tested-by: Sergey Dyasli <sergey.dyasli@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
Jan Beulich committed 2019-11-28 17:47:25 +01:00
1 parent 5655ce8b1e
commit 81ecb38b83
13 files changed
+33 -15

No files matched your search

+1 -1
View File
@@ -38,7 +38,7 @@ config FRAME_POINTER
config COVERAGE
bool "Code coverage support"
depends on !LIVEPATCH
select SUPPRESS_DUPLICATE_SYMBOL_WARNINGS
select SUPPRESS_DUPLICATE_SYMBOL_WARNINGS if !ENFORCE_UNIQUE_SYMBOLS
---help---
Enable code coverage support.
+13 -1
View File
@@ -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 $@
+1 -1
View File
@@ -2,7 +2,7 @@
* compat.c
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/hypercall.h>
#include <compat/xen.h>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -2,7 +2,7 @@
* physdev.c
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/types.h>
#include <xen/guest_access.h>
+1 -1
View File
@@ -2,7 +2,7 @@
* platform_hypercall.c
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/lib.h>
#include <compat/platform.h>
+3 -4
View File
@@ -373,8 +373,7 @@ config FAST_SYMBOL_LOOKUP
config ENFORCE_UNIQUE_SYMBOLS
bool "Enforce unique symbols"
default y
depends on LIVEPATCH
default LIVEPATCH
---help---
Multiple symbols with the same name aren't generally a problem
unless livepatching is to be used.
@@ -387,8 +386,8 @@ config ENFORCE_UNIQUE_SYMBOLS
livepatch build and apply correctly.
config SUPPRESS_DUPLICATE_SYMBOL_WARNINGS
bool "Suppress duplicate symbol warnings" if !ENFORCE_UNIQUE_SYMBOLS
default y if !ENFORCE_UNIQUE_SYMBOLS
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
+1 -1
View File
@@ -3,7 +3,7 @@
*
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/lib.h>
#include <xen/sched.h>
+1 -1
View File
@@ -2,7 +2,7 @@
* kernel.c
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/init.h>
#include <xen/lib.h>
+1 -1
View File
@@ -1,4 +1,4 @@
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/types.h>
#include <xen/hypercall.h>
+1 -1
View File
@@ -2,7 +2,7 @@
* multicall.c
*/
asm(".file \"" __FILE__ "\"");
EMIT_FILE;
#include <xen/types.h>
#include <xen/multicall.h>
+8
View File
@@ -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)
-1
View File
@@ -2,4 +2,3 @@
CONFIG_GCOV_FORMAT_AUTODETECT=y
CONFIG_UBSAN=n
CONFIG_ENFORCE_UNIQUE_SYMBOLS=n
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.