qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Could configure generate QEMU's linker scripts?


From: Claudio Fontana
Subject: Re: [Qemu-devel] Could configure generate QEMU's linker scripts?
Date: Tue, 4 Jun 2013 17:55:37 +0200
User-agent: Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20130509 Thunderbird/17.0.6

On 03.06.2013 16:57, Peter Maydell wrote:
> On 3 June 2013 15:23, Richard Henderson <address@hidden> wrote:
>> On 06/02/2013 10:15 AM, Peter Maydell wrote:
>>> So for a new architecture how do we determine whether we need
>>> to fiddle with the start address or not? (More specifically,
>>> is aarch64 going to need a linker script or just to go in the
>>> configure list of "hosts which don't need one" ?)
>>
>> Basically, for a non-PIE build, is there room to run the
>> -linux-user guest binary?  That means getting out of the
>> way of the guest's default link location.  If the host
>> default link location is above 2G you may be good; above
>> 4G is even better.
> 
> Well, the output of ld --verbose says:
> 
>   PROVIDE (__executable_start = SEGMENT_START("text-segment",
> 0x400000)); . = SEGMENT_START("text-segment", 0x400000) +
> SIZEOF_HEADERS;
> 
> and objdump of a random aarch64 binary suggests the
> text segment defaults to a vaddr of 0x400000, so I guess
> that means we need to change the start address.
> 
> thanks
> -- PMM
> 

I'm trying to get this to run, in order to be able to test the aarch64 TCG User 
mode support I have under development.

I wrote an aarch64.ld script based on the sections of other binaries, using a 
high address (0x0600000000). Before I tried what seemed to be the standard 
number for non-x86(0x0060000000), with the same results.

The program actually runs (I can qemu-x86-64 --help, for example),
but I get in trouble with the bss, in the sense that I get a sigfault at 
runtime as soon as the QEMU code tries to initialize the TCG Context (tcg_ctx, 
residing in bss) with memset, during tcg_context_init():

qemu-x86_64[418]: unhandled level 3 translation fault (11) at 0x602187000, esr 
0x92000047
pgd = ffffffc01aef8000
[602187000] *pgd=000000009ae52003, *pmd=000000009aef9003, *pte=0000000000000000

Pid: 418, comm:          qemu-x86_64
CPU: 0    Not tainted  (3.8.0-rc6+ #3)
PC is at 0x7fb7d0b2f0
LR is at 0x6000c0494
pc : [<0000007fb7d0b2f0>] lr : [<00000006000c0494>] pstate: 20000000
sp : 0000007ffffff480
x29: 0000007ffffff480 x28: 0000000000000000 
x27: 0000000000000000 x26: 0000000000000000 
x25: 0000000000000000 x24: 0000000000000000 
x23: 0000000000000000 x22: 0000000000000000 
x21: 00000006000073e8 x20: 0000000000000000 
x19: 0000000000000000 x18: 0000007fffffe250 
x17: 0000007fb7d0b2a8 x16: 000000060011fd70 
x15: 0016fcc9b4000000 x14: 0000000000000008 
x13: 00000003e8000000 x12: 0000000000000000 
x11: 0000000000000000 x10: 0000007fb7c92ba8 
x9 : 0000000600006424 x8 : 0000000000000038 
x7 : 0000000000001569 x6 : 000000000000002b 
x5 : 0000000000000000 x4 : 0000000602132080 
x3 : 0000000602187000 x2 : 0000000000055a60 
x1 : 0000000000000000 x0 : 0000000602132080 

Program received signal SIGSEGV, Segmentation fault.
__GI_memset (dstpp=0x602132080 <tcg_ctx>, c=0, len=350816) at memset.c:56
56                ((op_t *) dstp)[0] = cccc;
(gdb) bt
#0  __GI_memset (dstpp=0x602132080 <tcg_ctx>, c=0, len=350816) at memset.c:56
#1  0x00000006000c0494 in tcg_context_init (s=0x602132080 <tcg_ctx>)
    at /home/claudio/git/qemu-really-new/tcg/tcg.c:236
#2  0x00000006000c6988 in cpu_gen_init ()
    at /home/claudio/git/qemu-really-new/translate-all.c:130
#3  0x00000006000c7194 in tcg_exec_init (tb_size=0)
    at /home/claudio/git/qemu-really-new/translate-all.c:592
#4  0x000000060004b9cc in main (argc=2, argv=0x7ffffffdb8, envp=0x7ffffffdd0)
    at /home/claudio/git/qemu-really-new/linux-user/main.c:3624

----

This is the aarch64.ld script I am using. The problem is probably here,
since I wrote it without fully understanding it.
Can someone save the day?

----

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", 
"elf64-littleaarch64");
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  . = 0x600000000 + SIZEOF_HEADERS;
  .interp         : { *(.interp) }
  .hash           : { *(.hash) }
  .dynsym         : { *(.dynsym) }
  .dynstr         : { *(.dynstr)        }
  .gnu.version    : { *(.gnu.version) }
  .gnu.version_r  : { *(.gnu.version_r) }
  .gnu.version_d  : { *(.gnu.version_d) }

  .rel.dyn        : {
    *(.rel.dyn)
    *(.rel.init)
    *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
    *(.rel.fini)
    *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
    *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
    *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
    *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
    *(.rel.ctors)
    *(.rel.dtors)
    *(.rel.got)
    *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
  }

  .rel.plt        : {
    *(.rel.plt)
    PROVIDE (__rel_iplt_start = .);
    *(.rel.iplt)
    PROVIDE (__rel_iplt_end = .);
  }

  .rela.dyn       : {
    *(.rela.dyn)
    *(.rela.init)
    *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
    *(.rela.fini)
    *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
    *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
    *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
    *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
    *(.rela.ctors)
    *(.rela.dtors)
    *(.rela.got)
    *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
  }

  .rela.plt       : {
    *(.rela.plt)
    PROVIDE (__rela_iplt_start = .);
    *(.rela.iplt)
    PROVIDE (__rela_iplt_end = .);
  }

  .init           : { *(.init) } = 0x600000000
  .plt            : { *(.plt) }
  .text           : {
    *(.text)
    *(.gnu.warning)
    *(.gnu.linkonce.t*)
  } = 0x600000000
  _etext = .;
  PROVIDE (etext = .);

  .fini           : { *(.fini)    } = 0x600000000
  .rodata         : { *(.rodata) *(.gnu.linkonce.r*) }

   __exidx_start = .;
  .ARM.exidx      : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
   __exidx_end = .;
  .ARM.extab      : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
  .ARM.attributes : { *(.ARM.attributes* .gnu.linkonce.armattributes.*) }

  .eh_frame       : { KEEP (*(.eh_frame)) }

  . = ALIGN(64 / 8);

  .preinit_array :
  {
    PROVIDE (__preinit_array_start = .);
    KEEP (*(.preinit_array))
    PROVIDE (__preinit_array_end = .);
  }
  .init_array    :
  {
     PROVIDE (__init_array_start = .);
     KEEP (*(SORT(.init_array.*)))
     KEEP (*(.init_array))
     PROVIDE (__init_array_end = .);
  }
  .fini_array    :
  {
    PROVIDE (__fini_array_start = .);
    KEEP (*(.fini_array))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE (__fini_array_end = .);
  }

  .jcr           : { KEEP (*(.jcr)) }
  .dynamic       : { *(.dynamic) }
  .got           : { *(.got) }
  .got.plt       : { *(.got.plt) }
  .data          : {
    *(.gen_code .data .data.* .gnu.linkonce.d*)
    SORT(CONSTRUCTORS)
  }

  . = ALIGN(64 / 8);
  __bss_start = .;
  .bss           : {
    *(.dynbss)
    *(.bss .bss.* .gnu.linkonce.b.*)
    *(COMMON)
    /* Align here to ensure that the .bss section occupies space up to
       _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections. */
    . = ALIGN(64 / 8);
  }
  _end = .;
  PROVIDE (end = .);

  /* Stabs debugging sections.  */
  .stab 0          : { *(.stab) }
  .stabstr 0       : { *(.stabstr) }
  .stab.excl 0     : { *(.stab.excl) }
  .stab.exclstr 0  : { *(.stab.exclstr) }
  .stab.index 0    : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment 0       : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.  */
  /* DWARF 1 */
  .debug 0           : { *(.debug) }
  .line 0            : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo 0   : { *(.debug_srcinfo) }
  .debug_sfnames 0   : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges 0   : { *(.debug_aranges) }
  .debug_pubnames 0  : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info 0      : { *(.debug_info) }
  .debug_abbrev 0    : { *(.debug_abbrev) }
  .debug_line 0      : { *(.debug_line) }
  .debug_frame 0     : { *(.debug_frame) }
  .debug_str 0       : { *(.debug_str) }
  .debug_loc 0       : { *(.debug_loc) }
  .debug_macinfo 0   : { *(.debug_macinfo) }
  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
  .debug_ranges 0    : { *(.debug_ranges) }

  .note.gnu.build-id : { *(.note.gnu.build-id) }

  /* These must appear regardless of  .  */
  /DISCARD/ : { *(.note.GNU-stack) *(.note.ABI-tag) }
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]