724a14a256
Update to rc4 of v2.9.0. Also includes a few other fixes, and a number of tweaks to the spec files. I'd be happy to answer any questions about all those spec file changes, I believe they were all in the direction of a more correct and maintainable spec file. Since this is still in rc phase, let's keep it in devel project. Final release should appear in time for Beta2 of SLE12SP3. Delta from previous: Added Alex's patch for keyboard empty event. OBS-URL: https://build.opensuse.org/request/show/487699 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=334
143 lines
4.4 KiB
Diff
143 lines
4.4 KiB
Diff
From 87ff6f499e7dbfa9f059703bcebf4a09d1c65578 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Fri, 30 Sep 2011 19:40:36 +0200
|
|
Subject: [PATCH] linux-user: add binfmt wrapper for argv[0] handling
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
When using qemu's linux-user binaries through binfmt, argv[0] gets lost
|
|
along the execution because qemu only gets passed in the full file name
|
|
to the executable while argv[0] can be something completely different.
|
|
|
|
This breaks in some subtile situations, such as the grep and make test
|
|
suites.
|
|
|
|
This patch adds a wrapper binary called qemu-$TARGET-binfmt that can be
|
|
used with binfmt's P flag which passes the full path _and_ argv[0] to
|
|
the binfmt handler.
|
|
|
|
The binary would be smart enough to be versatile and only exist in the
|
|
system once, creating the qemu binary path names from its own argv[0].
|
|
However, this seemed like it didn't fit the make system too well, so
|
|
we're currently creating a new binary for each target archictecture.
|
|
|
|
CC: Reinhard Max <max@suse.de>
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
[AF: Rebased onto new Makefile infrastructure, twice]
|
|
[AF: Updated for aarch64 for v2.0.0-rc1]
|
|
[AF: Rebased onto Makefile changes for v2.1.0-rc0]
|
|
[AF: Rebased onto script rewrite for v2.7.0-rc2 - to be fixed]
|
|
Signed-off-by: Andreas Färber <afaerber@suse.de>
|
|
---
|
|
Makefile.target | 13 +++++++++++++
|
|
linux-user/Makefile.objs | 2 ++
|
|
linux-user/binfmt.c | 42 ++++++++++++++++++++++++++++++++++++++++++
|
|
3 files changed, 57 insertions(+)
|
|
create mode 100644 linux-user/binfmt.c
|
|
|
|
diff --git a/Makefile.target b/Makefile.target
|
|
index 7df2b8c149..85ae084545 100644
|
|
--- a/Makefile.target
|
|
+++ b/Makefile.target
|
|
@@ -36,6 +36,10 @@ endif
|
|
PROGS=$(QEMU_PROG) $(QEMU_PROGW)
|
|
STPFILES=
|
|
|
|
+ifdef CONFIG_LINUX_USER
|
|
+PROGS+=$(QEMU_PROG)-binfmt
|
|
+endif
|
|
+
|
|
config-target.h: config-target.h-timestamp
|
|
config-target.h-timestamp: config-target.mak
|
|
|
|
@@ -121,6 +125,8 @@ QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) \
|
|
obj-y += linux-user/
|
|
obj-y += gdbstub.o thunk.o user-exec.o user-exec-stub.o
|
|
|
|
+obj-binfmt-y += linux-user/
|
|
+
|
|
endif #CONFIG_LINUX_USER
|
|
|
|
#########################################################
|
|
@@ -169,7 +175,11 @@ endif # CONFIG_SOFTMMU
|
|
# Workaround for http://gcc.gnu.org/PR55489, see configure.
|
|
%/translate.o: QEMU_CFLAGS += $(TRANSLATE_OPT_CFLAGS)
|
|
|
|
+ifdef CONFIG_LINUX_USER
|
|
+dummy := $(call unnest-vars,,obj-y obj-binfmt-y)
|
|
+else
|
|
dummy := $(call unnest-vars,,obj-y)
|
|
+endif
|
|
all-obj-y := $(obj-y)
|
|
|
|
target-obj-y :=
|
|
@@ -211,6 +221,9 @@ ifdef CONFIG_DARWIN
|
|
$(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@")
|
|
endif
|
|
|
|
+$(QEMU_PROG)-binfmt: $(obj-binfmt-y)
|
|
+ $(call LINK,$^)
|
|
+
|
|
gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh
|
|
$(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES),"GEN","$(TARGET_DIR)$@")
|
|
|
|
diff --git a/linux-user/Makefile.objs b/linux-user/Makefile.objs
|
|
index 8c93058100..607ca2dc92 100644
|
|
--- a/linux-user/Makefile.objs
|
|
+++ b/linux-user/Makefile.objs
|
|
@@ -6,3 +6,5 @@ obj-$(TARGET_HAS_BFLT) += flatload.o
|
|
obj-$(TARGET_I386) += vm86.o
|
|
obj-$(TARGET_ARM) += arm/nwfpe/
|
|
obj-$(TARGET_M68K) += m68k-sim.o
|
|
+
|
|
+obj-binfmt-y = binfmt.o
|
|
diff --git a/linux-user/binfmt.c b/linux-user/binfmt.c
|
|
new file mode 100644
|
|
index 0000000000..cd1f513b33
|
|
--- /dev/null
|
|
+++ b/linux-user/binfmt.c
|
|
@@ -0,0 +1,42 @@
|
|
+#include <stdio.h>
|
|
+#include <stdarg.h>
|
|
+#include <unistd.h>
|
|
+#include <libgen.h>
|
|
+#include <string.h>
|
|
+#include <stdlib.h>
|
|
+
|
|
+
|
|
+int main(int argc, char **argv, char **envp)
|
|
+{
|
|
+ char *binfmt;
|
|
+ char **new_argv;
|
|
+
|
|
+ /*
|
|
+ * Check if our file name ends with -binfmt
|
|
+ */
|
|
+ binfmt = argv[0] + strlen(argv[0]) - strlen("-binfmt");
|
|
+ if (strcmp(binfmt, "-binfmt")) {
|
|
+ fprintf(stderr, "%s: Invalid executable name\n", argv[0]);
|
|
+ exit(1);
|
|
+ }
|
|
+ if (argc < 3) {
|
|
+ fprintf(stderr, "%s: Please use me through binfmt with P flag\n",
|
|
+ argv[0]);
|
|
+ exit(1);
|
|
+ }
|
|
+
|
|
+ binfmt[0] = '\0';
|
|
+ /* Now argv[0] is the real qemu binary name */
|
|
+
|
|
+ new_argv = (char **)malloc((argc + 2) * sizeof(*new_argv));
|
|
+ if (argc > 3) {
|
|
+ memcpy(&new_argv[4], &argv[3], (argc - 3) * sizeof(*new_argv));
|
|
+ }
|
|
+ new_argv[0] = argv[0];
|
|
+ new_argv[1] = (char *)"-0";
|
|
+ new_argv[2] = argv[2];
|
|
+ new_argv[3] = argv[1];
|
|
+ new_argv[argc + 1] = NULL;
|
|
+
|
|
+ return execve(new_argv[0], new_argv, envp);
|
|
+}
|