bug-binutils
[Top][All Lists]
Advanced

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

[Bug ld/24786] New: assign wrong lma if first section in overlay is empt


From: zyfwong at 163 dot com
Subject: [Bug ld/24786] New: assign wrong lma if first section in overlay is empty input section
Date: Mon, 08 Jul 2019 09:38:30 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=24786

            Bug ID: 24786
           Summary: assign wrong lma if first section in overlay is empty
                    input section
           Product: binutils
           Version: unspecified
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: zyfwong at 163 dot com
  Target Milestone: ---

When using OVERLAY with first input section empty, the lma will be wrong.

For example:

we have a file `start.S`, which has section `.content`, but not `.noexists`.

$ cat start.S
        .text
        .global _start

_start:
        .long __load_start_over_content

.section .content, "ax"
        .space 0x4

$ gcc -c start.S -o start.o

$ cat over1.ld && ld -Tover1.ld start.o -o s1.elf
ENTRY(_start)

SECTIONS
{
        .text : { *(.text) }

        OVERLAY : NOCROSSREFS AT(0x400000) SUBALIGN(4)
        {
                .over_empty   { *(.noexists) }
                .over_content { *(.content) }
        }

}

$ cat over2.ld && ld -Tover2.ld start.o -o s2.elf
ENTRY(_start)

SECTIONS
{

        .text : { *(.text) }

        OVERLAY : NOCROSSREFS AT(0x400000) SUBALIGN(4)
        {
                .over_content { *(.content) }
                .over_empty   { *(.noexists) }
        }
}

$ nm s1.elf && nm s2.elf
0000000000000004 A __load_start_over_content  <-- wrong lma in s1.elf
0000000000000000 T _start
0000000000400000 A __load_start_over_content  <-- correct lma in s2.elf
0000000000000000 T _start

if we place `.noexists` before `.content` in OVERLAY, we will get wrong lma.

it seems like when call `lang_size_sections_1`,
when a section is ignored, it will early break, so the `r->last_os` is 
not set correctly, and make the following sections using a wrong last_os.

after I check the document of linker script about usage of OVERLAY,
it seems like we should modify `lang_leave_overlay` and set the
`os->load_base`.

like:

      /* The first section has the load address specified in the
         OVERLAY statement.  The rest are worked out from that.
         The base address is not needed (and should be null) if
         an LMA region was specified.  */
      if (l->next == 0)
        {
          l->os->load_base = lma_expr;
          l->os->sectype = normal_section;
        }

      /* we should add these */
      else if (lma_region == NULL)
        {
          l->os->load_base = exp_binop('+',
            exp_nameop (LOADADDR, l->next->os->name),
            exp_nameop (SIZEOF, l->next->os->name));
        }

but I'm not sure.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

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