summary refs log tree commit diff stats
path: root/linux-user/main.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-08 13:56:19 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2007-11-08 13:56:19 +0000
commit46027c07de45d84441b40cc2db675efd29588af0 (patch)
tree84c4e4a5d053508e8cbfce513d98d202d46673ed /linux-user/main.c
parenta049de6161feb4d62bdd962401d3e35ebf4331dc (diff)
downloadfocaccia-qemu-46027c07de45d84441b40cc2db675efd29588af0.tar.gz
focaccia-qemu-46027c07de45d84441b40cc2db675efd29588af0.zip
added -cpu option for x86 - fixed glibc hack in case the global variables are moved
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3548 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'linux-user/main.c')
-rw-r--r--linux-user/main.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/linux-user/main.c b/linux-user/main.c
index 6fe51107c2..f80000f2f5 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -45,12 +45,20 @@ const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
 /* for recent libc, we add these dummy symbols which are not declared
    when generating a linked object (bug in ld ?) */
 #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(CONFIG_STATIC)
-long __preinit_array_start[0];
-long __preinit_array_end[0];
-long __init_array_start[0];
-long __init_array_end[0];
-long __fini_array_start[0];
-long __fini_array_end[0];
+asm(".globl __preinit_array_start\n"
+    ".globl __preinit_array_end\n"
+    ".globl __init_array_start\n"
+    ".globl __init_array_end\n"
+    ".globl __fini_array_start\n"
+    ".globl __fini_array_end\n"
+    ".section \".rodata\"\n"
+    "__preinit_array_start:\n"
+    "__preinit_array_end:\n"
+    "__init_array_start:\n"
+    "__init_array_end:\n"
+    "__fini_array_start:\n"
+    "__fini_array_end:\n"
+    ".long 0\n");
 #endif
 
 /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
@@ -1975,6 +1983,23 @@ int main(int argc, char **argv)
     /* Scan interp_prefix dir for replacement files. */
     init_paths(interp_prefix);
 
+#if defined(TARGET_I386)
+    /* must be done before cpu_init() for x86 XXX: suppress this hack
+       by adding a new parameter to cpu_init and by suppressing
+       cpu_xxx_register() */
+    if (cpu_model == NULL) {
+#ifdef TARGET_X86_64
+        cpu_model = "qemu64";
+#else
+        cpu_model = "qemu32";
+#endif
+    }
+    if (x86_find_cpu_by_name(cpu_model)) {
+        fprintf(stderr, "Unable to find x86 CPU definition\n");
+        exit(1);
+    }
+#endif
+
     /* NOTE: we need to init the CPU at this stage to get
        qemu_host_page_size */
     env = cpu_init();