mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Fangrui Song <i@maskray.me>
To: musl@lists.openwall.com
Cc: Rich Felker <dalias@libc.org>
Subject: Re: [musl] ld-musl-* and empty .eh_frame
Date: Fri, 5 Mar 2021 17:39:02 -0800	[thread overview]
Message-ID: <20210306013902.2rec4xrbg4j5mikf@gmail.com> (raw)
In-Reply-To: <CAGw6cBsHaJez_rmGY8Gvkou4gR6bY1p7=ykKeyZkZ5UFaWuPog@mail.gmail.com>

On 2021-03-05, Michael Forney wrote:
>On 2021-03-05, Fangrui Song <i@maskray.me> wrote:
>> Can you clarify how GNU ld creates an empty .eh_frame?
>
>Sure, see the shell snippet in my original post.
>
>> The program header PT_GNU_EH_FRAME is created from .eh_frame_hdr, which
>> is created by ld --eh-frame-hdr.
>> If .eh_frame is empty, from my observation GNU ld does not create
>> .eh_frame_hdr
>
>There is no PT_GNU_EH_FRAME in the executables. Based on Rich's
>explanation earlier, my understanding is that the issue is that GNU ld
>creates a empty PT_LOAD segment for the empty .eh_frame section.
>
>I attached the output of readelf -l in case that is helpful.
>
>> https://maskray.me/blog/2020-11-08-stack-unwinding#eh_frame_hdr-and-pt_eh_frame
>>
>>>I'm not too familiar with the binutils codebase, but I can try. As far
>>>as I can tell, the alignment is set to at least the maximum page size:
>>>https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=bfd/elf.c;h=84a5d942817a9a54b1170fbbb594787c5839aa54;hb=f35674005e609660f5f45005a9e095541ca4c5fe#l5601
>>
>> max-page-size is for layouting PT_LOAD.
>> It is unrelated to PT_GNU_EH_FRAME.
>
>The empty PT_LOAD segment is the issue here, not PT_GNU_EH_FRAME.
>
>> The requirement is
>> http://www.sco.com/developers/gabi/latest/ch5.pheader.html
>> "p_vaddr should equal p_offset, modulo p_align."
>>
>> p_vaddr % p_align != 0 is valid.
>>
>> p_memsz can be zero.
>
>Are you saying that GNU ld might create PT_LOAD segments with zero
>size, and unaligned p_vaddr? If that's the case, I think Rich might
>have a valid concern here.

p_memsz==0 PT_LOAD is invalid. ld.bfd -z separate-code should not create
such PT_LOAD. But this is more of implementation convention (many libc
implementation error on this case or mmap will fail), not something
regulated by the specification.
(In LLD, we drop such PT_LOAD:
https://github.com/llvm/llvm-project/blob/main/lld/ELF/Writer.cpp#L163)

The empty .eh_frame is suspicious, though. There may be two problems:

1. Why do you have an empty .eh_frame in an object file
2. Why does ld.bfd create empty .eh_frame in that case (I have tried
   simple examples like  `.section .eh_frame,"a"` and I cannot reproduce
   the empty output .eh_frame)

If you don't share the other files, it is difficult to locate the
problem. 2. deserves a http://sourceware.org/ bug.

>
>Elf file type is EXEC (Executable file)
>Entry point 0x401020
>There are 9 program headers, starting at offset 64
>
>Program Headers:
>  Type           Offset             VirtAddr           PhysAddr
>                 FileSiz            MemSiz              Flags  Align
>  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
>                 0x00000000000001f8 0x00000000000001f8  R      0x8
>  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
>                 0x0000000000000019 0x0000000000000019  R      0x1
>      [Requesting program interpreter: /lib/ld-musl-x86_64.so.1]
>  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
>                 0x0000000000000348 0x0000000000000348  R      0x1000
>  LOAD           0x0000000000001000 0x0000000000401000 0x0000000000401000
>                 0x0000000000000060 0x0000000000000060  R E    0x1000
>  LOAD           0x0000000000002000 0x0000000000402000 0x0000000000402000
>                 0x0000000000000000 0x0000000000000000  R      0x1000
>  LOAD           0x0000000000002e90 0x0000000000402e90 0x0000000000402e90
>                 0x0000000000000190 0x0000000000000190  RW     0x1000
>  DYNAMIC        0x0000000000002e90 0x0000000000402e90 0x0000000000402e90
>                 0x0000000000000160 0x0000000000000160  RW     0x8
>  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
>                 0x0000000000000000 0x0000000000000000  RWE    0x10
>  GNU_RELRO      0x0000000000002e90 0x0000000000402e90 0x0000000000402e90
>                 0x0000000000000170 0x0000000000000170  R      0x1
>
> Section to Segment mapping:
>  Segment Sections...
>   00
>   01     .interp
>   02     .interp .gnu.hash .dynsym .dynstr .rela.dyn .rela.plt
>   03     .plt .text
>   04     .eh_frame
>   05     .dynamic .got .got.plt
>   06     .dynamic
>   07
>   08     .dynamic .got


  reply	other threads:[~2021-03-06  1:39 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-05  3:18 Michael Forney
2021-03-05 15:07 ` Rich Felker
2021-03-05 16:12   ` Rich Felker
2021-03-05 22:53     ` Michael Forney
2021-03-06  1:14       ` Fangrui Song
2021-03-06  1:28         ` Rich Felker
2021-03-06  1:30         ` Michael Forney
2021-03-06  1:39           ` Fangrui Song [this message]
2021-03-06  2:04             ` Michael Forney
2021-03-06  2:09               ` Fangrui Song

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210306013902.2rec4xrbg4j5mikf@gmail.com \
    --to=i@maskray.me \
    --cc=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).