ELF: document some de-facto PT_* ABI quirks

Message ID 2acb586c-08a9-42d9-a41e-7986cc1383ea@p183
State New
Headers
Series ELF: document some de-facto PT_* ABI quirks |

Commit Message

Alexey Dobriyan March 14, 2023, 5:02 p.m. UTC
  Turns out rules about PT_INTERP, PT_GNU_STACK and PT_GNU_PROPERTY
segment headers are slightly different.

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---

 Documentation/ELF/ELF.rst |   28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

new file mode 100644
  

Comments

Randy Dunlap March 15, 2023, 2:34 a.m. UTC | #1
Hi,

[adding linux-doc for other interested parties]


On 3/14/23 10:02, Alexey Dobriyan wrote:
> Turns out rules about PT_INTERP, PT_GNU_STACK and PT_GNU_PROPERTY
> segment headers are slightly different.
> 
> Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
> ---
> 
>  Documentation/ELF/ELF.rst |   28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
> 
> new file mode 100644
> --- /dev/null
> +++ b/Documentation/ELF/ELF.rst
> @@ -0,0 +1,28 @@
> +.. SPDX-License-Identifier: GPL-2.0

According to Documentation/doc-guide/sphinx.rst, "=" underlines are used
for chapters (by convention).

And could the document have a title, like:

=========================
ELF header usage in Linux
=========================

(I just made that up. Feel free to change it. :)

Also, the .rst file should be added to some chapter in the current
documentation tree, such as under "Other documentation", so add this file name
to Documentation/staging/index.rst. In fact this file could live in
Documentation/staging instead of in Documentation/ELF/ (IMO of course).


> +
> +Definitions
> +===========
> +
> +"First" program header is the one with the smallest offset in the file:
> +e_phoff. "Last" program header is the one with the biggest offset:
> +e_phoff + (e_phnum - 1) * sizeof(Elf_Phdr).
> +
> +PT_INTERP
> +=========
> +
> +First PT_INTERP program header is used to locate the filename of ELF
> +interpreter. Other PT_INTERP headers are ignored (since Linux 2.4.11).
> +
> +PT_GNU_STACK
> +============
> +
> +Last PT_GNU_STACK program header defines userspace stack executability
> +(since Linux 2.6.6). Other PT_GNU_STACK headers are ignored.
> +
> +PT_GNU_PROPERTY
> +===============
> +
> +ELF interpreter's last PT_GNU_PROPERTY program header is used (since
> +Linux 5.8). If interpreter doesn't have one, then the last PT_GNU_PROPERTY
> +program header of an executable is used. Other PT_GNU_PROPERTY headers
> +are ignored.

Thanks.
  
Bagas Sanjaya March 17, 2023, 8:22 a.m. UTC | #2
On Tue, Mar 14, 2023 at 07:34:11PM -0700, Randy Dunlap wrote:
> Hi,
> 
> [adding linux-doc for other interested parties]

Unfortunately akpm had already applied this doc as 60b38b7cbb295d ("ELF:
document some de-facto PT_* ABI quirks") while it being reviewed and
doesn't have any consensus yet.

> And could the document have a title, like:
> 
> =========================
> ELF header usage in Linux
> =========================

The current doc path is Documentation/ELF/ELF.rst, which means that
readers expect to find general info about the executable format, not
some sort of trivia/niche like this.

> 
> (I just made that up. Feel free to change it. :)
> 
> Also, the .rst file should be added to some chapter in the current
> documentation tree, such as under "Other documentation", so add this file name
> to Documentation/staging/index.rst. In fact this file could live in
> Documentation/staging instead of in Documentation/ELF/ (IMO of course).

If there are more ELF docs there then a separate directory may be
warranted.

Thanks.
  
Alexey Dobriyan March 17, 2023, 4:53 p.m. UTC | #3
On Fri, Mar 17, 2023 at 03:22:28PM +0700, Bagas Sanjaya wrote:
> On Tue, Mar 14, 2023 at 07:34:11PM -0700, Randy Dunlap wrote:
> > Hi,
> > 
> > [adding linux-doc for other interested parties]
> 
> Unfortunately akpm had already applied this doc as 60b38b7cbb295d ("ELF:
> document some de-facto PT_* ABI quirks") while it being reviewed and
> doesn't have any consensus yet.
> 
> > And could the document have a title, like:
> > 
> > =========================
> > ELF header usage in Linux
> > =========================
> 
> The current doc path is Documentation/ELF/ELF.rst, which means that
> readers expect to find general info about the executable format, not
> some sort of trivia/niche like this.

General info is in ELF spec. This document is intended to be Linux
specific stuff you won't find anywhere but source.

I'll write down overmapping rules as well.

> > (I just made that up. Feel free to change it. :)
> > 
> > Also, the .rst file should be added to some chapter in the current
> > documentation tree, such as under "Other documentation", so add this file name
> > to Documentation/staging/index.rst. In fact this file could live in
> > Documentation/staging instead of in Documentation/ELF/ (IMO of course).
> 
> If there are more ELF docs there then a separate directory may be
> warranted.

This is codification of what Linux has been doing for years:
e.g pre 2.4.11 executables with multiple PT_INTERP segments were
rejected.
  
Bagas Sanjaya March 19, 2023, 12:52 p.m. UTC | #4
On 3/17/23 23:53, Alexey Dobriyan wrote:
>> The current doc path is Documentation/ELF/ELF.rst, which means that
>> readers expect to find general info about the executable format, not
>> some sort of trivia/niche like this.
> 
> General info is in ELF spec. This document is intended to be Linux
> specific stuff you won't find anywhere but source.
> 
> I'll write down overmapping rules as well.

In the same Documentation/ELF/ELF.rst?

And thus, the doc title should be "Linux-specific ELF notes", right?
  

Patch

--- /dev/null
+++ b/Documentation/ELF/ELF.rst
@@ -0,0 +1,28 @@ 
+.. SPDX-License-Identifier: GPL-2.0
+
+Definitions
+===========
+
+"First" program header is the one with the smallest offset in the file:
+e_phoff. "Last" program header is the one with the biggest offset:
+e_phoff + (e_phnum - 1) * sizeof(Elf_Phdr).
+
+PT_INTERP
+=========
+
+First PT_INTERP program header is used to locate the filename of ELF
+interpreter. Other PT_INTERP headers are ignored (since Linux 2.4.11).
+
+PT_GNU_STACK
+============
+
+Last PT_GNU_STACK program header defines userspace stack executability
+(since Linux 2.6.6). Other PT_GNU_STACK headers are ignored.
+
+PT_GNU_PROPERTY
+===============
+
+ELF interpreter's last PT_GNU_PROPERTY program header is used (since
+Linux 5.8). If interpreter doesn't have one, then the last PT_GNU_PROPERTY
+program header of an executable is used. Other PT_GNU_PROPERTY headers
+are ignored.