Skip to content

Commit cdc979d

Browse files
dmatlackbonzini
authored andcommitted
KVM: selftests: Link selftests directly with lib object files
The linker does obey strong/weak symbols when linking static libraries, it simply resolves an undefined symbol to the first-encountered symbol. This means that defining __weak arch-generic functions and then defining arch-specific strong functions to override them in libkvm will not always work. More specifically, if we have: lib/generic.c: void __weak foo(void) { pr_info("weak\n"); } void bar(void) { foo(); } lib/x86_64/arch.c: void foo(void) { pr_info("strong\n"); } And a selftest that calls bar(), it will print "weak". Now if you make generic.o explicitly depend on arch.o (e.g. add function to arch.c that is called directly from generic.c) it will print "strong". In other words, it seems that the linker is free to throw out arch.o when linking because generic.o does not explicitly depend on it, which causes the linker to lose the strong symbol. One solution is to link libkvm.a with --whole-archive so that the linker doesn't throw away object files it thinks are unnecessary. However that is a bit difficult to plumb since we are using the common selftests makefile rules. An easier solution is to drop libkvm.a just link selftests with all the .o files that were originally in libkvm.a. Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: David Matlack <dmatlack@google.com> Message-Id: <20220520233249.3776001-9-dmatlack@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent acf5773 commit cdc979d

1 file changed

Lines changed: 4 additions & 7 deletions

File tree

tools/testing/selftests/kvm/Makefile

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,13 @@ LDFLAGS += -pthread $(no-pie-option) $(pgste-option)
173173
# $(TEST_GEN_PROGS) starts with $(OUTPUT)/
174174
include ../lib.mk
175175

176-
STATIC_LIBS := $(OUTPUT)/libkvm.a
177176
LIBKVM_C := $(filter %.c,$(LIBKVM))
178177
LIBKVM_S := $(filter %.S,$(LIBKVM))
179178
LIBKVM_C_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C))
180179
LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S))
181-
EXTRA_CLEAN += $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(STATIC_LIBS) cscope.*
180+
LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)
181+
182+
EXTRA_CLEAN += $(LIBKVM_OBJS) cscope.*
182183

183184
x := $(shell mkdir -p $(sort $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ))))
184185
$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c
@@ -187,12 +188,8 @@ $(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c
187188
$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S
188189
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
189190

190-
LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)
191-
$(OUTPUT)/libkvm.a: $(LIBKVM_OBJS)
192-
$(AR) crs $@ $^
193-
194191
x := $(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS))))
195-
$(TEST_GEN_PROGS): $(STATIC_LIBS)
192+
$(TEST_GEN_PROGS): $(LIBKVM_OBJS)
196193

197194
cscope: include_paths = $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include lib ..
198195
cscope:

0 commit comments

Comments
 (0)