Commit 46027c07de45d84441b40cc2db675efd29588af0
1 parent
a049de61
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
Showing
1 changed file
with
31 additions
and
6 deletions
linux-user/main.c
| ... | ... | @@ -45,12 +45,20 @@ const char interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2"; |
| 45 | 45 | /* for recent libc, we add these dummy symbols which are not declared |
| 46 | 46 | when generating a linked object (bug in ld ?) */ |
| 47 | 47 | #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(CONFIG_STATIC) |
| 48 | -long __preinit_array_start[0]; | |
| 49 | -long __preinit_array_end[0]; | |
| 50 | -long __init_array_start[0]; | |
| 51 | -long __init_array_end[0]; | |
| 52 | -long __fini_array_start[0]; | |
| 53 | -long __fini_array_end[0]; | |
| 48 | +asm(".globl __preinit_array_start\n" | |
| 49 | + ".globl __preinit_array_end\n" | |
| 50 | + ".globl __init_array_start\n" | |
| 51 | + ".globl __init_array_end\n" | |
| 52 | + ".globl __fini_array_start\n" | |
| 53 | + ".globl __fini_array_end\n" | |
| 54 | + ".section \".rodata\"\n" | |
| 55 | + "__preinit_array_start:\n" | |
| 56 | + "__preinit_array_end:\n" | |
| 57 | + "__init_array_start:\n" | |
| 58 | + "__init_array_end:\n" | |
| 59 | + "__fini_array_start:\n" | |
| 60 | + "__fini_array_end:\n" | |
| 61 | + ".long 0\n"); | |
| 54 | 62 | #endif |
| 55 | 63 | |
| 56 | 64 | /* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so |
| ... | ... | @@ -1975,6 +1983,23 @@ int main(int argc, char **argv) |
| 1975 | 1983 | /* Scan interp_prefix dir for replacement files. */ |
| 1976 | 1984 | init_paths(interp_prefix); |
| 1977 | 1985 | |
| 1986 | +#if defined(TARGET_I386) | |
| 1987 | + /* must be done before cpu_init() for x86 XXX: suppress this hack | |
| 1988 | + by adding a new parameter to cpu_init and by suppressing | |
| 1989 | + cpu_xxx_register() */ | |
| 1990 | + if (cpu_model == NULL) { | |
| 1991 | +#ifdef TARGET_X86_64 | |
| 1992 | + cpu_model = "qemu64"; | |
| 1993 | +#else | |
| 1994 | + cpu_model = "qemu32"; | |
| 1995 | +#endif | |
| 1996 | + } | |
| 1997 | + if (x86_find_cpu_by_name(cpu_model)) { | |
| 1998 | + fprintf(stderr, "Unable to find x86 CPU definition\n"); | |
| 1999 | + exit(1); | |
| 2000 | + } | |
| 2001 | +#endif | |
| 2002 | + | |
| 1978 | 2003 | /* NOTE: we need to init the CPU at this stage to get |
| 1979 | 2004 | qemu_host_page_size */ |
| 1980 | 2005 | env = cpu_init(); | ... | ... |