Package: kvmtool
Version: 0.20160419-1
Severity: important
Tags: sid + patch
Justification: FTBFS
User: [email protected]
Usertags: mips-patch


Package kvmtool FTBFS for mips64el with the following error:

> LINK     lkvm
> /usr/bin/ld: guest/guest_init.o: warning: linking abicalls files with 
> non-abicalls files
> /usr/bin/ld: guest/guest_init.o: linking 32-bit code with 64-bit code
> /usr/bin/ld: failed to merge target specific data of file guest/guest_init.o
> collect2: error: ld returned 1 exit status
> Makefile:381: recipe for target 'lkvm' failed
> make[1]: *** [lkvm] Error 1

Full build log:
https://buildd.debian.org/status/fetch.php?pkg=kvmtool&arch=mips64el&ver=0.20160419-1&stamp=1463209003

The reason for that is behaviour is the way of creation guest_init.o.
> ld -r -b binary -o guest/guest_init.o guest/init

Resulting file is "MIPS-I" instead of expected "MIPS64 rel2".
> file guest/guest_init.o.cp 
> guest/guest_init.o.cp: ELF 64-bit LSB relocatable, MIPS, MIPS-I version 1 
> (SYSV), not stripped

If options "-r -b binary" are used, linker will ignore flags of input file 
"Flags: 0x80000006, pic, cpic, mips64r2",
and flags of resulting guest_init.o file will be  "Flags: 0x0".

Solution for this issue could be using different method for creation 
guest_init.o.
If xxd and gcc are used instead of ld, resulting file will have regular flags.
> xxd -i guest/init | $(CC) -c -x c - -o guest/guest_init.o
Here are proposed changes for this issue.
http://www.spinics.net/lists/kvm/msg118016.html

I have created a patch that fixes this issue modeled on mentioned solution.
Using this patch I was able to build kvmtool for mips64el, mipsel, i386, amd64.
The patch is attached.

Could you please consider including this patch.

--- kvmtool-0.20160419.orig/Makefile
+++ kvmtool-0.20160419/Makefile
@@ -395,8 +395,7 @@ endif
 $(GUEST_INIT): guest/init.c
 	$(E) "  LINK    " $@
 	$(Q) $(CC) $(GUEST_INIT_FLAGS) guest/init.c -o $@
-	$(Q) $(LD) -r -b binary -o guest/guest_init.o $(GUEST_INIT)
-
+	$(Q) xxd -i $@ | $(CC) -c -x c - -o guest/guest_init.o
 %.s: %.c
 	$(Q) $(CC) -o $@ -S $(CFLAGS) -fverbose-asm $<
 
--- kvmtool-0.20160419.orig/builtin-setup.c
+++ kvmtool-0.20160419/builtin-setup.c
@@ -146,8 +146,8 @@ static int extract_file(const char *gues
 	return 0;
 }
 
-extern char _binary_guest_init_start;
-extern char _binary_guest_init_size;
+extern char guest_init;
+extern char guest_init_len;
 extern char _binary_guest_pre_init_start;
 extern char _binary_guest_pre_init_size;
 
@@ -163,8 +163,8 @@ int kvm_setup_guest_init(const char *gue
 		return err;
 #endif
 	err = extract_file(guestfs_name, "virt/init",
-				&_binary_guest_init_start,
-				&_binary_guest_init_size);
+				&guest_init,
+				&guest_init_len);
 	return err;
 }
 #else

Reply via email to